As a Python developer with over seven years of experience working extensively with Matplotlib, I’ve often found myself needing to overlay two bar charts to compare datasets visually. Whether you’re analyzing sales data across different states or comparing population statistics, overlaying bar charts can provide clear insights that side-by-side charts sometimes miss.
In this tutorial, I’ll walk you through how to overlay two bar charts in Matplotlib using Python. I’ll share practical methods from my own experience, including full code examples you can easily adapt for your projects. By the end, you’ll be able to create visually appealing and informative overlay bar charts that suit your data visualization needs, especially if your focus is on US-centric datasets.
Overlay Two Bar Charts in Python
Overlaying bar charts is useful when you want to compare two related datasets directly on the same axes. For example, imagine you want to compare the quarterly sales of two major retail chains in the USA. Overlaying their sales bars allows you to see differences and trends at a glance without flipping between charts.
Matplotlib, the go-to Python plotting library, makes this possible with a few lines of code. You can customize colors, transparency, and bar width to make your charts clear and professional.
Method 1: Basic Overlay Using Transparency
The simplest way to overlay two bar charts in Python with Matplotlib is by plotting them on the same axes and adjusting the transparency (alpha) for each bar set. This approach works well when the bars don’t completely obscure each other.
Here’s how I do it:
import matplotlib.pyplot as plt
import numpy as np
# Sample data: Quarterly sales (in millions) for two retail chains in the USA
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
sales_chain_a = [50, 65, 70, 85]
sales_chain_b = [55, 60, 75, 80]
x = np.arange(len(quarters))
plt.figure(figsize=(10,6))
# Plot bars for Chain A
plt.bar(x, sales_chain_a, width=0.4, color='blue', alpha=0.6, label='Chain A')
# Plot bars for Chain B on the same x-axis positions with transparency
plt.bar(x, sales_chain_b, width=0.4, color='orange', alpha=0.6, label='Chain B')
plt.xticks(x, quarters)
plt.ylabel('Sales (in millions)')
plt.title('Quarterly Sales Comparison: Chain A vs Chain B')
plt.legend()
plt.show()You can refer to the screenshot below to see the output.

In this example, I set both bars at the same x positions but use transparency to let both bars be visible. This method is quick and effective when the bars have different heights and colors.
Method 2: Overlay with Slight Offset for Clearer Visualization
Sometimes, overlaying bars exactly on top of each other can make it hard to compare values. To solve this, I offset the bars slightly horizontally while keeping them visually overlapped. This method improves clarity while still showing the direct comparison.
Here’s the code snippet I use:
import matplotlib.pyplot as plt
import numpy as np
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
sales_chain_a = [50, 65, 70, 85]
sales_chain_b = [55, 60, 75, 80]
x = np.arange(len(quarters))
bar_width = 0.4
plt.figure(figsize=(10,6))
# Plot bars for Chain A, shifted left by half bar width
plt.bar(x - bar_width/4, sales_chain_a, width=bar_width, color='blue', alpha=0.7, label='Chain A')
# Plot bars for Chain B, shifted right by half bar width
plt.bar(x + bar_width/4, sales_chain_b, width=bar_width, color='orange', alpha=0.7, label='Chain B')
plt.xticks(x, quarters)
plt.ylabel('Sales (in millions)')
plt.title('Quarterly Sales Comparison with Overlay Offset')
plt.legend()
plt.show()You can refer to the screenshot below to see the output.

By shifting the bars left and right by a fraction of the bar width, I maintain the overlay effect but make it easier to distinguish each dataset.
Method 3: Use Edge Colors and Hatching for Better Differentiation
If you want to overlay two bar charts but worry about colorblind users or printing in grayscale, adding edge colors and hatching patterns can help distinguish the bars effectively.
Here’s how I enhance the overlay chart with these features:
import matplotlib.pyplot as plt
import numpy as np
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
sales_chain_a = [50, 65, 70, 85]
sales_chain_b = [55, 60, 75, 80]
x = np.arange(len(quarters))
bar_width = 0.4
plt.figure(figsize=(10,6))
# Bars for Chain A with edge color and hatching
plt.bar(x - bar_width/4, sales_chain_a, width=bar_width, color='lightblue',
edgecolor='blue', hatch='/', alpha=0.8, label='Chain A')
# Bars for Chain B with different edge color and hatching
plt.bar(x + bar_width/4, sales_chain_b, width=bar_width, color='orange',
edgecolor='darkorange', hatch='\\', alpha=0.8, label='Chain B')
plt.xticks(x, quarters)
plt.ylabel('Sales (in millions)')
plt.title('Quarterly Sales with Edge Colors and Hatching')
plt.legend()
plt.show()You can refer to the screenshot below to see the output.

This method adds texture and outlines to each bar, making it easier to differentiate the datasets even when the colors are less visible.
Tips for Overlaying Bar Charts in Python Matplotlib
- Adjust bar width carefully: Too wide bars can clutter the chart; too narrow bars may be hard to see.
- Use contrasting colors: Choose colors that stand out against each other and the background.
- Add legends and titles: Always label your charts clearly for better understanding.
- Use transparency (alpha) wisely: It helps show overlapping bars, but avoid making bars too faint.
- Consider your audience: For US-based data, use familiar terms like quarters, states, or industries to make charts relatable.
Overlaying two bar charts in Matplotlib with Python is a powerful way to compare datasets visually. Whether you want a quick transparent overlay or a more refined offset with hatching, these methods cover the common scenarios I’ve encountered in my projects.
Try these approaches with your own US-centric data, like comparing state-level unemployment rates or retail sales figures, to create insightful visualizations. The flexibility of Matplotlib lets you customize these charts to fit any presentation or report style.
I hope you found this tutorial helpful and easy to follow. Happy coding and data visualizing with Python!
Related Articles You May Like:
- Change View Angle in Matplotlib 3D Scatter Plot in Python
- Use Depthshade in Matplotlib 3D Scatter Plots
- Create Multiple Bar Charts in Pandas Using Python Matplotlib
- Matplotlib Grouped Bar Charts in Python

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.