使用matplotlib使用不同顺序颜色的堆积条形图

2024-04-27 04:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的乞丐。我正在尝试用不同的顺序颜色制作一个水平条形图。

我有一个如下所示的数据集:

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)

事实上,我完全迷失在自己的尝试中。任何帮助都会非常,非常有帮助。 非常感谢您的关注!


Tags: 数据列表data顺序颜色水平图片数字
2条回答

这是一个很长的程序,但它可以工作,我添加了一个虚拟数据来区分行数和列数:

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

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

相关问题 更多 >