5

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

最初のリストには数値データが含まれ、2 番目のリストには各データ項目の順序が含まれます。ここでは 2 番目のリストが必要です。これは、A、B、C、および D の順序が、私の場合にそれらを提示するときにデータセットにとって重要であるためです。

上記のようなデータを使用して、下の図のような積み上げ棒グラフを作成したいと考えています。それは私が手動でMS Excelで作成しました。私が今やりたいことは、上記のようなデータセットで Matplotlib を使用して、このタイプの棒グラフをより自動化する方法で作成することです。可能であれば、チャートに凡例も追加したいと考えています。

色の順序が異なる積み上げ棒グラフ (例)

実際、私はこれを自分で試すのに完全に迷いました。どんな助けも非常に役に立ちます。ご清聴ありがとうございました!

4

2 に答える 2

13

これは長いプログラムですが、動作します。行数と列数を区別するためにダミー データを 1 つ追加しました。

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

結果の数値は次のとおりです。

ここに画像の説明を入力

于 2012-06-30T13:22:42.170 に答える
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
于 2012-06-30T10:02:59.723 に答える