2014-09-04 68 views
1

数据的测试:我有一个测试程序,其中有3个部分增加了整个程序的能力,例如, part1在60%的数据上工作,part2在额外的10%上,part3在另外6%上。python matplotlib堆叠在一起的barcharts

我想要做的是堆叠条显示“程序在绿色上工作的数据总量中,表示数量part1处理的数量,红色部分2和黄色部分3”。

因为我已经在3套5个文件上测试了程序,我希望图形通过将来自每个数据集的5个barcharts分组在一起来反映出这一点,因此最终有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] 

元,反式和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个堆叠部件,三是合并成第一和我havnt已经能够正常工作了解如何将合并合并到此代码中。

回答

1

您在此处的代码段中没有定义meta_secondmeta_total,所以很难猜测发生了什么,但是我会采取一定的措施。您可能会添加+的列表以获得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接口更加健壮和可靠,我总是使用它。

+0

对不起,我现在已经改变了命名,所以他们再次是正确的版本。也只是尝试了这一点,似乎解决了堆叠问题,但它具有与matousc的响应相同的问题,因为Y轴切割为9,然而现在这些小节结束了,是否有任何方法可以确保尺寸保持在线路并一路向上?你是否也知道将所有这些条组合在一起的方法,以便我们可以在他们旁边绘制第二组?谢谢! – Tom 2014-09-05 10:06:28

+0

蜱虫在9之后消失,因为你告诉他们。如果你希望它们是自动的,删除'plt.yticks(np.arange(0,10,1))'。 – Ajean 2014-09-05 12:58:02