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