如何将pandas数据帧的两列绘制为水平条形图?

2024-09-29 23:28:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图比较数据帧中的两列,并希望使用Seaborn将它们绘制为水平条形图。在下面的图中只绘制了一列(“budget2019”)。在

actual plot with just one year 'budget2019' plotted

1)如何在第二列旁边绘制第二列(“budget2018”),以便更好地看到两列值之间的演变,并直观地比较每个“部门”的两个栏?在

2)如何将x值放在每个条的末尾,以便可以看到(读取)每个条上的x值,而不必眼睛向下看,并尝试近似值?因为现在在实际的绘图中,我们不能直接从条形图上读取x值。(在看情节时很难得到确切的数值)

3)在我让它在“budget2019”条旁边绘制“budget2018”条之后,有没有方法也可以在图上以百分比表示演化?为了让它更具可读性,这两列之间的变化率是多少?在

下面是我的数据帧:

a part of my small dataframe

下面是我现在用来绘制的代码:

plt.figure(figsize=(15,8))

sns.set(style="darkgrid")

#ax = sns.barplot(x="budget2018", y="ministere", data=budget, label="Total")
sns.set_color_codes("pastel")
sns.barplot(x="budget2019", y="ministere", data=budget, label="Budget 2019")

sns.despine(left=True, bottom=True)

plt.tight_layout()
plt.show()

PS:如果Seaborn无法实现,那么仅使用Matplotlib的解决方案也可以。所需要的是水平条,就像我的图中那样,否则yticks是不可读的。在

编辑(使用ImportanceOfBeingErnest注释中的代码后):

事实上,我看到了重要的情节。这很接近我的需要。在

plot after @ImportanceOfBeingErnest's comment (setting index)


Tags: 数据代码data水平绘制pltseaborn条形图
1条回答
网友
1楼 · 发布于 2024-09-29 23:28:16

要使用seaborn,您必须使用使用melt创建的中间数据帧来生成“长格式”数据帧。在

df2 = pd.melt(budget, id_vars=['ministere'], value_vars=['budget2018','budget2019'], var_name='year')

然后使用hue=参数绘制两列:

^{pr2}$

根据要求调整标签相当容易(您会发现许多其他示例):

for i,m in budget.iterrows():
    ax.annotate(s='{:.2f}%'.format(m.loc['evolution_percent']),
                xy=(m.loc[['budget2018','budget2019']].max(),i),
                xytext=(10,0),
                textcoords='offset pixels',
                ha='left',
                va='center'
               )

labels = ['{:s}\n(2019: {:.2f}€)'.format(d.ministere,d.budget2019) for _,d in budget.iterrows()]
ax.set_yticklabels(labels)

enter image description here

相关问题 更多 >

    热门问题