Maison  >  Article  >  développement back-end  >  Comment puis-je créer des diagrammes à barres empilées en cluster en Python à l'aide de Pandas et Matplotlib ?

Comment puis-je créer des diagrammes à barres empilées en cluster en Python à l'aide de Pandas et Matplotlib ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 15:26:29314parcourir

How can I create clustered stacked bar plots in Python using Pandas and Matplotlib?

Création de diagrammes à barres empilées en cluster avec Pandas et Matplotlib

Dans cet article, nous explorerons une méthode pour créer des diagrammes à barres empilées en cluster à l'aide de Pandas. et Matplotlib. Cette technique vous permet de visualiser plusieurs ensembles de données avec des colonnes et un index identiques côte à côte, avec des barres empilées les unes sur les autres.

Comprendre le problème

Considérez ce qui suit scénario : vous disposez de trois trames de données, chacune contenant des valeurs pour les colonnes "I" et "J" avec le même index. Vous souhaitez créer des graphiques à barres empilées pour chaque trame de données mais disposés d'une manière spécifique :

  • Barre pour la trame de données 1 à l'index A
  • Barre pour la trame de données 2 à l'index A
  • Barre pour la trame de données 1 à l'index B
  • Barre pour la trame de données 2 à l'index B

Implémentation de la solution

L'extrait de code suivant démontre une solution efficace à ce problème :

<code class="python">import pandas as pd
import matplotlib.cm as cm
import numpy as np
import matplotlib.pyplot as plt

def plot_clustered_stacked(dfall, labels=None, title="multiple stacked bar plot",  H="/", **kwargs):
    """Given a list of dataframes, with identical columns and index, create a clustered stacked bar plot.
    labels is a list of the names of the dataframe, used for the legend
    title is a string for the title of the plot
    H is the hatch used for identification of the different dataframe"""

    n_df = len(dfall)
    n_col = len(dfall[0].columns) 
    n_ind = len(dfall[0].index)
    axe = plt.subplot(111)

    for df in dfall : # for each data frame
        axe = df.plot(kind="bar",
                      linewidth=0,
                      stacked=True,
                      ax=axe,
                      legend=False,
                      grid=False,
                      **kwargs)  # make bar plots

    h,l = axe.get_legend_handles_labels() # get the handles we want to modify
    for i in range(0, n_df * n_col, n_col): # len(h) = n_col * n_df
        for j, pa in enumerate(h[i:i+n_col]):
            for rect in pa.patches: # for each index
                rect.set_x(rect.get_x() + 1 / float(n_df + 1) * i / float(n_col))
                rect.set_hatch(H * int(i / n_col)) #edited part     
                rect.set_width(1 / float(n_df + 1))

    axe.set_xticks((np.arange(0, 2 * n_ind, 2) + 1 / float(n_df + 1)) / 2.)
    axe.set_xticklabels(df.index, rotation = 0)
    axe.set_title(title)

    # Add invisible data to add another legend
    n=[]
    for i in range(n_df):
        n.append(axe.bar(0, 0, color="gray", hatch=H * i))

    l1 = axe.legend(h[:n_col], l[:n_col], loc=[1.01, 0.5])
    if labels is not None:
        l2 = plt.legend(n, labels, loc=[1.01, 0.1]) 
    axe.add_artist(l1)
    return axe

# create fake dataframes
df1 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df2 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df3 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])

# Then, just call :
plot_clustered_stacked([df1, df2, df3],[“df1”, “df2”, “df3”])</code>

Utilisation de la fonction

Pour utiliser cette fonction, transmettez une liste de trames de données comme premier argument. L'argument suivant peut être une liste d'étiquettes pour la légende. L'argument titre spécifie le titre de l'intrigue. Enfin, H représente le motif de hachures utilisé pour différencier chaque trame de données.

Sortie

Le tracé résultant affichera des barres empilées groupées pour chaque trame de données, disposées côte à côte. Les barres de chaque index seront empilées les unes sur les autres, avec différentes hachures indiquant différentes trames de données.

Fonctionnalités supplémentaires

Personnalisation des couleurs :

Vous pouvez personnaliser les couleurs des barres en passant un argument cmap à la fonction plot_clustered_stacked, qui prend une instance d'une palette de couleurs matplotlib. Voici un exemple :

<code class="python">plot_clustered_stacked([df1, df2, df3], ["df1", "df2", "df3"], cmap=plt.cm.viridis)</code>

Conclusion

Cette approche fournit une méthode simple et efficace pour créer des diagrammes à barres empilées en cluster à l'aide de Pandas et Matplotlib. Il vous permet de visualiser plusieurs ensembles de données côte à côte de manière claire et informative. En ajustant les motifs et les couleurs des hachures, vous pouvez personnaliser davantage le tracé pour l'adapter à vos besoins spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn