Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mencipta Plot Bar Bertindan Berkelompok dalam Pandas dan Matplotlib?

Bagaimana untuk Mencipta Plot Bar Bertindan Berkelompok dalam Pandas dan Matplotlib?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 10:51:02694semak imbas

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

Mengelompokkan Bar Bertindan dalam Panda dan Matplotlib

Pengenalan

Artikel ini menangani masalah mencipta plot bar bertindan dengan bar berkelompok untuk berbilang bingkai data yang berkongsi indeks dan lajur yang sama. Matlamatnya adalah untuk mempunyai bar bertindan berkelompok bagi setiap indeks, memastikan kejelasan dalam visualisasi.

Menggunakan Pandas dan Matplotlib

Penyelesaian itu memanfaatkan keupayaan pustaka Pandas dan Matplotlib. Berikut ialah kodnya:

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

Untuk menggunakan fungsi ini, cuma masukkan senarai bingkai data dan argumen pilihan seperti label dan tajuk. Ia akan menghasilkan bar bertindan berkelompok dengan penetasan untuk membezakan bingkai data.

Contoh

Berikut ialah contoh menggunakan fungsi ini:

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

Ciri Tambahan

Anda boleh menyesuaikan warna bar dengan menghantar hujah cmap:

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

Kesimpulan

Penyelesaian ini menyediakan cara yang fleksibel dan mudah untuk mencipta plot bar bertindan berkelompok. Anda boleh mengubah suai kod dengan mudah untuk memenuhi keperluan khusus visualisasi data anda.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Plot Bar Bertindan Berkelompok dalam Pandas dan Matplotlib?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn