如何在堆积条形图中的每个条形上添加值[重复]

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 是的,答案已更新。

以上是关于如何在堆积条形图中的每个条形上添加值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

spss如何删除堆积条形图中的某块数据

在堆积条形图中反转 geom_text() (ggplot2)

Plotly:如何使用 go.Bar 向堆积条形图添加数据标签?

将百分比标签添加到堆积条形图ggplot2

Google图表(可视化)中堆积条形图中的第三个条形图无效

如何将标签添加到堆叠条形图