Plotting multiple bar charts using Matplotlib in Python
Matplotlib is a powerful visualization library in Python that allows for the creation of various types of plots, including bar charts. When working with multiple bar charts, we can represent data in two main ways, grouped bar charts (multiple bars within one chart) and separate bar charts (multiple figures for different data sets). Let's explore each one in detail.
Using ax.bar() in a single plot
ax.bar() is part of Matplotlib's object-oriented interface, where you explicitly create and control axes (ax) using plt.subplots(). This method is preferred when building complex layouts, multiple subplots or customized visualizations. It gives you fine-grained control over every element of the plot.
import numpy as np
import matplotlib.pyplot as plt
cats = ['A', 'B', 'C', 'D'] # categories
vals1, vals2 = [4, 7, 1, 8], [5, 6, 2, 9]
# Bar width and x locations
w, x = 0.4, np.arange(len(cats))
fig, ax = plt.subplots()
ax.bar(x - w/2, vals1, width=w, label='Set 1')
ax.bar(x + w/2, vals2, width=w, label='Set 2')
ax.set_xticks(x)
ax.set_xticklabels(cats)
ax.set_ylabel('Values')
ax.set_title('Grouped Bar Chart')
ax.legend()
plt.show()
Output

Explanation: This code defines categories and values, sets bar width and x-axis positions, and plots two datasets side by side using ax.bar(). It adjusts x-axis labels and adds a legend for clarity before displaying the chart.
Using plt.bar() in a single plot
plt.bar() belongs to Matplotlib’s state-machine (pyplot) interface, which manages the figure and axes behind the scenes. It is great for quick and simple plots when you don't need multiple subplots or deep customization. However, it offers less flexibility compared to the object-oriented approach.
import numpy as np
import matplotlib.pyplot as plt
cats = ['A', 'B', 'C', 'D']
v1, v2 = [4, 7, 1, 8], [5, 6, 2, 9]
w, x = 0.4, np.arange(len(cats))
plt.bar(x - w/2, v1, w, label='Set 1')
plt.bar(x + w/2, v2, w, label='Set 2')
plt.xticks(x, cats)
plt.ylabel('Values')
plt.title('Grouped Bar Chart')
plt.legend()
plt.show()
Output

Explanation: This code defines categories and values, sets bar width and x-axis positions, and plots two datasets side by side using plt.bar(). It adjusts x-axis labels, adds a title and legend for clarity, and displays the chart.
Using subplots(plt.subplots()) for seperate charts
With plt.subplots(), multiple bar charts can be plotted within a single figure but in different axes. This method is ideal when you want to compare datasets visually while keeping them separate. It provides a clean, organized layout with each dataset in its own subplot.
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# First dataset
axes[0].bar(categories, values1, color='blue')
axes[0].set_title("Set 1")
axes[0].set_ylabel("Values")
# Second dataset
axes[1].bar(categories, values2, color='green')
axes[1].set_title("Set 2")
axes[1].set_ylabel("Values")
plt.tight_layout()
plt.show()

Explanation: This code creates two side-by-side subplots using plt.subplots(), each displaying a bar chart for a separate dataset. It assigns titles and labels to each subplot, adjusts layout spacing with plt.tight_layout() and displays the figure.
Using plt.figure() to generate seperate figure
This method creates entirely separate figures for each dataset using plt.figure(), ensuring complete independence between plots. It is useful when each dataset requires its own visualization without sharing the same figure, making it easier to analyze them individually.
import matplotlib.pyplot as plt
plt.figure()
plt.bar(categories, values1, color='blue')
plt.title("Set 1")
plt.ylabel("Values")
plt.show()
plt.figure()
plt.bar(categories, values2, color='green')
plt.title("Set 2")
plt.ylabel("Values")
plt.show()
Output


Explanation: This code creates two separate figures using plt.figure(), each displaying a bar chart for a different dataset. It assigns titles and labels independently to each figure and displays them separately.