如何有条件地在条形图上的条形图上显示数据框的不同列值?

Posted

技术标签:

【中文标题】如何有条件地在条形图上的条形图上显示数据框的不同列值?【英文标题】:How to display a different column value of a dataframe in a seaborn barplot over the bars conditionally? 【发布时间】:2019-12-11 15:45:09 【问题描述】:

我有一个数据框 sales 与列 [book_name, num_orders, condition,price]。

condition 有 4 个变体。对于每个book_name,我只尝试为具有num_orders>=10 的条件绘制条形图。

所以,我愿意:

sns.barplot(x='book_name', y='price', hue='condition', data=sales[sales.num_orders>=10])

现在,我想在相应的条形图上显示每个book_name 的每个条件的num_orders。如果因为阈值 10 而没有绘制,则跳过它。

我怎样才能做到这一点?

示例数据框:

import pandas as pd
sales = pd.DataFrame.from_dict("book_name":["Island", "Island", "Island","Island", "Cinder","Cinder", "Cinder","Cinder","Speak","Speak","Speak","Speak"],
                                "num_orders" : [15, 17, 3,40,57,120,5,65,34,6,7,8], 
                                "condition":["New", "Old", "Rough","Torn","New", "Old", "Rough","Torn","New", "Old", "Rough","Torn"],
                               "price":[700,600,500,400,1000,900,800,700,1500,1400,1300,1200])

当我跑步时:

sns.barplot(x='book_name',y='price',data=sales,hue='condition')

而且,当我执行以下操作时:

sns.barplot(x='book_name',y='price',data=sales[sales.num_orders>10],hue='condition')

我想在绘制的条形图上显示 num_orders 的值。如果没有酒吧,就没有价值。欢迎提出使用不同库的建议,但请在我使用色调并希望在这些条形上方显示其他列的值的地方发布解决方案。

【问题讨论】:

请也包含一个小数据集,以澄清问题 @anky_91 我添加了一个示例数据集。 【参考方案1】:

我通过尝试以下方法得到了解决方案:

def display_figures(ax,df):
    show=df.num_orders.to_list()
    i=0
    for p in ax.patches:
        h=p.get_height()
        if (h>0):
            value=show[i]
            ax.text(p.get_x()+p.get_width()/2,h+10, value, ha='center')
            i=i+1
plt.figure(figsize=(15,10))
plot_data=sales[sales.num_orders>=10].sort_values(by='cond_id')
ax=sns.barplot(x='book_name',y='price',data=plot_data, hue='condition')
display_figures(ax,plot_data)

【讨论】:

以上是关于如何有条件地在条形图上的条形图上显示数据框的不同列值?的主要内容,如果未能解决你的问题,请参考以下文章

同一图上的条形图/线图,但条形图前面的轴和线图不同

在条形图上以 col 显示多个值

在 Altair 中设置条形图上的标签格式

Plotly:如何对条形图上显示的“文本”值求和?

如何在条形图上更正 R 中 y 轴的比例和顺序

如何使条形图上的x轴与pointWidth匹配