Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python在条形图中表示二维分类数据_Python_Pandas_Matplotlib_Bar Chart_Data Science - Fatal编程技术网

如何使用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);