Maison  >  Article  >  développement back-end  >  Comment créer des graphiques à barres empilées en cluster pour plusieurs DataFrames en Python ?

Comment créer des graphiques à barres empilées en cluster pour plusieurs DataFrames en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 19:07:30259parcourir

How to Create Clustered Stacked Bar Charts for Multiple DataFrames in Python?

Création de graphiques à barres empilées en cluster pour plusieurs dataFrames

Énoncé du problème

Lorsque vous traitez plusieurs dataframes avec des colonnes et des index identiques, il peut être souhaitable de créez des graphiques à barres empilées en cluster pour visualiser les données. Le défi se pose lorsque vous souhaitez empiler les barres pour chaque trame de données séparément, regroupées par leurs index correspondants.

Solution avec Pandas et Matplotlib

En utilisant une combinaison de Pandas et Matplotlib, nous pouvons y parvenir en ajustant manuellement les positions et les motifs de hachures des rectangles de barres. Voici une solution détaillée :

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

def plot_clustered_stacked(dfall, labels=None, title="multiple stacked bar plot",  H="/" , **kwargs):

    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</code>

Solution avec Seaborn

En utilisant la fonction barplot de Seaborn, nous pouvons créer des graphiques à barres empilés mais ne pouvons pas empiler nativement des barres pour différentes trames de données. Pour surmonter ce problème, nous pouvons utiliser la solution de contournement suivante :

  1. Convertissez les dataframes dans un format « ordonné » à l'aide de pd.melt().
  2. Calculez la somme cumulée de chaque barre en utilisant groupby et cumsum(), créant une nouvelle colonne appelée vcs.
  3. Parcourez les groupes de variables et tracez la somme cumulée à l'aide de sns.barplot().
<code class="python">import seaborn as sns

# Convert dataframes to tidy format
dfall.set_index([&quot;Name&quot;, &quot;index&quot;, &quot;variable&quot;], inplace=1)
dfall[&quot;vcs&quot;] = dfall.groupby(level=[&quot;Name&quot;, &quot;index&quot;]).cumsum()
dfall.reset_index(inplace=True)

# Create color palette
c = [&quot;blue&quot;, &quot;purple&quot;, &quot;red&quot;, &quot;green&quot;, &quot;pink&quot;]

# Iterate through groups and plot stacked bars
for i, g in enumerate(dfall.groupby(&quot;variable&quot;)):
    ax = sns.barplot(data=g[1],
                    x=&quot;index&quot;,
                    y=&quot;vcs&quot;,</code>

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