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

Wie erstelle ich geclusterte gestapelte Balkendiagramme in Pandas und Matplotlib?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 10:51:02623Durchsuche

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

Clustering Stacked Bars in Pandas und Matplotlib

Einführung

Dieser Artikel befasst sich mit dem Problem von Erstellen gestapelter Balkendiagramme mit gruppierten Balken für mehrere Datenrahmen mit demselben Index und denselben Spalten. Ziel ist es, gruppierte gestapelte Balken pro Index zu haben, um Klarheit in der Visualisierung zu gewährleisten.

Verwendung von Pandas und Matplotlib

Die Lösung nutzt die Funktionen der Pandas- und Matplotlib-Bibliotheken. Hier ist der Code:

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

def plot_clustered_stacked(dfall, labels=None, title=&quot;multiple stacked bar plot&quot;):
    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)

    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(&quot;/&quot; * 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=&quot;/&quot; * i))

    l1 = axe.legend(h[:n_col], l[:n_col])
    if labels is not None:
        l2 = plt.legend(n, labels) 
    axe.add_artist(l1)
    return axe</code>

Um diese Funktion zu verwenden, übergeben Sie einfach eine Liste von Datenrahmen und optionalen Argumenten wie Beschriftungen und Titel. Es werden gruppierte gestapelte Balken mit Schraffuren zur Unterscheidung der Datenrahmen erstellt.

Beispiel

Hier ist ein Beispiel für die Verwendung dieser Funktion:

<code class="python"># 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),
                   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;])
df3 = 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;])

# plot clustered stacked bar
plot_clustered_stacked([df1, df2, df3], [&quot;df1&quot;, &quot;df2&quot;, &quot;df3&quot;])</code>

Zusätzliche Funktionen

Sie können die Farben der Balken anpassen, indem Sie ein cmap-Argument übergeben:

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

Fazit

Diese Lösung bietet eine flexible und bequeme Möglichkeit, gruppierte gestapelte Balkendiagramme zu erstellen. Sie können den Code ganz einfach ändern, um ihn an die spezifischen Anforderungen Ihrer Datenvisualisierung anzupassen.

Das obige ist der detaillierte Inhalt vonWie erstelle ich geclusterte gestapelte Balkendiagramme in 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