如何使用Python在条形图中表示二维分类数据
我有一个包含列的数据集:“月份”、“类别”和“盈利能力”。我使用下面的方法来计算每个月和类别的“盈利能力”总和如何使用Python在条形图中表示二维分类数据,python,pandas,matplotlib,bar-chart,data-science,Python,Pandas,Matplotlib,Bar Chart,Data Science,我有一个包含列的数据集:“月份”、“类别”和“盈利能力”。我使用下面的方法来计算每个月和类别的“盈利能力”总和 q1=df.groupby(['Month','Category'])['Profitability'].sum() 这是我得到的结果 Month Category 1 Cosmetics 2685.9000 First Aid 2128.0200 Magazine 703.8900
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
我想用条形图来表示它们。可视化这些分类数据的最佳方法是什么?准备步骤是使用单个列转换数据帧 并将多索引转换为具有“正常”索引和独立的 每个类别的列:
df2 = df.Profitability.unstack()
或者,如果数据源是一个系列(不是数据帧),则运行:
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轴的方向:
最后4条指令更改y轴上的默认记号,如“我的
认为默认勾号(尝试绘制)的可读性更好
没有这4行的图形(用于比较)
结果是:
现在比较容易比较条的高度,并且粗略地选择y记号
在勾号(n-1)*3的基础上
编辑
如果希望图例带有标题,请添加title='Category'
ax.legend(…)
指令的参数,以上面的任何一个为准
您选择的解决方案。您希望您的可视化描述什么您希望观众看到什么?你想向观众突出显示什么?一个堆叠的条形图怎么样?-每个类别一个条形图,每个月的值堆叠起来?或者您想显示每个类别随时间的变化吗?也许这会有所帮助:或者可能是每个月份都有一个条形图,其中类别值堆叠在一起?@wwii I想在X轴上设置月份,在Y轴上设置利润。每个月需要画5条条形图。简单的线形图通常比条形图更可取,特别是如果你想显示随时间的变化。您可以使用不同的颜色来显示类别。
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);