270*_*ohn 18 python numpy matplotlib stackedbarseries
我需要一些帮助,使用matlibplot在python中制作一组堆积的条形图.我的基本代码如下,但我的问题是如何产生的价值底部超越二号一个任何元素有效.我可以让示例图正确堆叠(总是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()
Run Code Online (Sandbox Code Playgroud)
我的最终代码可能有非常多的条形和不断扩展的函数bottom = [...]不能是最好的解决方案.如果您还可以解释我需要如何获得该值,那将会很棒.有一个numpy功能.
非常感谢你!!!PS我找了答案,但我不明白我能找到什么.
min*_*nim 29
我刚刚遇到了同样的问题.之后我决定把它全部包装在一个很好的课堂上.对于任何感兴趣的人,您可以在此处获得堆积条形图类的实现:
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']
Run Code Online (Sandbox Code Playgroud)
它可以像这样制作图像:

GPLv3充满爱意.
Jai*_*ime 14
将您的值转换为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])
Run Code Online (Sandbox Code Playgroud)
或者,为了摆脱第一个酒吧令人讨厌的特殊情况:
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)
Run Code Online (Sandbox Code Playgroud)
[sum(values) for values in zip(a, b, c)]
Run Code Online (Sandbox Code Playgroud)
在Python 2中,您也可以这样做
map(sum, zip(a, b, c))
Run Code Online (Sandbox Code Playgroud)
但Python 3需要
list(map(sum, zip(a, b, c)))
Run Code Online (Sandbox Code Playgroud)
哪个不太好看.
你可以封装这个:
def sumzip(*items):
return [sum(values) for values in zip(*items)]
Run Code Online (Sandbox Code Playgroud)
然后呢
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))
Run Code Online (Sandbox Code Playgroud)
太.
如果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]))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26552 次 |
| 最近记录: |