Improve the error message or introduce support for colors as RGS tuples

Hi,
  I am trying to improve my code where I cannot find out why matplotlib-1.1.0 does not
support colors specified as RG tuples. Here is an example.

import numpy as np
import matplotlib.pyplot as plt

_nums = [160.0, 160.0, 160.0, 95.0, 160.0, 160.0]
_colors = [(0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255)]
_legends = ['foo', 'foo', 'foo', 'blah', 'foo', 'foo']

plt.hist(_nums, histtype='bar', align='mid', color=_colors, log=False, label=_legends)

plt.show()

The above code gives me:

  File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 2332, in hist
    ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, **kwargs)
  File "/usr/lib64/python2.7/site-packages/matplotlib/axes.py", line 7598, in hist
    raise ValueError("color kwarg must have one color per dataset")
ValueError: color kwarg must have one color per dataset

Mainly, I am suggesting the error message to be improved and to write out how many
items were in data, color and legend iterables passed to the function. That would help
in some cases albeit not with this example. That needs some other fix. :wink:

I would like that one can also pass in a list of HTML-like colors, e.g. 'F0F8FF' or 0xF0F8FF
would be valid.

Thanks for your comments,
Martin

Martin Mokrejs wrote:

Hi,
  I am trying to improve my code where I cannot find out why matplotlib-1.1.0 does not
support colors specified as RG tuples. Here is an example.

import numpy as np
import matplotlib.pyplot as plt

_nums = [160.0, 160.0, 160.0, 95.0, 160.0, 160.0]

Grr. This was the trick:

_nums = [[160.0], [160.0], [160.0], [95.0], [160.0], [160.0]]

What a wasteful list creation. :frowning:

_colors = [(0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255)]
_legends = ['foo', 'foo', 'foo', 'blah', 'foo', 'foo']

plt.hist(_nums, histtype='bar', align='mid', color=_colors, log=False, label=_legends)

plt.show()

The above code gives me:

  File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 2332, in hist
    ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, **kwargs)
  File "/usr/lib64/python2.7/site-packages/matplotlib/axes.py", line 7598, in hist
    raise ValueError("color kwarg must have one color per dataset")
ValueError: color kwarg must have one color per dataset

Mainly, I am suggesting the error message to be improved and to write out how many
items were in data, color and legend iterables passed to the function. That would help

Would it tells me my problem is not with color but with data points life would be much easier. :wink:

in some cases albeit not with this example. That needs some other fix. :wink:

I would like that one can also pass in a list of HTML-like colors, e.g. 'F0F8FF' or 0xF0F8FF
would be valid.

Sorry, meant also '#F0F8FF', but now I have verified that they do work already:

_colors = ['b', 'b', 'b', 'r', 'b', 'b']
_colors = ['#C0C0C0', '#C0C0C0', '#C0C0C0', '#800000', '#C0C0C0', '#C0C0C0']
_colors = [(0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255), (0.5019607843137255, 0.0, 0.5019607843137255)]

So this was all about *data* points to be wrapped in iterables. :((

Martin