如何在分组条形图上方显示百分比

Posted

技术标签:

【中文标题】如何在分组条形图上方显示百分比【英文标题】:How to display percentage above grouped bar chart 【发布时间】:2019-02-04 10:51:02 【问题描述】:

以下是 pandas 数据框和由此生成的条形图:

colors_list = ['#5cb85c','#5bc0de','#d9534f']
result.plot(kind='bar',figsize=(15,4),width = 0.8,color = colors_list,edgecolor=None)
plt.legend(labels=result.columns,fontsize= 14)
plt.title("Percentage of Respondents' Interest in Data Science Areas",fontsize= 16)

plt.xticks(fontsize=14)
for spine in plt.gca().spines.values():
    spine.set_visible(False)
plt.yticks([])

我需要在相应栏上方显示各个主题的每个兴趣类别的百分比。我可以创建一个包含百分比的列表,但我不明白如何将其添加到相应栏的顶部。

【问题讨论】:

【参考方案1】:

尝试将以下for 循环添加到您的代码中:

ax = result.plot(kind='bar', figsize=(15,4), width=0.8, color=colors_list, edgecolor=None)

for p in ax.patches:
    width = p.get_width()
    height = p.get_height()
    x, y = p.get_xy() 
    ax.annotate(f'height', (x + width/2, y + height*1.02), ha='center')

说明

一般来说,您使用Axes.annotate 为您的绘图添加注释。 此方法采用注解的text 值和放置注解的xy 坐标。

在条形图中,每个“条”由patch.Rectangle 表示,每个矩形都具有属性widthheight 和矩形左下角的xy 坐标,所有分别可以通过patch.get_widthpatch.get_heightpatch.get_xy方法获得。

将所有这些放在一起,解决方案是循环遍历您的Axes 中的每个补丁,并将注释文本设置为该补丁的height,并在其中心上方设置一个适当的xy 位置补丁 - 根据它的高度、宽度和 xy 坐标计算得出。


对于您使用百分比进行注释的特定需求,我将首先规范化您的 DataFrame 并改为绘制它。

colors_list = ['#5cb85c','#5bc0de','#d9534f']

# Normalize result
result_pct = result.div(result.sum(1), axis=0)

ax = result_pct.plot(kind='bar',figsize=(15,4),width = 0.8,color = colors_list,edgecolor=None)
plt.legend(labels=result.columns,fontsize= 14)
plt.title("Percentage of Respondents' Interest in Data Science Areas",fontsize= 16)

plt.xticks(fontsize=14)
for spine in plt.gca().spines.values():
    spine.set_visible(False)
plt.yticks([])

# Add this loop to add the annotations
for p in ax.patches:
    width = p.get_width()
    height = p.get_height()
    x, y = p.get_xy() 
    ax.annotate(f'height:.0%', (x + width/2, y + height*1.02), ha='center')

【讨论】:

【参考方案2】: 来自matplotlib 3.4.2,使用matplotlib.pyplot.bar_label 修改自此answer,计算方式不同,标签格式不同。 直接用pandas.DataFrame.plotkind='bar'绘制DataFrame 有关使用.bar_label 方法的更多文档和示例,请参阅此answer。 调整.div.sum 中使用的轴以确定相对于列的百分比。
import pandas as pd

file="https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/coursera/Topic_Survey_Assignment.csv"
df=pd.read_csv(file, index_col=0)

df.sort_values(by=['Very interested'], axis=0, ascending=False, inplace=True)

# calculate the percent relative to the index
df_percent = df.div(df.sum(axis=1), axis=0).mul(100).round(1)

# display(df_percent)
                            Very interested  Somewhat interested  Not interested
Data Analysis / Statistics             77.0                 20.3             2.7
Machine Learning                       74.7                 21.9             3.4
Data Visualization                     61.6                 33.7             4.7
Big Data (Spark / Hadoop)              60.9                 33.3             5.8
Deep Learning                          58.2                 35.5             6.3
Data Journalism                        20.2                 51.0            28.8

# set the colors
colors = ['#5cb85c', '#5bc0de', '#d9534f']

# plot with annotations is probably easier
p1 = df_percent.plot(kind='bar', color=colors, figsize=(20, 8), rot=0, ylabel='Percentage', title="The percentage of the respondents' interest in the different data science Area")

for p in p1.containers:
    p1.bar_label(p, fmt='%.1f%%', label_type='edge')

【讨论】:

以上是关于如何在分组条形图上方显示百分比的主要内容,如果未能解决你的问题,请参考以下文章

如何在百分比条形图上方添加百分比或计数标签?

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签

使用 ggplot 在分组条形图上定位标签

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签

如何使用电子表格中的两个不同列制作按图分组的条形图?

无法在条形图上显示百分比