1

数据说明:我有一个正在测试的程序,它有 3 个部分,这些部分增加了整个程序的能力,例如第 1 部分处理 60% 的数据,第 2 部分处理另外 10% 的数据,第 3 部分处理另外 6% 的数据。

我想要做的是堆积条形图,显示“在程序处理的数据总量中,绿色表示第 1 部分处理的数量,红色第 2 部分和黄色第 3 部分”。

因为我已经在 3 组 5 个文件上测试了程序,所以我希望图表通过将每个数据集中的 5 个条形图分组在一起来反映这一点,所以最后图表有 3 个部分彼此相距一英寸,然后每个条形图具有上述堆叠效果。

我的目标是 Y 轴是文件工作的百分比,Y 是文件所属组的名称。

至于一些示例数据,这是我一直在尝试的:

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()

然而,到目前为止,这一直没有用,因为它只产生带有 2 个堆叠部分的条,第三个正在合并到第一个中,我还没有弄清楚如何将合并合并到这个代码中。

4

1 回答 1

1

您没有在这里定义meta_secondmeta_total在您的代码段中,所以很难猜测发生了什么,但我会采取行动。您可能正在使用+to get添加列表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 或面向对象的界面)。他们不喜欢混在一起。就个人而言,OO 接口更加健壮和可靠,我总是使用它。

于 2014-09-04T16:01:18.007 回答