matplotlib を使用してデータを棒グラフの形式でプロットする場合、異なるデータ グループを区別することが望ましいことがよくあります。データ構造は次のようになります。
data = {'Room A': {'Shelf 1': {'Milk': 10, 'Water': 20}, 'Shelf 2': {'Sugar': 5, 'Honey': 6} }, 'Room B': {'Shelf 1': {'Wheat': 4, 'Corn': 7}, 'Shelf 2': {'Chicken': 2, 'Cow': 1} } }
画像として表される目的の出力は次のとおりです。
[グループのラベルが付けられた棒グラフを示す画像]
matplotlib にはグループ ラベルを追加するための組み込みソリューションがないため、カスタム実装を考案できます。
#!/usr/bin/env python from matplotlib import pyplot as plt def mk_groups(data): try: newdata = data.items() except: return thisgroup = [] groups = [] for key, value in newdata: newgroups = mk_groups(value) if newgroups is None: thisgroup.append((key, value)) else: thisgroup.append((key, len(newgroups[-1]))) if groups: groups = [g + n for n, g in zip(newgroups, groups)] else: groups = newgroups return [thisgroup] + groups def add_line(ax, xpos, ypos): line = plt.Line2D([xpos, xpos], [ypos + .1, ypos], transform=ax.transAxes, color='black') line.set_clip_on(False) ax.add_line(line) def label_group_bar(ax, data): groups = mk_groups(data) xy = groups.pop() x, y = zip(*xy) ly = len(y) xticks = range(1, ly + 1) ax.bar(xticks, y, align='center') ax.set_xticks(xticks) ax.set_xticklabels(x) ax.set_xlim(.5, ly + .5) ax.yaxis.grid(True) scale = 1. / ly for pos in xrange(ly + 1): # change xrange to range for python3 add_line(ax, pos * scale, -.1) ypos = -.2 while groups: group = groups.pop() pos = 0 for label, rpos in group: lxpos = (pos + .5 * rpos) * scale ax.text(lxpos, ypos, label, ha='center', transform=ax.transAxes) add_line(ax, pos * scale, ypos) pos += rpos add_line(ax, pos * scale, ypos) ypos -= .1 if __name__ == '__main__': data = {'Room A': {'Shelf 1': {'Milk': 10, 'Water': 20}, 'Shelf 2': {'Sugar': 5, 'Honey': 6} }, 'Room B': {'Shelf 1': {'Wheat': 4, 'Corn': 7}, 'Shelf 2': {'Chicken': 2, 'Cow': 1} } } fig = plt.figure() ax = fig.add_subplot(1,1,1) label_group_bar(ax, data) fig.subplots_adjust(bottom=0.3) fig.savefig('label_group_bar_example.png')
mk_groups 関数は、データを適切な形式に変換します。チャートを作成しています。 add_line は、サブプロットの指定された位置に垂直線を追加します。 label_group_bar 関数は、下にグループ ラベルが付いた棒グラフを生成します。
この実装の結果は、グループに明確にラベルが付けられた棒グラフです。
[グループにラベルが付けられた棒グラフを示す画像]
以上がMatplotlib 棒グラフにグループ ラベルを追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。