[PYTHON] Dessinez une étiquette d'axe hiérarchique avec matplotlib + pandas

Si vous tracez un bloc de données Matplotlib avec un index hiérarchique tel quel, les étiquettes des axes seront affichées sous forme de taples, ce qui est un peu décevant.

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

Je voulais ajouter une étiquette d'axe qui permette de voir facilement que les données ont une structure hiérarchique, mais pour le moment, il semble que cela puisse être fait par la méthode suivante.

def set_hierarchical_xlabels(index, ax=None,
                             bar_xmargin=0.1, #Marges aux extrémités gauche et droite de la ligne, échelle de l'axe X
                             bar_yinterval=0.1, #Valeur relative avec l'espacement vertical de la ligne et la longueur de l'axe Y égale à 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 #Coordonnées sur le côté gauche du groupe cible
        for (*_, code), codes_iter in groupby(zip(*index.codes[:-i])):
            xpos1 = xpos0 + sum(1 for _ in codes_iter) #Coordonnées sur le côté droit du groupe cible
            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

Je pense que la conception détaillée changera en fonction du but et du goût, donc ce n'est pas grave si vous la modifiez de manière appropriée en vous référant à ce qui précède. Vous pouvez également tracer avec MultiIndex de 3 couches ou plus.

Recommended Posts

Dessinez une étiquette d'axe hiérarchique avec matplotlib + pandas
Graphique 2 axes avec Matplotlib
Dessinez le japonais avec matplotlib sur Ubuntu
Dessinez un graphique lâche avec matplotlib
Traçage de données polyvalent avec pandas + matplotlib
Dessinez un graphique avec des pandas + XlsxWriter
Dessinez facilement des graphiques avec matplotlib
Dessinez Riapnov Fractal avec Python, matplotlib
Dessinez une surface plane avec un graphique 3D matplotlib
Dessinez un graphique avec des étiquettes japonaises dans Jupyter
Comment dessiner un graphique à 2 axes avec pyplot
Lire les données csv Python avec Pandas ⇒ Graphique avec Matplotlib
Dessinez un graphique en traitant avec Pandas groupby
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
Implémentez "Data Visualization Design # 3" avec pandas et matplotlib
Analysez les journaux d'accès Apache avec Pandas et Matplotlib
Animation avec matplotlib
Japonais avec matplotlib
Animation avec matplotlib
histogramme avec matplotlib
Faire une animation avec matplotlib
matplotlib: remplacez l'axe lui-même par un autre.
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Dessinez une animation de flux semblable à la Terre avec matplotlib et cartopy
Dessinez de force quelque chose comme un organigramme avec Python, matplotlib
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Visualisez rapidement avec les pandas
Échantillonnage bootstrap avec Pandas
Traitement des ensembles de données avec des pandas (2)
Fusionner les ensembles de données avec les pandas
Pandas apprenant avec la chimioinfomatique
Carte thermique par Python + matplotlib
Graphique de bande avec matplotlib
Visualisation des données avec les pandas
Apprenez avec Chemo Informatics Matplotlib
Manipulation des données avec les Pandas!
Dessin en temps réel avec matplotlib
Mélangez les données avec les pandas
Différentes barres de couleurs avec Matplotlib
Graphique 3D avec matplotlib
[Exercice Numpy / pandas / matplotlib 01]
Ajustez les axes avec matplotlib
Étudier les mathématiques avec Python: dessiner un graphe sympy (scipy) avec matplotlib
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib