Apabila memplot data dalam bentuk carta bar menggunakan matplotlib, selalunya wajar untuk membezakan antara kumpulan data yang berbeza. Struktur data mungkin menyerupai yang berikut:
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} } }
Output yang diingini, diwakili sebagai imej, ialah:
[Imej menunjukkan carta bar dengan kumpulan berlabel]
Memandangkan tiada penyelesaian terbina dalam untuk menambah label kumpulan dalam matplotlib, pelaksanaan tersuai boleh dicipta:
#!/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')
Fungsi mk_groups menukar data kepada format yang sesuai untuk mencipta carta. add_line bertanggungjawab untuk menambah garis menegak pada subplot pada kedudukan yang ditentukan. Fungsi label_group_bar menjana carta bar dengan label kumpulan di bawah.
Hasil pelaksanaan ini ialah carta bar dengan kumpulan yang dilabel dengan jelas:
[Imej menunjukkan carta bar dengan kumpulan berlabel]
Atas ialah kandungan terperinci Bagaimana untuk Menambah Label Kumpulan pada Carta Bar Matplotlib?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!