1 回答

TA貢獻1820條經驗 獲得超2個贊
可以通過從 中提取條形位置來注釋條形圖
ax.patches
。補丁數據不包含與數據幀相對應的標簽,因此關聯不同的數據值集成為一個定制過程。
為了用
Value
代替進行注釋Price
,需要有一種方法來關聯相應的值。字典不起作用,因為有重復值
為 制作一個旋轉數據框
Value
和 的相應數據框Price
。這將確保相應的數據位于同一位置。
col_idx
和row_idx
將與 一起使用.iloc
來查找 中的正確值df_value
,并用它來注釋繪圖。col_idx
和row_idx
都可以在 中重置或更新if i%3 == 0
,因為有 3 個條和 3 個段,但是,如果條和段的數量不同,則需要不同的重置條件。
import pandas as pd
import matplotlib.pyplot as plt
# create the dataframe
data = {'Range':['<10','>10', '>= 20', '<10','>10', '>= 20', '<10','>10', '>= 20'],
? ? ? ? 'Price':[50,25,25,70,20,10,80,10,10],
? ? ? ? 'Value':[100,50,50,140,40,20,160,20,20]}? ??
df1 = pd.DataFrame(data)
# pivot the price data
df_price = df1.assign(idx=df1.groupby('Range').cumcount()).pivot(index='idx', columns='Range', values='Price')
Range? <10? >10? >= 20
idx? ? ? ? ? ? ? ? ? ?
0? ? ? ?50? ?25? ? ?25
1? ? ? ?70? ?20? ? ?10
2? ? ? ?80? ?10? ? ?10
# pivot the value data
df_value = df1.assign(idx=df1.groupby('Range').cumcount()).pivot(index='idx', columns='Range', values='Value')
Range? <10? >10? >= 20
idx? ? ? ? ? ? ? ? ? ?
0? ? ? 100? ?50? ? ?50
1? ? ? 140? ?40? ? ?20
2? ? ? 160? ?20? ? ?20
# set colors
colors = ['#b5ffb9', '#f9bc86', '#a3acff']
# plot the price
ax = df_price.plot.bar(stacked=True, figsize=(8, 6), color=colors, ec='w')
# label the x-axis
plt.xticks(ticks=range(3), labels=['low', 'med', 'high'], rotation=0)
# x-axis title
plt.xlabel('group')
# position the legend
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# annotate the bar segments
# col and row iloc indices for df_value
col_idx = 0
row_idx = 0
# iterate through each bar patch from ax
for i, p in enumerate(ax.patches, 1):
? ? left, bottom, width, height = p.get_bbox().bounds
? ? v = df_value.iloc[row_idx, col_idx]
? ? if width > 0:
? ? ? ? ax.annotate(f'{v:0.0f}', xy=(left+width/2, bottom+height/2), ha='center', va='center')
? ? ? ? # use this line to add commas for thousands
#? ? ? ? ax.annotate(f'{v:,}', xy=(left+width/2, bottom+height/2), ha='center', va='center')
? ??
? ? row_idx += 1
? ? if i%3 == 0:? # there are three bars, so update the indices?
? ? ? ? col_idx += 1
? ? ? ? row_idx = 0
添加回答
舉報