Beim Plotten von Daten in Form eines Balkendiagramms mit Matplotlib ist es oft wünschenswert, zwischen verschiedenen Datengruppen zu unterscheiden. Die Datenstruktur könnte wie folgt aussehen:
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} } }
Die gewünschte Ausgabe, dargestellt als Bild, ist:
[Bild zeigt Balkendiagramm mit beschrifteten Gruppen]
Da es in Matplotlib keine integrierte Lösung zum Hinzufügen von Gruppenbezeichnungen gibt, kann eine benutzerdefinierte Implementierung erfolgen entwickelt:
#!/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')
Die Funktion mk_groups wandelt die Daten in ein geeignetes Format zur Erstellung des Diagramms um. add_line ist dafür verantwortlich, an bestimmten Positionen vertikale Linien zum Nebenplot hinzuzufügen. Die Funktion label_group_bar generiert das Balkendiagramm mit den Gruppenbeschriftungen darunter.
Das Ergebnis dieser Implementierung ist ein Balkendiagramm mit klar beschrifteten Gruppen:
[Bild zeigt Balkendiagramm mit beschrifteten Gruppen]
Das obige ist der detaillierte Inhalt vonWie füge ich Gruppenbeschriftungen zu Matplotlib-Balkendiagrammen hinzu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!