8000 Duplicate legend labels with different colors can often result in an error. · Issue #10053 · matplotlib/matplotlib · GitHub
[go: up one dir, main page]

Skip to content
Duplicate legend labels with different colors can often result in an error. #10053
Closed
@dpryan79

Description

@dpryan79

Bug report

If one makes a scatter plot (or a line graph) having multiple points with different markers and colors, but the same label, this will result in an error in version 2.1.1 (but not 2.1.0). A small example is provided below:

Code for reproduction

#!/usr/bin/env python
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt

color='#00ff00ff'
plt.scatter(0.0, 1.0, color=color, marker='o', label='test')
color='#00ffaaff'
plt.scatter(0.5, 0.0, color=color, marker='v', label='test')
plt.legend()
plt.savefig('foo.png')

Actual outcome

This example uses a scatter plot, but the same issue can arise with line plots if one uses a numpy vector as a color (e.g., [0.0, 1.0, 0.0, 1.0]). The error produced for the above example is as follows:

Traceback (most recent call last):
  File "foo.py", line 11, in <module>
    plt.legend()
  File "/home/ryan/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 3748, in legend
    ret = gca().legend(*args, **kwargs)
  File "/home/ryan/.local/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 498, in legend
    **kwargs)
  File "/home/ryan/.local/lib/python2.7/site-packages/matplotlib/legend.py", line 1402, in _parse_legend_args
    handles, labels = _get_legend_handles_labels(axs, handlers)
  File "/home/ryan/.local/lib/python2.7/site-packages/matplotlib/legend.py", line 1360, in _get_legend_handles_labels
    and not _in_handles(handle, label)):
  File "/home/ryan/.local/lib/python2.7/site-packages/matplotlib/legend.py", line 1344, in _in_handles
    if f_h.get_facecolor() != h.get_facecolor():
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

At the end of the day, this ends up being because the face (and edge) colors are converted to a numpy vector, which can't be compared with != since they have multiple elements. With the help of git bisect, I've tracked this down to this commit at the end of October.

Now I'll grant that this only happens if people use the same label for multiple symbols/lines, which is a bad idea...but one can't always prevent end users from doing that.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0