2012-06-30 41 views
4

我是python的一名成员。我正在尝试使用不同顺序的颜色制作水平条形图。使用matplotlib以不同顺序的颜色堆积的条形图

我有一个数据组,如一个在下面:

dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, 
      {'A':34, 'B':68, 'C':32, 'D':38}, 
      {'A':35, 'B':45, 'C':66, 'D':50}, 
      {'A':23, 'B':23, 'C':21, 'D':16}] 
data_orders = [['A', 'B', 'C', 'D'], 
       ['B', 'A', 'C', 'D'], 
       ['A', 'B', 'D', 'C'], 
       ['B', 'A', 'C', 'D']] 

第一列表包含数字数据,而第二个包含每个数据项的顺序。我需要第二个列表,因为A,B,C和D的顺序在我的案例中呈现时对于数据集是至关重要的。

使用上面的数据,我想制作一个堆叠的条形图,如下图所示。它是由我手动MS Excel制作的。我希望现在要做的就是使用Matplotlib来制作这种类型的条形图,并使用类似上述数据集的数据集以更自动的方式。如果可能的话,我也想添加图例。

Stacked Bar Chart with Differently Ordered Colors (An Example)

实际上,我已经完全沉迷在我自己尝试这个。任何帮助将非常非常有帮助。 非常感谢您的关注!

+0

起飞看看这个http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/bar_stacked.py –

+0

亲爱的Ashwini,谢谢你提供这些信息。这是Matplotlib页面中引用的例子吗?我将这个作为“教科书”使用,但问题在于,将这个模型“应用”到我的实际目的似乎超出了我的能力。这就是为什么我发布我的问题!但是你关于枚举的建议对我来说是一个暗示。非常感谢! –

回答

11

这是一个漫长的程序,但它的作品,我加了一个虚拟的数据来区分的行数和列数:

import numpy as np 
from matplotlib import pyplot as plt 

dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, 
      {'A':34, 'B':68, 'C':32, 'D':38}, 
      {'A':35, 'B':45, 'C':66, 'D':50}, 
      {'A':23, 'B':23, 'C':21, 'D':16}, 
      {'A':35, 'B':45, 'C':66, 'D':50}] 
data_orders = [['A', 'B', 'C', 'D'], 
       ['B', 'A', 'C', 'D'], 
       ['A', 'B', 'D', 'C'], 
       ['B', 'A', 'C', 'D'], 
       ['A', 'B', 'C', 'D']] 
colors = ["r","g","b","y"] 
names = sorted(dataset[0].keys()) 
values = np.array([[data[name] for name in order] for data,order in zip(dataset, data_orders)]) 
lefts = np.insert(np.cumsum(values, axis=1),0,0, axis=1)[:, :-1] 
orders = np.array(data_orders) 
bottoms = np.arange(len(data_orders)) 

for name, color in zip(names, colors): 
    idx = np.where(orders == name) 
    value = values[idx] 
    left = lefts[idx] 
    plt.bar(left=left, height=0.8, width=value, bottom=bottoms, 
      color=color, orientation="horizontal", label=name) 
plt.yticks(bottoms+0.4, ["data %d" % (t+1) for t in bottoms]) 
plt.legend(loc="best", bbox_to_anchor=(1.0, 1.00)) 
plt.subplots_adjust(right=0.85) 
plt.show() 

结果数字是:

enter image description here

+0

非常感谢您抽出宝贵时间。这非常有帮助!我从你的脚本中借鉴了很多。 –

1
>>> dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, 
      {'A':34, 'B':68, 'C':32, 'D':38}, 
      {'A':35, 'B':45, 'C':66, 'D':50}, 
      {'A':23, 'B':23, 'C':21, 'D':16}] 

>>> data_orders = [['A', 'B', 'C', 'D'], 
       ['B', 'A', 'C', 'D'], 
       ['A', 'B', 'D', 'C'], 
       ['B', 'A', 'C', 'D']] 
>>> for i,x in enumerate(data_orders): 
    for y in x: 
     #do something here with dataset[i][y] in matplotlib 
+0

亲爱的阿什维尼,感谢您抽出时间回复我的问题。我会尽我所能来弄清楚这可以如何解决我的问题! –

+0

@miyazaki_tara另一种方式可以创建一个新的列表,其中数据已按照'data_orders'排列。 –

+0

@miyazaki_tara''[data_orders [i]中y的[[数据集[i] [y]]'范围内的len(len(data_orders))]'将返回 '[[19,39,61,70],[68 ,34,32,38],[35,45,50,66],[23,23,21,16]]' –