我有一些数据我想在2个堆积的条形图中显示(并排)。使用matplotlib。
data _null_;
merge count1(rename=(count=count1)) count2(rename=(count=count2));
if count1 ne count2 then abort abend ;
run;
在我看来,红色条(VM)没有堆叠在其余条形图的顶部,导致图形的奇怪外观(尽管我指定了正确的keys=['BF', 'VL', 'GM', 'VM']
data=[[0.10992407597195027, 0.084754817342900857],
[0.20119173770112833, 0.24308696457787043],
[0.49912704691619575, 0.53468456580435009],
[0.18975713941072578, 0.13747365227487865]]
x = range(2)
f, ax1 = plt.subplots(1, figsize=(10,5))
plt.bar(x,data[0], label=keys[0])
plt.bar(x,data[1], bottom=data[0], label=keys[1])
plt.bar(x,data[2], bottom=data[1], label=keys[2])
plt.bar(x,data[3], bottom=data[2],label=keys[3])
plt.legend(loc='upper left')
plt.show()
属性。在每个栏中应该总计为1。我该如何解决这个问题?
我能够通过使用以下相当混乱的代码将bottom
属性设置为较低条的总和而不是仅显示较低条的总和来解决此问题:
bottom
有更好的方法吗?它有更多的条形,不能很好地扩展。
答案 0 :(得分:0)
每次迭代数据并调用bar()是有意义的。 我还没有测试过这个,但它应该足以开始了。
y_pos_1 = y_pos_2 = 0
for k, v in enumerate(data):
abs_bottom = [y_pos_1, y_pos_2]
plt.bar(x, v, bottom=abs_bottom, label=keys[k])
y_pos_1 += v[0]
y_pos_2 += v[1]
基本上只保留每个栏底部的滚动计数。使用enumerate()来获取索引,以便我们可以使用它来获取标签。