熊猫饼图绘制多个图形的实际值

yig*_*men 3 python matplotlib pandas

我正在尝试以饼图而不是百分比打印实际值,对于一个维度系列,这有帮助:

Matplotlib 饼图:如何用绝对值替换自动标记的相对值

但是当我尝试创建多个馅饼时,它不起作用。

d = {'Yes':pd.Series([825, 56], index=["Total", "Last 2 Month"]), 'No':pd.Series([725, 73], index=["Total", "Last 2 Month"])}
df = pd.DataFrame(d)
df = df.T
def absolute_value(val):
    a  = np.round(val/100.*df.values, 0)
    return a

df.plot.pie(subplots=True, figsize=(12, 6),autopct=absolute_value)
plt.show()
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

谢谢。

Imp*_*est 6

一个hacky的解决方案是在absolute_value函数内索引数据帧,考虑到该函数被该数据帧中的每个值调用一次。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

d = {'Yes':pd.Series([825, 56], index=["Total", "Last 2 Month"]), 
     'No':pd.Series([725, 73], index=["Total", "Last 2 Month"])}
df = pd.DataFrame(d)
df = df.T

i = [0]
def absolute_value(val):
    a  = df.iloc[i[0]%len(df),i[0]//len(df)]
    i[0] += 1
    return a

df.plot.pie(subplots=True, figsize=(12, 6),autopct=absolute_value)
plt.show()
Run Code Online (Sandbox Code Playgroud)

另一种选择是通过在列上循环来单独绘制饼图。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

d = {'Yes':pd.Series([825, 56], index=["Total", "Last 2 Month"]), 
     'No':pd.Series([725, 73], index=["Total", "Last 2 Month"])}
df = pd.DataFrame(d)
df = df.T
print df.iloc[:,0].sum()

def absolute_value(val, summ):
    a  = np.round(val/100.*summ,0)
    return a

fig, axes = plt.subplots(ncols=len(df.columns))
for i,ax in enumerate(axes):
    df.iloc[:,i].plot.pie(ax=ax,autopct=lambda x: absolute_value(x,df.iloc[:,i].sum()))
plt.show()
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,输出看起来都与此类似

在此处输入图片说明