Maison  >  Article  >  développement back-end  >  Comment créer des graphiques à barres empilées en cluster à l'aide de Pandas et Matplotlib ou Seaborn ?

Comment créer des graphiques à barres empilées en cluster à l'aide de Pandas et Matplotlib ou Seaborn ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 11:56:02552parcourir

How to create clustered stacked bar plots using Pandas and Matplotlib or Seaborn?

Création de diagrammes à barres empilées en cluster

Problème :

Considérons deux cadres de données, df1 et df2, avec le même index mais des colonnes potentiellement différentes, où chacun la ligne représente une catégorie et chaque colonne représente une métrique. L'objectif est de créer des graphiques à barres empilées groupés où les barres de chaque catégorie sont regroupées et les barres de chaque trame de données sont empilées les unes sur les autres.

Solution utilisant Pandas et Matplotlib :

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

def plot_clustered_stacked(df_list, labels=None, title="Clustered Stacked Bar Plot"):
    n_dataframes = len(df_list)
    n_columns = len(df_list[0].columns) 
    n_index = len(df_list[0].index)
    
    fig, ax = plt.subplots()

    # Iterate through each dataframe
    for i, df in enumerate(df_list):
        # Plot the bars for the current dataframe
        df.plot(kind="bar", 
                 ax=ax, 
                 linewidth=0,
                 stacked=True,
                 legend=False, 
                 grid=False)

    # Adjust the position and width of the bars
    for df, j in zip(df_list, range(n_dataframes)):
        for n, rect in enumerate(ax.patches):
            if rect.get_y() == 0:
                # Stacked bar for dataframe df
                rect.set_x(rect.get_x() + j / float(n_dataframes))
                rect.set_width(1 / float(n_dataframes))

    # Set the x-axis labels and ticks
    ax.set_xticks(np.arange(0, n_index) + 0.5)
    ax.set_xticklabels(df.index)

    # Add a legend for the dataframes
    plt.legend([df.stack(level=0).index[0] for df in df_list], labels)

    # Set the plot title
    ax.set_title(title)

# Create example dataframes
df1 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"])
df2 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"])

# Plot the clustered stacked bar plot
plot_clustered_stacked([df1, df2], labels=["df1", "df2"])</code>

Solution utilisant Seaborn et Pandas :

<code class="python">import seaborn as sns

# Concatenate the dataframes into a single dataframe with a wide format
df = pd.concat([df1.reset_index().melt(id_vars=["index"]), 
                 df2.reset_index().melt(id_vars=["index"])])

# Plot the clustered stacked bar plot
g = sns.FacetGrid(data=df, col="variable", hue="index")
g.map_dataframe(sns.barplot, order=df["index"].unique())</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