python matplotlib 分组堆积条形图
数据解释:我正在测试一个程序,这个程序有三个部分,每个部分都能增强程序的整体功能。例如,第一部分处理60%的数据,第二部分处理额外的10%,第三部分处理另外的6%。
我想做的是堆叠条形图,显示“在程序处理的总数据中,绿色表示第一部分处理的量,红色表示第二部分,黄色表示第三部分”。
因为我在3组5个文件上测试了这个程序,所以我希望图表能反映这一点,将每组的5个条形图放在一起,这样最终图表就会有3个部分,彼此相距一英寸,然后每个条形图都有上面提到的堆叠效果。
我希望Y轴表示文件处理的百分比,X轴则是文件所属组的名称。
至于一些示例数据,这就是我一直在尝试的:
meta_part1 = [5, 5.5, 4.67, 6.54, 4.4]
meta_part2 = [3.1, 3.3, 3.9, 3.5, 3.1]
meta_part3 = [1.3,1.4,1.7,2.4,0.89]
trans_part1 = [90,89.5,94.67,96.54,94.4]
trans_part2 = [11.1,11.3,10.9,11.5,12.1]
trans_part3 = [11.3,11.4,11.7,12.4,10.89]
s_part1 = [55,55.5,54.67,56.54,54.4]
s_part2 = [11.1,11.3,10.9,11.5,12.1]
s_part3 = [11.3,11.4,11.7,12.4,10.89]
meta、trans和s都是组。
我到目前为止失败的代码在这里:
import matplotlib.pyplot as plt
import numpy as np
import numpy as np
from numpy.random import randn
import pandas as pd
from scipy import stats
import matplotlib as mpl
import seaborn as sns
meta_part1 = [5, 5.5, 4.67, 6.54, 4.4]
meta_part2 = [3.1, 3.3, 3.9, 3.5, 3.1]
meta_part3 = [1.3,1.4,1.7,2.4,0.89]
trans_part1 = [90,89.5,94.67,96.54,94.4]
trans_part2 = [11.1,11.3,10.9,11.5,12.1]
trans_part3 = [11.3,11.4,11.7,12.4,10.89]
s_part1 = [55,55.5,54.67,56.54,54.4]
s_part2 = [11.1,11.3,10.9,11.5,12.1]
s_part3 = [11.3,11.4,11.7,12.4,10.89]
N = 5
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars: can also be len(x) sequence
p1 = plt.bar(ind, meta_part1, width, color='y', bottom=meta_part2)
p2 = plt.bar(ind, meta_part2, width, color='r', bottom=meta_part3)
p3 = plt.bar(ind, meta_part3, width, color='g')
plt.ylabel('Scores')
plt.title('Difference between stitchers')
plt.xticks(ind+width/3., ('Test1', 'Test2', 'Test3', 'Test4', 'Test5') )
plt.yticks(np.arange(0,10,1))
plt.legend( (p1[0], p2[0], p3[0]), ('Part1', 'Part2', 'Part3') )
ax.autoscale(tight=True)
plt.show()
然而,这段代码到现在为止没什么用,因为它只生成了有两个堆叠部分的条形图,而第三个部分却和第一个部分合并在一起,我还没能弄明白如何将合并的部分加入到这段代码中。
1 个回答
1
在你的代码片段中,没有定义 meta_second
和 meta_total
,所以有点难以猜测发生了什么,但我可以试着解释一下。你可能是用 +
来合并列表,这样会把两个列表连接在一起,而不是把里面的数值加起来。
这里有一些可以正常工作的修改:
meta_second = meta_part1
meta_total = [meta_part1[i]+val for i, val in enumerate(meta_part2)]
p1 = plt.bar(ind, meta_part1, width, color='y')
p2 = plt.bar(ind, meta_part2, width, color='r', bottom=meta_second)
p3 = plt.bar(ind, meta_part3, width, color='g', bottom=meta_total)
另外,虽然这不是重点,但你在定义 ax
之前就尝试使用它了。你应该选择一种接口来使用(要么是 pyplot,要么是面向对象的接口)。这两者混在一起使用是不太好的。就我个人而言,面向对象的接口更稳定可靠,我总是使用这个。