带有用于正值和负值的单独条形的条形图
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
包含负值和正值的百分比。
然后您可以将这些列名和相关信息作为x
和y
参数传递给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_counts
与normalize=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 >= 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)