Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I assign multiple labels at once in matplotlib?

I have the following dataset:

x = [0, 1, 2, 3, 4] y = [ [0, 1, 2, 3, 4],       [5, 6, 7, 8, 9],       [9, 8, 7, 6, 5] ] 

Now I plot it with:

import matplotlib.pyplot as plt plt.plot(x, y) 

However, I want to label the 3 y-datasets with this command, which raises an error when .legend() is called:

lineObjects = plt.plot(x, y, label=['foo', 'bar', 'baz']) plt.legend()  File "./plot_nmos.py", line 33, in <module>   plt.legend() ... AttributeError: 'list' object has no attribute 'startswith' 

When I inspect the lineObjects:

>>> lineObjects[0].get_label() ['foo', 'bar', 'baz'] >>> lineObjects[1].get_label() ['foo', 'bar', 'baz'] >>> lineObjects[2].get_label() ['foo', 'bar', 'baz'] 

Question

Is there an elegant way to assign multiple labels by just using the .plot() method?

like image 873
Kit Avatar asked Jul 14 '12 06:07

Kit


People also ask

How do you add multiple labels in python?

To display multiple labels in one line with Python Tkinter, we can use the pack() method of label and align all the labels to the same side.

How do I show all labels in Matplotlib?

To display all label values, we can use set_xticklabels() and set_yticklabels() methods.


1 Answers

You can iterate over your line objects list, so labels are individually assigned. An example with the built-in python iter function:

lineObjects = plt.plot(x, y) plt.legend(iter(lineObjects), ('foo', 'bar', 'baz'))` 

Edit: after updating to matplotlib 1.1.1, it looks like the plt.plot(x, y), with y as a list of lists (as provided by the author of the question), doesn't work anymore. The one step plotting without iteration over the y arrays is still possible thought after passing y as numpy.array (assuming (numpy)[http://numpy.scipy.org/] as been previously imported).

In this case, use plt.plot(x, y) (if the data in the 2D y array are arranged as columns [axis 1]) or plt.plot(x, y.transpose()) (if the data in the 2D y array are arranged as rows [axis 0])

Edit 2: as pointed by @pelson (see commentary below), the iter function is unnecessary and a simple plt.legend(lineObjects, ('foo', 'bar', 'baz')) works perfectly

like image 171
gcalmettes Avatar answered Sep 21 '22 11:09

gcalmettes