Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Mencipta Carta Bar Bertindan Berkelompok untuk Berbilang DataFrames dalam Python?

Bagaimana untuk Mencipta Carta Bar Bertindan Berkelompok untuk Berbilang DataFrames dalam Python?

Susan Sarandon
Lepaskan: 2024-11-02 19:07:30
asal
361 orang telah melayarinya

How to Create Clustered Stacked Bar Charts for Multiple DataFrames in Python?

Membuat Carta Bar Bertindan Berkelompok untuk Berbilang Bingkai Data

Pernyataan Masalah

Apabila berurusan dengan berbilang bingkai data dengan lajur dan indeks yang sama, adalah wajar untuk buat carta bar bertindan berkelompok untuk menggambarkan data. Cabaran timbul apabila anda ingin menyusun bar untuk setiap bingkai data secara berasingan, dikumpulkan mengikut indeks yang sepadan.

Penyelesaian dengan Panda dan Matplotlib

Menggunakan gabungan Panda dan Matplotlib, kita boleh mencapai ini dengan melaraskan secara manual kedudukan dan corak penetasan segi empat bar. Berikut ialah penyelesaian terperinci:

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

Penyelesaian dengan Seaborn

Menggunakan fungsi barplot Seaborn, kami boleh mencipta carta bar bertindan tetapi tidak boleh menyusun bar secara asli untuk bingkai data yang berbeza. Untuk mengatasinya, kita boleh menggunakan penyelesaian berikut:

  1. Tukar bingkai data ke dalam format "kemas" menggunakan pd.melt().
  2. Kira jumlah terkumpul setiap bar menggunakan groupby dan cumsum(), mencipta lajur baharu yang dipanggil vcs.
  3. Lelar melalui kumpulan pembolehubah dan plot jumlah kumulatif menggunakan sns.barplot().
<code class="python">import seaborn as sns

# Convert dataframes to tidy format
dfall.set_index([&quot;Name&quot;, &quot;index&quot;, &quot;variable&quot;], inplace=1)
dfall[&quot;vcs&quot;] = dfall.groupby(level=[&quot;Name&quot;, &quot;index&quot;]).cumsum()
dfall.reset_index(inplace=True)

# Create color palette
c = [&quot;blue&quot;, &quot;purple&quot;, &quot;red&quot;, &quot;green&quot;, &quot;pink&quot;]

# Iterate through groups and plot stacked bars
for i, g in enumerate(dfall.groupby(&quot;variable&quot;)):
    ax = sns.barplot(data=g[1],
                    x=&quot;index&quot;,
                    y=&quot;vcs&quot;,</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Carta Bar Bertindan Berkelompok untuk Berbilang DataFrames dalam Python?. 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