Heim >Backend-Entwicklung >Python-Tutorial >Wie füge ich Gruppenbeschriftungen zu Matplotlib-Balkendiagrammen hinzu?

Wie füge ich Gruppenbeschriftungen zu Matplotlib-Balkendiagrammen hinzu?

Susan Sarandon
Susan SarandonOriginal
2024-11-19 14:07:02658Durchsuche

How to Add Group Labels to Matplotlib Bar Charts?

Hinzufügen von Gruppenbezeichnungen zu Balkendiagrammen

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]

Implementierung Gruppenbezeichnungen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn