Я не уверен, как генерировать ваши данные, поэтому я просто сгенерирую что-то похожее, чтобы охватить все этапы.
# Make some data
raw_data = {'Sales2016': [10, 20, 900, 100, 50],
'Sales2015': [10, 20, 30, 100, 50],
'Month': ['Q1', 'Q2', 'Q3', 'Q4', 'Q5']}
# Generate a dataframe
df = pd.DataFrame(raw_data, columns = ['Sales2016','Sales2015', 'Month'])
После этого я буду запускать groupby (), который вообще не изменит данные. Цель этого groupby () - получить DataFrameGroupBy, который похож на тот, который задан OP.
df_sum = df.groupby(['Month']).agg('sum')
, который создает
Sales2016 Sales2015
Month
Q1 10 10
Q2 20 20
Q3 900 30
Q4 100 100
Q5 50 50
С этого момента я бы сгладил DataFrameGroupBy и индексируйте его по месяцам.
df_flatten = df_sum.reset_index().set_index('Month')
Ссылка , предоставленная steven , дает действительно хорошее представление о том, как маркировать в matplotlib. Функция pandas .DataFrame.plot.p ie оборачивает matplotlib.pyplot.p ie (), поэтому мы можем использовать некоторые методы из этой ссылки.
Сначала мы объявляем функцию для скрытия процент в целом числе. Эта функция аналогична той, что дана по этой ссылке . Я добавил в функцию round (), чтобы она не давала ложное число (например, int (889.99) = 899, но нам нужно 900)
# Covert percent and total to value
def func(pct, allvals):
absolute = int(round(pct/100*np.sum(allvals)))
return "${:.1f}".format(absolute)
Теперь мы можем построить график p ie составьте график с меткой, мы можем указать autopct, аналогичный указанному в ссылке
f, axes = plt.subplots(1,2, figsize=(10,10))
for ax, col in zip(axes, df_flatten.columns):
print(col)
df_flatten[col].plot(kind='pie', autopct=lambda pct: func(pct, df_flatten[col].tolist()), labels=df_flatten.index, ax=ax, title=col, fontsize=10)
ax.legend(loc=3)
Ваши ярлыки должны появиться.
![result](https://i.stack.imgur.com/gDFCo.jpg)