我需要一些帮助用matlibplot在python中制作一组堆叠的条形图。我的基本代码如下,但我的问题是如何为超出第二个efficiently的任何元素生成bottom的值。我可以让示例图正确堆叠(从下到上总是a,b,c,d)
import numpy as np
import matplotlib.pyplot as plt
ind = np.arange(3)
a = [3,6,9]
b = [2,7,1]
c = [0,3,1]
d = [4,0,3]
p1 = plt.bar(ind, a, 1, color='#ff3333')
p2 = plt.bar(ind, b, 1, color='#33ff33', bottom=a)
p3 = plt.bar(ind, c, 1, color='#3333ff', bottom=[a[j] +b[j] for j in range(len(a))])
p4 = plt.bar(ind, d, 1, color='#33ffff', bottom=[a[j] +b[j] +c[j] for j in range(len(a))])
plt.show()
我的最终代码可能有非常多的条形图和不断扩展的函数bottom = ...不是最好的解决方案。如果你也能解释一下我需要如何派生这个值,那就太好了。有没有numpy函数。
非常感谢!另外,我一直在寻找答案,但我不明白我能找到什么。
发布于 2014-01-08 06:12:15
我最近刚刚遇到了同样的问题。之后,我决定把所有这些都包装在一个很好的类中。对于任何感兴趣的人,您可以在此处获得堆叠条形图类的实现:
https://github.com/minillinim/stackedBarGraph
它允许缩放堆叠图以及设置条宽和设置高度(具有缩放内侧)。
给定如下数据集:
d = np.array([[101.,0.,0.,0.,0.,0.,0.],
[92.,3.,0.,4.,5.,6.,0.],
[56.,7.,8.,9.,23.,4.,5.],
[81.,2.,4.,5.,32.,33.,4.],
[0.,45.,2.,3.,45.,67.,8.],
[99.,5.,0.,0.,0.,43.,56.]])
d_heights = [1.,2.,3.,4.,5.,6.]
d_widths = [.5,1.,3.,2.,1.,2.]
d_labels = ["fred","julie","sam","peter","rob","baz"]
d_colors = ['#2166ac',
'#fee090',
'#fdbb84',
'#fc8d59',
'#e34a33',
'#b30000',
'#777777']
它可以制作这样的图像:
带着爱的GPLv3。
发布于 2013-09-28 05:29:11
将值转换为numpy数组将使您的工作更轻松:
data = np.array([a, b, c, d])
bottom = np.cumsum(data, axis=0)
colors = ('#ff3333', '#33ff33', '#3333ff', '#33ffff')
plt.bar(ind, data[0], color=colors[0])
for j in xrange(1, data.shape[0]):
plt.bar(ind, data[1], color=colors[j], bottom=bottom[i-1])
或者,为了摆脱第一个bar的令人讨厌的特殊情况:
data = np.array([a, b, c, d])
bottom = np.vstack((np.zeros((data.shape[1],), dtype=data.dtype),
np.cumsum(data, axis=0)[:-1]))
colors = ('#ff3333', '#33ff33', '#3333ff', '#33ffff')
for dat, col, bot in zip(data, colors, bottom):
plt.bar(ind, dat, color=col, bottom=bot)
发布于 2013-09-28 05:18:16
[sum(values) for values in zip(a, b, c)]
在Python 2中,您还可以
map(sum, zip(a, b, c))
但是Python3需要
list(map(sum, zip(a, b, c)))
这样就没那么好了。
您可以封装以下内容:
def sumzip(*items):
return [sum(values) for values in zip(*items)]
然后做
p1 = plt.bar(ind, a, 1, color='#ff3333')
p2 = plt.bar(ind, b, 1, color='#33ff33', bottom=sumzip(a))
p3 = plt.bar(ind, c, 1, color='#3333ff', bottom=sumzip(a, b))
p4 = plt.bar(ind, d, 1, color='#33ffff', bottom=sumzip(a, b, c))
也是。
如果a
、b
、c
和d
是numpy数组,您还可以执行sum([a, b, c])
a = np.array([3,6,9])
b = np.array([2,7,1])
c = np.array([0,3,1])
d = np.array([4,0,3])
p1 = plt.bar(ind, a, 1, color='#ff3333')
p2 = plt.bar(ind, b, 1, color='#33ff33', bottom=sum([a]))
p3 = plt.bar(ind, c, 1, color='#3333ff', bottom=sum([a, b]))
p4 = plt.bar(ind, d, 1, color='#33ffff', bottom=sum([a, b, c]))
https://stackoverflow.com/questions/19060144
复制相似问题