python - 更高效的matplotlib堆积条形图——如何计算底值

标签 python numpy matplotlib stackedbarseries

我需要一些帮助,在 python 中使用 matlibplot 制作一组堆叠条形图。我的基本代码如下,但我的问题是如何有效地为第二个元素以外的任何元素生成 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函数。

非常感谢!!! PS 我已经搜索了答案,但我不明白我能找到什么。

最佳答案

我最近遇到了同样的问题。之后,我决定把这一切都包在一个很好的类里面。对于任何感兴趣的人,您都可以在此处获得堆叠条形图类的实现:

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']

它可以制作这样的图像:

stacked bar graph

GPLv3 与爱。

关于python - 更高效的matplotlib堆积条形图——如何计算底值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19060144/

相关文章:

python - 使用 Matplotlib 在 Python 中为 Langdon 的 Ant 制作动画

python - 应用服务器的单元测试

python - 将 Shutil.make_archive 与 zipfile.ZIP_STORED 一起使用吗?

python - 查找与值列表匹配的行的有效方法

python - 将 Pandas 数据帧索引保存到文件

python - 基于array和colormap对matplotlib的背景进行阴影处理

python - pyspark:计算列表中不同元素的出现次数

python - 索引错误: invalid index

python - 有没有办法在绘图时重置 matplotlib 线条样式?

python - 线条不显示在条形图上