Horizontal stacked bar chart python


To plot stacked bar chart in Matplotlib, we can use barh() methods

Steps

  • Set the figure size and adjust the padding between and around the subplots.
  • Create a list of years, issues_addressed and issues_pending, in accordance with years.
  • Plot horizontal bars with years and issues_addressed data.
  • To make stacked horizontal bars, use barh() method with years, issues_pending and issues_addressed data
  • Place the legend on the plot.
  • To display the figure, use show() method.

Example

from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

year = [2014, 2015, 2016, 2017, 2018, 2019]
issues_addressed = [10, 14, 0, 10, 15, 15]
issues_pending = [5, 10, 50, 2, 0, 10]

b1 = plt.barh(year, issues_addressed, color="red")

b2 = plt.barh(year, issues_pending, left=issues_addressed, color="yellow")

plt.legend([b1, b2], ["Completed", "Pending"], title="Issues", loc="upper right")

plt.show()

Output

Horizontal stacked bar chart python

Horizontal stacked bar chart python

Updated on 15-Jun-2021 12:25:28

  • Related Questions & Answers
  • Python Pandas - Plot a Stacked Horizontal Bar Chart
  • How to create horizontal stacked bar chart using ggvis in R?
  • How to display stacked bar chart using matplotlib in Python?
  • How to Create a Diverging Stacked Bar Chart in Matplotlib?
  • Python Pandas - Create a Horizontal Bar Chart
  • How to create a stacked bar chart for my DataFrame using Seaborn in Matplotlib?
  • How to create a stacked bar chart using JavaFX?
  • How to create stacked bar chart using ggvis in R?
  • Displaying horizontal bar graphs using Matplotlib
  • How to create a 100% stacked Area Chart with Matplotlib?
  • Stacked-to-horizontal Bootstrap Grid
  • Create stacked bar chart with percentages on Y-axis using ggplot2 in R.
  • Adding value labels on a matplotlib bar chart
  • How to create broken horizontal bar graphs in matplotlib?
  • Bootstrap Grid Stacked to horizontal grid

I'm trying to create a horizontal stacked bar chart using matplotlib but I can't see how to make the bars actually stack rather than all start on the y-axis.

Here's my testing code.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plot_chart(df, fig, ax)
ind = arange(df.shape[0])      
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00')
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00')
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0')
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0')
plt.show()

Edited to use left kwarg after seeing tcaswell's comment.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plot_chart(df, fig, ax)
ind = arange(df.shape[0])      
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00')
lefts = df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts)
lefts = lefts + df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts)
lefts = lefts + df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts)
plt.show()

This seems to be the right approach, but it fails if there is no data for a particular bar as it's trying to add nan to a value which then returns nan.

Note

Click here to download the full example code

Stacked bar charts can be used to visualize discrete distributions.

This example visualizes the result of a survey in which people could rate their agreement to questions on a five-element scale.

The horizontal stacking is achieved by calling barh() for each category and passing the starting point as the cumulative sum of the already drawn bars via the parameter left.

import numpy as np
import matplotlib.pyplot as plt


category_names = ['Strongly disagree', 'Disagree',
                  'Neither agree nor disagree', 'Agree', 'Strongly agree']
results = {
    'Question 1': [10, 15, 17, 32, 26],
    'Question 2': [26, 22, 29, 10, 13],
    'Question 3': [35, 37, 7, 2, 19],
    'Question 4': [32, 11, 9, 15, 33],
    'Question 5': [21, 29, 5, 5, 40],
    'Question 6': [8, 19, 5, 30, 38]
}


def survey(results, category_names):
    """
    Parameters
    ----------
    results : dict
        A mapping from question labels to a list of answers per category.
        It is assumed all lists contain the same number of entries and that
        it matches the length of *category_names*.
    category_names : list of str
        The category labels.
    """
    labels = list(results.keys())
    data = np.array(list(results.values()))
    data_cum = data.cumsum(axis=1)
    category_colors = plt.colormaps['RdYlGn'](
        np.linspace(0.15, 0.85, data.shape[1]))

    fig, ax = plt.subplots(figsize=(9.2, 5))
    ax.invert_yaxis()
    ax.xaxis.set_visible(False)
    ax.set_xlim(0, np.sum(data, axis=1).max())

    for i, (colname, color) in enumerate(zip(category_names, category_colors)):
        widths = data[:, i]
        starts = data_cum[:, i] - widths
        rects = ax.barh(labels, widths, left=starts, height=0.5,
                        label=colname, color=color)

        r, g, b, _ = color
        text_color = 'white' if r * g * b < 0.5 else 'darkgrey'
        ax.bar_label(rects, label_type='center', color=text_color)
    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1),
              loc='lower left', fontsize='small')

    return fig, ax


survey(results, category_names)
plt.show()

Horizontal stacked bar chart python

Gallery generated by Sphinx-Gallery

How do you plot a horizontal stacked bar graph in Python?

Steps. Set the figure size and adjust the padding between and around the subplots. Create a list of years, issues_addressed and issues_pending, in accordance with years. Plot horizontal bars with years and issues_addressed data.

How do you create a stack bar in Python?

Matplotlib is a tremendous visualization library in Python for 2D plots of arrays. Matplotlib may be a multi-platform data visualization library built on NumPy arrays and designed to figure with the broader SciPy stack..
Import Library (Matplotlib).
Import / create data..
Plot the bars in the stack manner..

How do I show values in a stacked bar chart in Matplotlib?

DataFrame. plot(kind='bar', stacked=True) , is the easiest way to plot a stacked bar plot. This method returns a matplotlib.