
When dealing with multiple dataframes with identical columns and indexes, it can be desirable to create clustered stacked bar charts to visualize the data. The challenge arises when you want to stack the bars for each dataframe separately, grouped by their corresponding indexes.
Using a combination of Pandas and Matplotlib, we can achieve this by manually adjusting the positions and hatching patterns of the bar rectangles. Here's a detailed solution:
<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>Using Seaborn's barplot function, we can create stacked bar charts but cannot natively stack bars for different dataframes. To overcome this, we can use the following workaround:
<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>The above is the detailed content of How to Create Clustered Stacked Bar Charts for Multiple DataFrames in Python?. For more information, please follow other related articles on the PHP Chinese website!