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?
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