Heim > Artikel > Backend-Entwicklung > Wie erstelle ich gruppierte gestapelte Balkendiagramme für mehrere DataFrames in Python?
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.
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>
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:
<code class="python">import seaborn as sns # Convert dataframes to tidy format dfall.set_index(["Name", "index", "variable"], inplace=1) dfall["vcs"] = dfall.groupby(level=["Name", "index"]).cumsum() dfall.reset_index(inplace=True) # Create color palette c = ["blue", "purple", "red", "green", "pink"] # Iterate through groups and plot stacked bars for i, g in enumerate(dfall.groupby("variable")): ax = sns.barplot(data=g[1], x="index", y="vcs",</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!