Heim >Backend-Entwicklung >Python-Tutorial >Wie erstelle ich geclusterte gestapelte Balkendiagramme in Python mit Pandas und Matplotlib?

Wie erstelle ich geclusterte gestapelte Balkendiagramme in Python mit Pandas und Matplotlib?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 12:46:30352Durchsuche

How to Create Clustered Stacked Bar Plots in Python with Pandas and Matplotlib?

Clusterierte gestapelte Balkendiagramme erstellen

Problem:

Sie haben mehrere Datenrahmen mit identischen Spalten und Indizes und möchten dies tun Erstellen Sie ein gestapeltes Balkendiagramm mit geclusterten Daten aus jedem Datenrahmen.

Lösung mit Pandas und Matplotlib:

  1. Kombinieren Sie die Datenrahmen zu einem einzigen Datenrahmen .
  2. Verwenden Sie die Funktion plot_clustered_stacked(), um das gestapelte Balkendiagramm zu erstellen. Diese Funktion akzeptiert die folgenden Argumente:

    • dfall: Eine Liste der zu zeichnenden Datenrahmen.
    • labels: Eine Liste mit Namen für die Datenrahmen (optional).
    • Titel: Der Titel des Plots (optional).
    • H: Das für jeden Datenrahmen zu verwendende Schraffurmuster (optional).

Code:

<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=&quot;multiple stacked bar plot&quot;,  H=&quot;/&quot;, **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=&quot;bar&quot;,
                      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=&quot;gray&quot;, 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=[&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
                   columns=[&quot;I&quot;, &quot;J&quot;, &quot;K&quot;, &quot;L&quot;, &quot;M&quot;])
df2 = pd.DataFrame(np.random.rand(4, 5),</code>

Das obige ist der detaillierte Inhalt vonWie erstelle ich geclusterte gestapelte Balkendiagramme in Python mit Pandas und Matplotlib?. 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