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

Patricia Arquette
Lepaskan: 2024-11-02 15:26:29
asal
369 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!