Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a legend to a matplotlib boxplot with multiple plots on same axes

Tags:

I have a boxplot generated with matplotlib:

enter image description here

However, I have no idea how to generate the legend. Whenever I try the following I get an error saying Legend does not support {boxes: ... I've done a fair bit of searching and there doesn't seem to be an example showing how to achieve this. Any help would be appreciated!

bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35, patch_artist=True) bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35, patch_artist=True)  ax.legend([bp1, bp2], ['A', 'B'], loc='upper right') 
like image 893
mbadd Avatar asked Nov 28 '17 10:11

mbadd


People also ask

How do I add multiple legends in MatPlotLib?

MatPlotLib with PythonPlace the first legend at the upper-right location. Add artist, i.e., first legend on the current axis. Place the second legend on the current axis at the lower-right location. To display the figure, use show() method.

How do you add a legend to a boxplot in Python?

MatPlotLib with Python Add an axes to the current figure as a subplot arrangement. Make a box and whisker plot using boxplot() method with different facecolors. To place the legend, use legend() method with two boxplots, bp1 and bp2, and ordered label for legend elements. To display the figure, use show() method.

Can I have two legends in MatPlotLib?

Multiple Legends. Sometimes when designing a plot you'd like to add multiple legends to the same axes. Unfortunately, Matplotlib does not make this easy: via the standard legend interface, it is only possible to create a single legend for the entire plot. If you try to create a second legend using plt.


1 Answers

The boxplot returns a dictionary of artists

result : dict
A dictionary mapping each component of the boxplot to a list of the matplotlib.lines.Line2D instances created. That dictionary has the following keys (assuming vertical boxplots):

  • boxes: the main body of the boxplot showing the quartiles and the median’s confidence intervals if enabled.
  • [...]

Using the boxes, you can get the legend artists as

ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right') 

Complete example:

import matplotlib.pyplot as plt import numpy as np; np.random.seed(1)  data1=np.random.randn(40,2) data2=np.random.randn(30,2)  fig, ax = plt.subplots() bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35,                   patch_artist=True, boxprops=dict(facecolor="C0")) bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35,                   patch_artist=True, boxprops=dict(facecolor="C2"))  ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')  ax.set_xlim(0,6) plt.show() 

enter image description here

like image 79
ImportanceOfBeingErnest Avatar answered Sep 19 '22 12:09

ImportanceOfBeingErnest