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.
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>
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:
<code class="python">import seaborn as sns # Convert dataframes to tidy format dfall.set_index(["Name", "index", "variable"], inplace=1) dfall["vcs"] = dfall.groupby(level=["Name", "index"]).cumsum() dfall.reset_index(inplace=True) # Create color palette c = ["blue", "purple", "red", "green", "pink"] # Iterate through groups and plot stacked bars for i, g in enumerate(dfall.groupby("variable")): ax = sns.barplot(data=g[1], x="index", y="vcs",</code>
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!