使用 Pandas 条形图上的值注释条形
- 2024-12-09 08:30:00
- admin 原创
- 80
问题描述:
我正在寻找一种方法来使用 DataFrame 中的四舍五入数值来注释 Pandas 条形图中的条形图。
>>> df=pd.DataFrame({'A':np.random.rand(2),'B':np.random.rand(2)},index=['value1','value2'] )
>>> df
A B
value1 0.440922 0.911800
value2 0.588242 0.797366
我想要得到这样的东西:
我尝试使用此代码示例,但注释全部以 x 刻度为中心:
>>> ax = df.plot(kind='bar')
>>> for idx, label in enumerate(list(df.index)):
for acc in df.columns:
value = np.round(df.ix[idx][acc],decimals=2)
ax.annotate(value,
(idx, value),
xytext=(0, 15),
textcoords='offset points')
解决方案 1:
您可以直接从斧头的补丁中获取它:
for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))
您需要调整字符串格式和偏移量以使内容居中,也许可以使用 的宽度p.get_width()
,但这应该可以帮助您入门。除非您在某处跟踪偏移量,否则它可能不适用于堆叠条形图。
解决方案 2:
从 matplotlib 3.4.0 开始:
Axes.bar_label
已添加一种用于自动标记条形图的新辅助方法。
对于单组条形图,提供ax.containers[0]
:
df = pd.DataFrame({'A': np.random.rand(2)}, index=['value1', 'value2'])
ax = df.plot.barh()
ax.bar_label(ax.containers[0])
对于多组条形图,迭代ax.containers
:
df = pd.DataFrame({'A': np.random.rand(2), 'B': np.random.rand(2)}, index=['value1', 'value2'])
ax = df.plot.bar()
for container in ax.containers:
ax.bar_label(container)
请参阅matplotlib 的条形标签演示,了解使用可选样式参数的综合示例:
Axes.bar_label(self, container, labels=None, *, fmt='%g', label_type='edge', padding=0, **kwargs)
解决方案 3:
解决方案还使用样本浮点格式来处理负值。
仍需要调整偏移。
df=pd.DataFrame({'A':np.random.rand(2)-1,'B':np.random.rand(2)},index=['val1','val2'] )
ax = df.plot(kind='bar', color=['r','b'])
x_offset = -0.03
y_offset = 0.02
for p in ax.patches:
b = p.get_bbox()
val = "{:+.2f}".format(b.y1 + b.y0)
ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))
解决方案 4:
斧头告诉我们盒子的大小。
x_position=##define a value
y_position=##define a value
for patch in ax.patches:
b= patch.get_bbox()
y_value=b.y1-b.y0
ax.annotate(y_value, "x_position" , "y_position"))
plt.show()
为了更清楚::
Bbox(x0=3.75,y0=0.0,x1=4.25,y1=868.0)
Bbox(x0=4.75,y0=0.0,x1=5.25,y1=868.0)
Bbox(x0=5.75,y0=0.0,x1=6.25,y1=1092.0)
Bbox(x0=6.75,y0=0.0,x1=7.25,y1=756.0)
Bbox(x0=7.75,y0=0.0,x1=8.25,y1=756.0)
Bbox(x0=8.75,y0=0.0,x1=9.25,y1=588.0)
Bbox(x0=3.75, y0=868.0, x1=4.25
, y1=3724.0) Bbox
(x0=4.75, y0=868.0, x1=5.25, y1=3528.0) Bbox(
x0=5.75, y0=1092.0, x1=6.25, y1=3948.0) Bbox(x0=6.75, y0=756.0
, x1=7.25, y1=2884.0) Bbox(x0=7.75, y0=756.0, x1=8.25, y1=3024.0)
Bbox(x0=0.75, y0=4004.0, x1=1.25, y1=4396.0)
Bbox(x0=1.75, y0=3668.0,x1=2.25,y1=4060.0)
Bbox(x0=2.75,y0=3864.0,x1=3.25,y1=4060.0)
这是我的程序中 patch.get_bbox() 的输出。
我们可以从这里提取边界框细节并根据我们的要求进行操作
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件