如何在堆积条形图中的每个条形上添加值[重复]
Posted
技术标签:
【中文标题】如何在堆积条形图中的每个条形上添加值[重复]【英文标题】:how to add values over each bar in stacked bar plot [duplicate] 【发布时间】:2022-01-06 07:17:29 【问题描述】:我有以下数据:
similarity_score_summary='sim_model':['jaccard_sim','Cos_tfidf_sim','spacy_sim','sent_trf_sim','wv_gensim_sim'],
'acc(thres=0.5)':[0.65,0.66,0.38,0.62,0.39],
'acc(thres=0.75)':[0.61,0.62,0.41,0.79,0.44],
'acc(thres=0.90)':[0.62,0.62,0.60,0.76,0.55]
df_sim = pd.DataFrame.from_dict(similarity_score_summary)
# setting first name as index column
df_sim.set_index("sim_model", inplace = True)
fig=plt.figure(figsize=(10, 8))
axes=fig.add_subplot(1, 1, 1)
bar_width = 0.3
idx = np.array(range(df_sim.shape[0]))
labels = df_sim.index
plt.bar(data=df_sim, height='acc(thres=0.5)', x=idx, color='b', width=bar_width, label='acc(thres=0.5)')
plt.bar(data=df_sim, height='acc(thres=0.75)', x=idx+bar_width, color='g', width=bar_width, label='acc(thres=0.75)')
plt.bar(data=df_sim, height='acc(thres=0.90)', x=idx+bar_width+bar_width, color='magenta', width=bar_width, label='acc(thres=0.90)')
plt.xticks(idx, labels, rotation=90)
plt.xlabel('Similarity methods')
plt.ylabel('Similarity Score')
plt.ylim((0, 1))
plt.title('Accuracy score for different Similarity methods on Quora Question pairs Kaggle data')
plt.legend(['thres=0.5', 'thres=0.75', 'thres=0.9'], loc='upper right', ncol = 3)
plt.show()
结果如下图:
我需要在每个栏的顶部添加值。需要帮助吗?
【问题讨论】:
这个实现有很多问题,包括你创建了axes
,然后没有正确使用对象(例如axes.bar(...)
而不是plt.bar(...)
)。当前添加注释的正确方法是:for c in axes.containers: axes.bar_label(c, fmt='%.2f', label_type='edge', padding=1)
正确的做法是直接绘制df_sim
,它将绘图和注释代码减少到只有6行(与接受的答案中显示的25行相比):见code and plot
【参考方案1】:
定义条形,遍历它们并获取每个条形的高度,获取x
值并使用plt.text
在每个条形上方添加值。
例子:
bar1 = plt.bar(
data=df_sim,
,
x=idx,
color="b",
width=bar_width,
label="acc(thres=0.5)",
)
bar2 = plt.bar(
data=df_sim,
,
x=idx + bar_width,
color="g",
width=bar_width,
label="acc(thres=0.75)",
)
bar3 = plt.bar(
data=df_sim,
,
x=idx + bar_width + bar_width,
color="magenta",
width=bar_width,
label="acc(thres=0.90)",
)
for bars in [bar1, bar2, bar3]:
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width() / 2.0, yval + 0.005, yval, ha="center")
结果:
【讨论】:
谢谢。这行得通。有没有更有效的方法? @Nishant 不客气!我很高兴我能帮上忙。不确定,要向图像添加文本,您必须知道坐标,并且要知道坐标,您必须遍历每个条,因为每个条具有不同的 X、Y 坐标。也许有,但我不知道。 谢谢。还有一件事。我们可以让 xticks 居中吗? @Nishant 是的,答案已更新。以上是关于如何在堆积条形图中的每个条形上添加值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在堆积条形图中反转 geom_text() (ggplot2)