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']
Is there an elegant way to assign multiple labels by just using the .plot()
method?
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.
To display all label values, we can use set_xticklabels() and set_yticklabels() methods.
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
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