Matplotlib/Seaborn中的条形图标签

5
在版本3.4中,matplotlib新增了自动柱形图标签功能:https://matplotlib.org/stable/users/whats_new.html#new-automatic-labeling-for-bar-charts 我正在尝试将其用于Seaborn生成的柱形图。
fig, axs = plt.subplots(
        nrows=2,
    )        

for i, col in enumerate(['col_1', 'col_2']):
        ax = axs[i]
        sns.barplot(
            x="class",
            y=col,
            hue="hue_col",
            data=data_df,
            edgecolor=".3",
            linewidth=0.5,
            ax=ax
        )


        ax.bar_label(ax.containers[i]) # Doesn't work

我需要做什么才能让这个工作?示例图


“不起作用”是什么意思?它是否显示错误或输出错误? - M-Chen-3
问题在于如何处理NaN值。将NaN值放入条形图容器中有不同的方法,最明显的是在下面的泰坦尼克号示例中使用sns.barplot中的“order”参数,给它一个像['male','female','non-binary']这样的值。这将在图表中包括非二进制(表示0),但bar_label将返回此错误:“File“/opt/anaconda3/envs/my_env/lib/python3.7/site-packages/matplotlib/axes/_axes.py”,line 2638,在bar_label ha=ha,va=va,**kwargs) UnboundLocalError: local variable 'ha' referenced before assignment”。 - codejohnny
1个回答

5
你可以循环遍历这些容器,并对每个容器调用ax.bar_label(...)。注意,seaborn为每个hue值创建一个条形图集。

以下示例使用titanic数据集并设置ci=None以避免误差线与文本重叠(如果需要误差线,则可以设置较浅的颜色,例如errcolor='gold')。

import seaborn as sns
import matplotlib.pyplot as plt

titanic = sns.load_dataset('titanic')
fig, axs = plt.subplots(ncols=2, figsize=(12, 4))

for ax, col in zip(axs, ['age', 'fare']):
    sns.barplot(
        x='sex',
        y=col,
        hue="class",
        data=titanic,
        edgecolor=".3",
        linewidth=0.5,
        ci=None,
        ax=ax
    )
    ax.set_title('mean ' + col)
    ax.margins(y=0.1) # make room for the labels
    for bars in ax.containers:
        ax.bar_label(bars, fmt='%.1f')
plt.tight_layout()
plt.show()

seaborn barplot with ax.bar_label


跟进问题:我能让它与NaN值一起工作吗? 将NaN值放入条形容器的不同方法,最明显的是在titanic示例中使用sns.barplot中的“order”参数,给它一个像['male','female','non-binary']这样的值。这将在图表中包括非二进制(表示0),但bar_label将返回此错误: File "/opt/anaconda3/envs/model-runner-test/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 2638, in bar_label ha=ha, va=va, **kwargs) UnboundLocalError: local variable 'ha' referenced before assignment - codejohnny
我发现的一个解决方法是通过添加一个非二进制值为0的样本来操作输入数据。这样bar_plot函数就能正常工作了,但当然会在非二进制处标示“0”。我希望那里根本没有标签。 - codejohnny
Seaborn的首席程序员已经在matplotlib的github上发布了这个错误,就在两天前。同时,您仍然可以使用旧方法:循环遍历每个条形图并手动在其顶部添加文本。 - JohanC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接