我正在绘制某些类别中各个办公室的交叉表。我想放一张水平堆叠的条形图,在其中标记每个办公室及其值。
这是一些示例代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# create dataframe
df = pd.DataFrame({'office1': [1, np.nan, np.nan],
'office2': [np.nan, 8, np.nan],
'office3': [12, np.nan, np.nan],
'office4': [np.nan, np.nan, 3],
'office5': [np.nan, 5, np.nan],
'office6': [np.nan, np.nan, 7],
'office7': [3, np.nan, np.nan],
'office8': [np.nan, np.nan, 11],
'office9': [np.nan, 6, np.nan]},
index=['catA', 'catB', 'catC'])
# plot dataframe
ax = df.plot.barh(title="Office Breakdown by Category",
legend=False,
figsize=(10,7), stacked=True)
这给了我一个很好的起点:
但是,我想拥有的是:
经过研究,我想到了以下代码,可以在“类别”轴上正确排列标签:
def annotateBars(row, ax=ax):
for col in row.index:
value = row[col]
if (str(value) != 'nan'):
ax.text(value/2, labeltonum(row.name), col+","+str(value))
def labeltonum(label):
if label == 'catA':
return 0
elif label == 'catB':
return 1
elif label == 'catC':
return 2
df.apply(annotateBars, ax=ax, axis=1)
但这不包括条的“堆积”。我还尝试了遍历plot命令返回的
patches
容器(它可以让我检索每个矩形的x&y位置),但是随后我失去了与办公室标签的任何连接。 最佳答案
弄清楚了。如果我遍历数据帧每一行的列,则可以建立我需要的标签列表,这些标签与ax.patches
中矩形的进度匹配。解决方案如下:
labels = []
for j in df.columns:
for i in df.index:
label = str(j)+": " + str(df.loc[i][j])
labels.append(label)
patches = ax.patches
for label, rect in zip(labels, patches):
width = rect.get_width()
if width > 0:
x = rect.get_x()
y = rect.get_y()
height = rect.get_height()
ax.text(x + width/2., y + height/2., label, ha='center', va='center')
将其添加到上面的代码中后,将产生:
现在只需要处理太小的条形标签。
关于python - 如何从数据框向堆叠的条形图添加自定义注释?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39279404/