How do I get all bars in a matplotlib bar chart?
If you want all bars, just capture the output from the plotting method. Its a list containing the bars:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(5)
y = np.random.rand(5)
bars = ax.bar(x, y, color='grey')
bars[3].set_color('g')
If you do want all Rectangle object in the axes, but these can be more then just bars, use:
bars = [rect for rect in ax.get_children() if isinstance(rect, mpl.patches.Rectangle)]
Another option that might be useful to some people is to access ax.containers
. You have to be a little careful though as if your plot contains other types of containers you'll get those back too. To get just the bar containers something like
from matplotlib.container import BarContainer
bars = [i for i in ax.containers if isinstance(i, BarContainer)]
This can be pretty powerful with a few tricks (taking inspiration from the accepted example).
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(5)
y = np.random.rand(2, 5)
ax.bar(x, y[0], width=0.5)
ax.bar(x + 0.5, y[1], width=0.5)
for bar, color in zip(ax.containers, ("red", "green")):
# plt.setp sets a property on all elements of the container
plt.setp(bar, color=color)
will give you:
If you add some labels to your plots you can construct a dictionary of containers to access them by label
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(5)
y = np.random.rand(2, 5)
ax.bar(x, y[0], width=0.5)
ax.bar(x + 0.5, y[1], width=0.5, label='my bars')
named_bars = {i.get_label(): i for i in ax.containers}
plt.setp(named_bars["my bars"], color="magenta")
will give you
Of course, you can still access an individual bar patch within a container e.g.
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.arange(5)
y = np.random.rand(2, 5)
ax.bar(x, y[0], width=0.5)
ax.bar(x + 0.5, y[1], width=0.5)
plt.setp(ax.containers[0], color="black")
plt.setp(ax.containers[1], color="grey")
ax.containers[0][3].set_color("red")