带有用于正值和负值的单独条形的条形图

Posted

技术标签:

【中文标题】带有用于正值和负值的单独条形的条形图【英文标题】:Bar chart with separate bars for positive and negative values 【发布时间】:2021-06-27 03:16:36 【问题描述】:

我有一个包含正值和负值的数据框。我想展示一个条形图,它显示两个条形图,一个条形图显示正值的百分比,另一个显示负值的百分比。

dummy = pd.DataFrame('A' : [-4, -3, -1, 0, 1, 2, 3, 4, 5], 'B' : [-4, -3, -1, 0, 1, 2, 3, 4, 5])
less_than_0 = dummy['A'][dummy['A'] < 0]
greater_than_0 = dummy['A'][dummy['A'] >= 0]

我能够拆分正值和负值。我用 seaborn 试过这个。

sns.barplot(dummy['A'])

但正面和负面都出现在单个条形图中。 我也试过了

sns.barplot(less_than_0)
sns.barplot(greater_than_0)

有什么方法可以显示 2 个条形图,1 个代表正值的百分比,另一个代表负值的百分比?

【问题讨论】:

【参考方案1】:

这不是最优雅的解决方案,但您可以创建一个包含两列的新 DataFrame:labels 包含要在条形图的 x 轴上显示的标签,percentages 包含负值和正值的百分比。

然后您可以将这些列名和相关信息作为xy 参数传递给sns.barplot

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

dummy = pd.DataFrame('A' : [-4, -3, -1, 0, 1, 2, 3, 4, 5], 'B' : [-4, -3, -1, 0, 1, 2, 3, 4, 5])

df_percentages = pd.DataFrame(
    'labels':['Less than 0', 'Greater than or equal to 0'],
    'percentage':[100*x/len(dummy['A']) for x in [sum(dummy['A'] < 0), sum(dummy['A']>=0)]]
    )

sns.barplot(x='labels', y='percentage', data=df_percentages)
plt.show()

【讨论】:

【参考方案2】:

您可以将Series.value_countsnormalize=True 一起使用,然后绘制Series

d = True:'Less than 0',False:'Greater than or equal to 0'
s = (dummy['A'] < 0).value_counts(normalize=True).rename(d)
print (s)
Greater than or equal to 0    0.666667
Less than 0                   0.333333
Name: A, dtype: float64

sns.barplot(x=s.index, y=s.to_numpy())

【讨论】:

【参考方案3】:

您可以groupby(dummy.A &gt;= 0)创建正/负分组,然后将每个分组的size()除以A.size转换为比率:

ax = dummy.groupby(dummy.A >= 0).size().div(dummy.A.size).plot.bar()
ax.set_xticklabels(['< 0', '>= 0'], rotation=0)

【讨论】:

以上是关于带有用于正值和负值的单独条形的条形图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化发散型条形图发散条形图(Diverging Bars)是一种可以同时处理负值和正值的条形图并按照大小排序区分数据(Diverging Bars)

geom_bar ggplot2 具有正值和负值的堆叠、分组条形图 - 金字塔图

R绘制发散型条形图(Diverging Bars)

ggplot2 和带有负值的堆积条形图

情节堆积条形图熊猫数据框

如何使用ggplot2用正负条标记条形图