Here is a very simplified example:
xvalues = [2,3,4,6] for x in xvalues: plt.axvline(x,color='b',label='xvalues') plt.legend()
The legend will now show 'xvalues' as a blue line 4 times in the legend. Is there a more elegant way of fixing this than the following?
for i,x in enumerate(xvalues): if not i: plt.axvline(x,color='b',label='xvalues') else: plt.axvline(x,color='b')
You can remove duplicate labels by putting them in a dictionary before calling legend . This is because dicts can't have duplicate keys.
Answer #1: show() (not with block=False ) and, most importantly, plt. pause(. 001) (or whatever time you want). The pause is needed because the GUI events happen while the main code is sleeping, including drawing.
plt.legend
takes as parameters
Artist
objectsThese parameters are both optional defaulting to plt.gca().get_legend_handles_labels()
. You can remove duplicate labels by putting them in a dictionary before calling legend
. This is because dicts can't have duplicate keys.
For example:
from collections import OrderedDict import matplotlib.pyplot as plt handles, labels = plt.gca().get_legend_handles_labels() by_label = OrderedDict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys())
As of Python 3.7, dictionaries retain input order by default. Thus, there is no need for OrderedDict
form the collections module.
import matplotlib.pyplot as plt handles, labels = plt.gca().get_legend_handles_labels() by_label = dict(zip(labels, handles)) plt.legend(by_label.values(), by_label.keys())
Docs for plt.legend
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With