Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich gruppierte gestapelte Balkendiagramme für mehrere DataFrames in Python?

Wie erstelle ich gruppierte gestapelte Balkendiagramme für mehrere DataFrames in Python?

Susan Sarandon
Susan SarandonOriginal
2024-11-02 19:07:30259Durchsuche

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

Erstellen gruppierter gestapelter Balkendiagramme für mehrere Datenrahmen

Problemstellung

Beim Umgang mit mehreren Datenrahmen mit identischen Spalten und Indizes kann es wünschenswert sein, dies zu tun Erstellen Sie gruppierte gestapelte Balkendiagramme, um die Daten zu visualisieren. Die Herausforderung entsteht, wenn Sie die Balken für jeden Datenrahmen separat stapeln möchten, gruppiert nach ihren entsprechenden Indizes.

Lösung mit Pandas und Matplotlib

Mit einer Kombination aus Pandas und Matplotlib können wir dies erreichen durch manuelles Anpassen der Positionen und Schraffurmuster der Balkenrechtecke. Hier ist eine detaillierte Lösung:

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

Lösung mit Seaborn

Mit der Barplot-Funktion von Seaborn können wir gestapelte Balkendiagramme erstellen, Balken für verschiedene Datenrahmen jedoch nicht nativ stapeln. Um dies zu umgehen, können wir die folgende Problemumgehung verwenden:

  1. Konvertieren Sie die Datenrahmen mit pd.melt() in ein „ordentliches“ Format.
  2. Berechnen Sie die kumulative Summe jedes Balkens mit groupby und cumsum(), wodurch eine neue Spalte namens vcs erstellt wird.
  3. Durchlaufen Sie die Variablengruppen und zeichnen Sie die kumulative Summe mit 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>

Das obige ist der detaillierte Inhalt vonWie erstelle ich gruppierte gestapelte Balkendiagramme für mehrere DataFrames in Python?. 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