Home > Article > Backend Development > How to create clustered stacked bar plots using Pandas and Matplotlib or Seaborn?
Consider two dataframes, df1 and df2, with the same index but potentially different columns, where each row represents a category and each column represents a metric. The goal is to create clustered stacked bar plots where the bars for each category are grouped together, and the bars for each dataframe are stacked on top of each other.
<code class="python">import pandas as pd import matplotlib.pyplot as plt import matplotlib.cm as cm def plot_clustered_stacked(df_list, labels=None, title="Clustered Stacked Bar Plot"): n_dataframes = len(df_list) n_columns = len(df_list[0].columns) n_index = len(df_list[0].index) fig, ax = plt.subplots() # Iterate through each dataframe for i, df in enumerate(df_list): # Plot the bars for the current dataframe df.plot(kind="bar", ax=ax, linewidth=0, stacked=True, legend=False, grid=False) # Adjust the position and width of the bars for df, j in zip(df_list, range(n_dataframes)): for n, rect in enumerate(ax.patches): if rect.get_y() == 0: # Stacked bar for dataframe df rect.set_x(rect.get_x() + j / float(n_dataframes)) rect.set_width(1 / float(n_dataframes)) # Set the x-axis labels and ticks ax.set_xticks(np.arange(0, n_index) + 0.5) ax.set_xticklabels(df.index) # Add a legend for the dataframes plt.legend([df.stack(level=0).index[0] for df in df_list], labels) # Set the plot title ax.set_title(title) # Create example dataframes df1 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"]) df2 = pd.DataFrame(np.random.rand(4, 3), index=["A", "B", "C", "D"], columns=["x", "y", "z"]) # Plot the clustered stacked bar plot plot_clustered_stacked([df1, df2], labels=["df1", "df2"])</code>
<code class="python">import seaborn as sns # Concatenate the dataframes into a single dataframe with a wide format df = pd.concat([df1.reset_index().melt(id_vars=["index"]), df2.reset_index().melt(id_vars=["index"])]) # Plot the clustered stacked bar plot g = sns.FacetGrid(data=df, col="variable", hue="index") g.map_dataframe(sns.barplot, order=df["index"].unique())</code>
The above is the detailed content of How to create clustered stacked bar plots using Pandas and Matplotlib or Seaborn?. For more information, please follow other related articles on the PHP Chinese website!