How to Create Clustered Stacked Bar Plots in Python with Pandas and Matplotlib?

Linda Hamilton
Release: 2024-11-02 12:46:30
Original
295 people have browsed it

How to Create Clustered Stacked Bar Plots in Python with Pandas and Matplotlib?

Creating Clustered Stacked Bar Plots

Problem:

You have multiple data frames with identical columns and index and want to create a stacked bar plot with data from each data frame clustered together.

Solution using Pandas and Matplotlib:

  1. Combine the data frames into a single data frame.
  2. Use the plot_clustered_stacked() function to create the stacked bar plot. This function takes the following arguments:

    • dfall: A list of data frames to be plotted.
    • labels: A list of names for the data frames (optional).
    • title: The title of the plot (optional).
    • H: The hatch pattern to use for each data frame (optional).

Code:

<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=&quot;multiple stacked bar plot&quot;,  H=&quot;/&quot;, **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=&quot;bar&quot;,
                      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=&quot;gray&quot;, 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=[&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;],
                   columns=[&quot;I&quot;, &quot;J&quot;, &quot;K&quot;, &quot;L&quot;, &quot;M&quot;])
df2 = pd.DataFrame(np.random.rand(4, 5),</code>
Copy after login

The above is the detailed content of How to Create Clustered Stacked Bar Plots in Python with Pandas and Matplotlib?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!