Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh membuat plot bar bertindan berkelompok dalam Python menggunakan Pandas dan Matplotlib?

Bagaimanakah saya boleh membuat plot bar bertindan berkelompok dalam Python menggunakan Pandas dan Matplotlib?

Patricia Arquette
Patricia Arquetteasal
2024-11-02 15:26:29314semak imbas

How can I create clustered stacked bar plots in Python using Pandas and Matplotlib?

Mencipta Plot Bar Bertindan Berkelompok dengan Panda dan Matplotlib

Dalam artikel ini, kami akan meneroka kaedah untuk mencipta plot bar bertindan berkelompok menggunakan Pandas dan Matplotlib. Teknik ini membolehkan anda memvisualisasikan berbilang set data dengan lajur dan indeks yang sama bersebelahan, dengan bar disusun di atas satu sama lain.

Memahami Masalah

Pertimbangkan perkara berikut senario: Anda mempunyai tiga bingkai data, setiap satu mengandungi nilai untuk lajur "I" dan "J" dengan indeks yang sama. Anda ingin membuat plot bar bertindan untuk setiap bingkai data tetapi disusun dengan cara tertentu:

  • Bar untuk bingkai data 1 pada indeks A
  • Bar untuk bingkai data 2 pada indeks A
  • Bar untuk bingkai data 1 pada indeks B
  • Bar untuk bingkai data 2 pada indeks B

Melaksanakan Penyelesaian

Coretan kod berikut menunjukkan penyelesaian yang cekap untuk masalah ini:

<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="multiple stacked bar plot",  H="/", **kwargs):
    """Given a list of dataframes, with identical columns and index, create a clustered stacked bar plot.
    labels is a list of the names of the dataframe, used for the legend
    title is a string for the title of the plot
    H is the hatch used for identification of the different dataframe"""

    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

# create fake dataframes
df1 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df2 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])
df3 = pd.DataFrame(np.random.rand(4, 5),
                   index=["A", "B", "C", "D"],
                   columns=["I", "J", "K", "L", "M"])

# Then, just call :
plot_clustered_stacked([df1, df2, df3],[“df1”, “df2”, “df3”])</code>

Menggunakan Fungsi

Untuk menggunakan fungsi ini, hantar senarai bingkai data sebagai hujah pertama. Argumen seterusnya boleh menjadi senarai label untuk legenda. Hujah tajuk menentukan tajuk plot. Akhir sekali, H mewakili corak penetasan yang digunakan untuk membezakan setiap bingkai data.

Output

Plot yang terhasil akan memaparkan bar bertindan berkelompok untuk setiap bingkai data, disusun bersebelahan. Bar untuk setiap indeks akan disusun di atas satu sama lain, dengan penetasan berbeza menunjukkan bingkai data yang berbeza.

Ciri Tambahan

Warna Penyesuaian:

Anda boleh menyesuaikan warna bar dengan menghantar argumen cmap ke fungsi plot_clustered_stacked, yang mengambil contoh peta warna matplotlib. Berikut ialah contoh:

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

Kesimpulan

Pendekatan ini menyediakan kaedah yang mudah dan berkesan untuk mencipta plot bar bertindan berkelompok menggunakan Pandas dan Matplotlib. Ia membolehkan anda memvisualisasikan berbilang set data bersebelahan dengan cara yang jelas dan bermaklumat. Dengan melaraskan corak dan warna penetasan, anda boleh memperibadikan plot supaya sesuai dengan keperluan khusus anda.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membuat plot bar bertindan berkelompok dalam Python menggunakan 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