我有一个包含列的数据集:“月”,“类别”和“利润”。我使用以下方法来查找每个月和每个类别的“盈利能力”总和。
q1=df.groupby(['Month','Category'])['Profitability'].sum()
这是我得到的结果。
Month Category
1 Cosmetics 2685.9000
First Aid 2128.0200
Magazine 703.8900
Supplements 37005.6200
Toiletries 1893.0600
2 Cosmetics 2569.0600
First Aid 3282.7850
Magazine 679.1100
Supplements 36647.8800
Toiletries 1357.7500
3 Cosmetics 1350.7925
First Aid 2238.3100
Magazine 371.1200
Supplements 21444.0900
Toiletries 1226.1600
我想用条形图表示它们。可视化这些分类数据的最佳方法是什么?
准备步骤是将具有单个列和MultiIndex的DataFrame转换为具有“普通”索引和每个类别单独的列的DataFrame :
df2 = df.Profitability.unstack()
或者,如果您的数据源是Series(而不是DataFrame),则运行:
df2 = q1.unstack()
结果更适合作为图形来源:
Category Cosmetics First Aid Magazine Supplements Toiletries
Month
1 2685.9000 2128.020 703.89 37005.62 1893.06
2 2569.0600 3282.785 679.11 36647.88 1357.75
3 1350.7925 2238.310 371.12 21444.09 1226.16
绘制数字,基本方法是采用y轴的线性比例。绘制它的代码是:
ax = df2.plot.bar(rot=0)
ax.get_figure().suptitle(t='Profitability', fontsize=20)
ax.legend(bbox_to_anchor=(1.35, 1.0));
最后一条指令将图例向右“移动”(与默认位置相比),否则它将使某些条形变得模糊(尝试在不使用该指令的情况下进行绘制)。
结果是:
但是请注意,与其他类别相比,“ 辅助”的条形非常高。
这就是为什么我基于y轴的对数刻度提出第二个解决方案的原因:
ax = df2.plot.bar(rot=0, logy=True)
ax.get_figure().suptitle(t='Profitability', fontsize=20)
ax.legend(bbox_to_anchor=(1.1, 1.0))
yTicks = [1000, 3000, 10000, 30000]
yTickLabels = [ f'{i:,}' for i in yTicks ]
ax.set_yticks(yTicks)
ax.set_yticklabels(yTickLabels);
最后4条指令更改了y轴上的默认刻度,因为我认为它们比默认刻度更具可读性(尝试绘制没有这4条线的图形进行比较)。
结果是:
现在,条的高度很容易比较,并且大约在tick(n-1)* 3的基础上选择y刻度。
如果您希望图例带有标题,请title='Category'
在ax.legend(...)
指令中添加参数,无论选择哪种上述解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句