我试图使用Python的matplotlib库在同一个绘图上绘制四个堆叠条形图
对于每个观察(obs1、obs2、obs3、obs4),我希望使用堆叠条形图查看每个组件(c1、c2、c3、c4、c5、c6)的数量。这是我写的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = np.array([[-904., 97., 59., 5., 252., 138.], [-603., 65., 0., 29., 0., 0.], [-571., -27., 0., -28., 0., 0.], [-80., 40., 0., -9., 0., 0.]])
data2 = pd.DataFrame(data=data)
data2.index = ['obs1', 'obs2', 'obs3', 'obs4']
data2.columns = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']
ind = np.arange(4)
width = 0.4
p1 = plt.bar(ind, data2['c1'], width)
p2 = plt.bar(ind, data2['c2'], width)
p3 = plt.bar(ind, data2['c3'], width)
p4 = plt.bar(ind, data2['c4'], width)
p5 = plt.bar(ind, data2['c5'], width)
p6 = plt.bar(ind, data2['c6'], width)
plt.legend((p1[0], p2[0], p3[0], p4[0], p5[0], p6[0]), tuple(data2.columns), bbox_to_anchor = (1.05, 1), loc = 'upper left', borderaxespad = 0.)
为清楚起见,这是数据帧(用于生成绘图):
print(data2)
c1 c2 c3 c4 c5 c6
obs1 -904.0 97.0 59.0 5.0 252.0 138.0
obs2 -603.0 65.0 0.0 29.0 0.0 0.0
obs3 -571.0 -27.0 0.0 -28.0 0.0 0.0
obs4 -80.0 40.0 0.0 -9.0 0.0 0.0
这是情节:
请注意,在绘图上,obs1的条形图为x=0,obs2的条形图为x=1,依此类推
然而,有两个问题:
组件5的obs1值为252,但组件5的高度(紫色)大大低于252。我怎样才能解决这个问题
对于组件2,obs3的值为-27,但图中根本没有显示该值。我怎样才能解决这个问题
谢谢
这是因为当您打印时,y值引用取自
y=0
,因此obs1组件5的紫色条实际上从y=0
到y=252
,并且由于matplotlib打印条片的顺序性质,它被组件6的条带阻止(稍后打印)同样,出于相同的原因,obs3组件2未显示
要获得所需的堆叠条形图,只需使用熊猫绘图界面进行绘图:
这正是您想要的:
另一方面,我建议为每个组成部分绘制一个单独的条形图,因为它们的比例非常不同,这将使观察结果之间的组成部分级比较更加清晰:
这给了你:
相关问题 更多 >
编程相关推荐