Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit Pandas und Matplotlib gruppierte gestapelte Balkendiagramme in Python erstellen?

Wie kann ich mit Pandas und Matplotlib gruppierte gestapelte Balkendiagramme in Python erstellen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 15:26:29314Durchsuche

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

Erstellen gruppierter gestapelter Balkendiagramme mit Pandas und Matplotlib

In diesem Artikel werden wir eine Methode zum Erstellen gruppierter gestapelter Balkendiagramme mit Pandas untersuchen und Matplotlib. Mit dieser Technik können Sie mehrere Datensätze mit identischen Spalten und Indizes nebeneinander visualisieren, wobei die Balken übereinander gestapelt sind.

Das Problem verstehen

Bedenken Sie Folgendes Szenario: Sie haben drei Datenrahmen, die jeweils Werte für die Spalten „I“ und „J“ mit demselben Index enthalten. Sie möchten für jeden Datenrahmen gestapelte Balkendiagramme erstellen, die jedoch auf eine bestimmte Weise angeordnet sind:

  • Balken für Datenrahmen 1 bei Index A
  • Balken für Datenrahmen 2 bei Index A
  • Balken für Datenrahmen 1 bei Index B
  • Balken für Datenrahmen 2 bei Index B

Implementierung der Lösung

Der folgende Codeausschnitt zeigt eine effiziente Lösung für dieses Problem:

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

Verwenden der Funktion

Um diese Funktion zu verwenden, übergeben Sie eine Liste von Datenrahmen als erstes Argument. Das nächste Argument kann eine Liste von Beschriftungen für die Legende sein. Das Argument title gibt den Titel der Handlung an. Schließlich stellt H das Schraffurmuster dar, das zur Unterscheidung jedes Datenrahmens verwendet wird.

Ausgabe

Das resultierende Diagramm zeigt gruppierte gestapelte Balken für jeden Datenrahmen nebeneinander angeordnet an. Die Balken für jeden Index werden übereinander gestapelt, wobei unterschiedliche Schraffuren unterschiedliche Datenrahmen anzeigen.

Zusätzliche Funktionen

Farben anpassen:

Sie können die Farben der Balken anpassen, indem Sie ein cmap-Argument an die Funktion plot_clustered_stacked übergeben, die eine Instanz einer Matplotlib-Farbkarte annimmt. Hier ist ein Beispiel:

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

Fazit

Dieser Ansatz bietet eine einfache und effektive Methode zum Erstellen gruppierter gestapelter Balkendiagramme mit Pandas und Matplotlib. Es ermöglicht die übersichtliche und informative Visualisierung mehrerer Datensätze nebeneinander. Durch Anpassen der Schraffurmuster und -farben können Sie die Darstellung noch weiter an Ihre spezifischen Anforderungen anpassen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Pandas und Matplotlib gruppierte gestapelte Balkendiagramme in Python erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn