无法在堆积条形图中绘制所有数据?

Cannot plot all data in a stacked bar chart?

我尝试使用以下代码绘制一个水平堆叠条形图,以高程为 y 轴,欧洲和北美(数据)沿 x 轴堆叠。不知道出了什么问题。并未显示所有数据,而且条形图的宽度太细,无法查看。

fig, ax = plt.subplots()
ax.barh(EleRegion['Elevation'], EleRegion['Europe'], label = 'Europe')
ax.barh(EleRegion['Elevation'], EleRegion['North America'], label ='North America' )

数据集如下:

0        0
1      100
2      200
3      300
4      400
5      500
6      600
7      700
8      800
9      900
10    1000
11    1100
12    1200
13    1300
14    1400
15    1500
16    1600
17    1700
18    1800
19    1900
20    2000
21    2100
22    2200
23    2300
Name: Elevation, dtype: int64 0     11188
1      9407
2      8801
3      8801
4      8692
5      7563
6      7134
7      6121
8      5077
9      3684
10     3330
11     1084
12     1084
13      918
14      918
15      776
16      776
17       75
18       75d
19        0
20        0
21        0
22        0
23        0
Name: Europe, dtype: int64
0     2657
1     1786
2     1786
3     1786
4      959
5      885
6      564
7      187
8      187
9        0
10       0
11       0
12       0
13       0
14       0
15       0
16       0
17       0
18       0
19       0
20       0
21       0
22       0
23       0
Name: North America, dtype: int64

///重复 post/// 我尝试绘制水平堆积条形图,以高程为 y 轴,欧洲和北美(数据)沿 x 轴堆叠以下代码。不知道出了什么问题。并未显示所有数据,而且条形图的宽度太细,无法查看。

您可以将 Elevation 设置为索引并使用 DataFrame.plot.barh:

ax = EleRegion.set_index('Elevation').plot.barh(stacked=True)
ax.set_ylabel('Count')

结果:

无法正常工作的原因:

有两个问题:

  • Axes.barh 接受 ywidthheight。您通过了前两个,但高度仍然是默认值 0.8。问题是您的 y 轴在数千范围内,因此条形图太小以至于看不到。您可以将其设置为 50,您将看到它们:
ax.barh(EleRegion['Elevation'],  EleRegion['Europe'], 50, label = 'Europe')

为了避免玩弄 height,您要做的是使用整数(例如,range(len(EleRegion)) 作为 y 并将 yticks 设置为正确的数字。这样,默认的 height 会起作用。

  • 另一个问题是,使用 Axes.barh 创建的第二个条形图需要 left 参数才能真正“堆叠”,否则第二个图表只会在第一个图表之上呈现:
f, ax = plt.subplots()
ax.barh(EleRegion['Elevation'], EleRegion['Europe'], 50, label='Europe')
ax.barh(EleRegion['Elevation'], EleRegion['North America'], 50, left=EleRegion['Europe'], label='North America' )
plt.show()

这就是为什么,因为您的数据已经是 DataFrame,所以使用 DataFrame.plot.barh 自动处理所有这些更方便。