[PYTHON] Zeichnen Sie eine hierarchische Achsenbeschriftung mit matplotlib + pandas

Wenn Sie einen Matplotlib-Datenrahmen so wie er ist mit einem hierarchischen Index zeichnen, werden die Achsenbeschriftungen als Taples angezeigt, was etwas enttäuschend ist.

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

a = pd.DataFrame(np.random.random([6, 2]),
                 index=pd.MultiIndex.from_product([['group1', 'group2'],['item1', 'item2', 'item3']]),
                 columns=['data1', 'data2'])

a.plot.bar()

img1.png

Ich wollte eine Achsenbeschriftung hinzufügen, die es leicht macht zu erkennen, dass die Daten eine hierarchische Struktur haben, aber vorerst scheint es, dass dies mit der folgenden Methode durchgeführt werden kann.

def set_hierarchical_xlabels(index, ax=None,
                             bar_xmargin=0.1, #Ränder am linken und rechten Ende der Linie, X-Achsen-Skala
                             bar_yinterval=0.1, #Relativer Wert mit dem vertikalen Abstand der Linie und der Länge der Y-Achse als 1?
                            ):
    from itertools import groupby
    from matplotlib.lines import Line2D

    ax = ax or plt.gca()

    assert isinstance(index, pd.MultiIndex)
    labels = ax.set_xticklabels([s for *_, s in index])
    for lb in labels:
        lb.set_rotation(0)

    transform = ax.get_xaxis_transform()

    for i in range(1, len(index.codes)):
        xpos0 = -0.5 #Koordinaten auf der linken Seite der Zielgruppe
        for (*_, code), codes_iter in groupby(zip(*index.codes[:-i])):
            xpos1 = xpos0 + sum(1 for _ in codes_iter) #Koordinaten auf der rechten Seite der Zielgruppe
            ax.text((xpos0+xpos1)/2, (bar_yinterval * (-i-0.1)),
                    index.levels[-i-1][code],
                    transform=transform,
                    ha="center", va="top")
            ax.add_line(Line2D([xpos0+bar_xmargin, xpos1-bar_xmargin],
                               [bar_yinterval * -i]*2,
                               transform=transform,
                               color="k", clip_on=False))
            xpos0 = xpos1

a.plot.bar()
set_hierarchical_xlabels(a.index)

img2.png

Ich denke, dass sich das detaillierte Design je nach Zweck und Geschmack ändern wird. Es ist also in Ordnung, wenn Sie es entsprechend den obigen Angaben ändern. Sie können auch mit MultiIndex 3 oder mehr Ebenen zeichnen.

Recommended Posts

Zeichnen Sie eine hierarchische Achsenbeschriftung mit matplotlib + pandas
2-Achsen-Plot mit Matplotlib
Zeichne Japanisch mit matplotlib auf Ubuntu
Zeichnen Sie mit matplotlib ein loses Diagramm
Vielseitige Datenerfassung mit Pandas + Matplotlib
Zeichnen Sie ein Diagramm mit Pandas + XlsxWriter
Zeichnen Sie einfach Diagramme mit matplotlib
Zeichne Riapnov Fractal mit Python, matplotlib
Zeichnen Sie eine flache Oberfläche mit einem Matplotlib-3D-Diagramm
Zeichnen Sie in Jupyter ein Diagramm mit japanischen Beschriftungen
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
Lesen Sie Python-CSV-Daten mit Pandas ⇒ Graph mit Matplotlib
Zeichnen Sie ein Diagramm, indem Sie es mit Pandas groupby verarbeiten
[Python] Zeichnen mehrerer Diagramme mit Matplotlib
Implementieren Sie "Data Visualization Design # 3" mit Pandas und Matplotlib
Analysieren Sie Apache-Zugriffsprotokolle mit Pandas und Matplotlib
Animation mit matplotlib
Japanisch mit Matplotlib
Animation mit matplotlib
Histogramm mit Matplotlib
Erstellen Sie eine Animation mit matplotlib
matplotlib: Ersetzen Sie die Achse selbst durch eine andere.
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Zeichnen Sie eine erdähnliche Flussanimation mit Matplotlib und Cartopy
Zeichnen Sie gewaltsam so etwas wie ein Flussdiagramm mit Python, matplotlib
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Mit Pandas schnell visualisieren
Bootstrap-Sampling mit Pandas
Datensätze mit Pandas verarbeiten (2)
Zusammenführen von Datensätzen mit Pandas
Pandas lernen mit Chemoinfomatik
Heatmap von Python + matplotlib
Banddiagramm mit Matplotlib
Datenvisualisierung mit Pandas
Lernen Sie mit Chemo Informatics Matplotlib
Datenmanipulation mit Pandas!
Echtzeitzeichnung mit Matplotlib
Daten mit Pandas mischen
Verschiedene Farbleisten mit Matplotlib
3D-Plot mit Matplotlib
[Numpy / Pandas / Matplotlib Übung 01]
Stellen Sie die Achsen mit matplotlib ein
Mathematik mit Python studieren: Zeichnen Sie mit matplotlib ein Sympy-Diagramm (Scipy-Diagramm)
Formatieren Sie die Zeitachse des Pandas-Zeitreihendiagramms mit matplotlib neu