Python Matplotlib Boxplot Color
Python Matplotlib Boxplot Color
To colorize the boxplot, you need to first use the patch_artist=True
keyword to tell it that the boxes are patches and not just paths. Then you have two main options here:
- set the color via
...props
keyword argument, e.g.
boxprops=dict(facecolor=red)
. For all keyword arguments, refer to the documentation - Use the
plt.setp(item, properties)
functionality to set the properties of the boxes, whiskers, fliers, medians, caps. - obtain the individual items of the boxes from the returned dictionary and use
item.set_<property>(...)
on them individually. This option is detailed in an answer to the following question: python matplotlib filled boxplots, where it allows to change the color of the individual boxes separately.
The complete example, showing options 1 and 2:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(0.1, size=(100,6))
data[76:79,:] = np.ones((3,6))+0.2
plt.figure(figsize=(4,3))
# option 1, specify props dictionaries
c = red
plt.boxplot(data[:,:3], positions=[1,2,3], notch=True, patch_artist=True,
boxprops=dict(facecolor=c, color=c),
capprops=dict(color=c),
whiskerprops=dict(color=c),
flierprops=dict(color=c, markeredgecolor=c),
medianprops=dict(color=c),
)
# option 2, set all colors individually
c2 = purple
box1 = plt.boxplot(data[:,::-2]+1, positions=[1.5,2.5,3.5], notch=True, patch_artist=True)
for item in [boxes, whiskers, fliers, medians, caps]:
plt.setp(box1[item], color=c2)
plt.setp(box1[boxes], facecolor=c2)
plt.setp(box1[fliers], markeredgecolor=c2)
plt.xlim(0.5,4)
plt.xticks([1,2,3], [1,2,3])
plt.show()
You can change the color of a box plot using setp
on the returned value from boxplot()
. This example defines a box_plot()
function that allows the edge and fill colors to be specified:
import matplotlib.pyplot as plt
def box_plot(data, edge_color, fill_color):
bp = ax.boxplot(data, patch_artist=True)
for element in [boxes, whiskers, fliers, means, medians, caps]:
plt.setp(bp[element], color=edge_color)
for patch in bp[boxes]:
patch.set(facecolor=fill_color)
return bp
example_data1 = [[1,2,0.8], [0.5,2,2], [3,2,1]]
example_data2 = [[5,3, 4], [6,4,3,8], [6,4,9]]
fig, ax = plt.subplots()
bp1 = box_plot(example_data1, red, tan)
bp2 = box_plot(example_data2, blue, cyan)
ax.legend([bp1[boxes][0], bp2[boxes][0]], [Data 1, Data 2])
ax.set_ylim(0, 10)
plt.show()
This would display as follows:
Python Matplotlib Boxplot Color
This question seems to be similar to that one (Face pattern for boxes in boxplots)
I hope this code solves your problem
import matplotlib.pyplot as plt
# fake data
d0 = [[4.5, 5, 6, 4],[4.5, 5, 6, 4]]
d1 = [[1, 2, 3, 3.3],[1, 2, 3, 3.3]]
# basic plot
bp0 = plt.boxplot(d0, patch_artist=True)
bp1 = plt.boxplot(d1, patch_artist=True)
for box in bp0[boxes]:
# change outline color
box.set(color=red, linewidth=2)
# change fill color
box.set(facecolor = green )
# change hatch
box.set(hatch = /)
for box in bp1[boxes]:
box.set(color=blue, linewidth=5)
box.set(facecolor = red )
plt.show()