Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Single-character colors do not match long names #17591

Closed
QuLogic opened this issue Jun 9, 2020 · 9 comments · Fixed by #17665
Closed

Single-character colors do not match long names #17591

QuLogic opened this issue Jun 9, 2020 · 9 comments · Fixed by #17665
Milestone

Comments

@QuLogic
Copy link
Member

QuLogic commented Jun 9, 2020

Bug report

Bug summary

According to our docs:

one of {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}, they are the single character short-hand notations for blue, green, red, cyan, magenta, yellow, black, and white.

Code for reproduction

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
for i, long in enumerate('blue green red cyan magenta yellow'.split()):
    short = long[0]
    ax.plot([0], c=long, label=long)
    ax.plot([0], c=short, label=short)
ax.legend()

plt.show()

Actual outcome

Figure_1

Expected outcome

cyan/c, magenta/m, yellow/y should match each other. I don't think we can change these unless we do a 4 release, so I've labelled this as a documentation fix.

Matplotlib version

  • Matplotlib version: master
  • Matplotlib backend (print(matplotlib.get_backend())): Tkagg
  • Python version: 3.6.8
@QuLogic QuLogic added Documentation Good first issue Open a pull request against these issues if there are no active ones! labels Jun 9, 2020
@QuLogic QuLogic changed the title Single-character color names do not match long ones Single-character colors do not match long names Jun 9, 2020
@timhoffm timhoffm removed the Good first issue Open a pull request against these issues if there are no active ones! label Jun 9, 2020
@timhoffm
Copy link
Member

timhoffm commented Jun 9, 2020

😨

I've removed "Good first issue", because IMHO resolving this is not easy:

  1. Find out if this has always been the case or if it is a regression.
  2. Decide how to procede: fix / deprecate / document (should probably discussed in the dev call)
  3. If document I think very good wording is essential so that we communicate clearly but at the same time do not appear too weird or dumb.

@timhoffm
Copy link
Member

timhoffm commented Jun 9, 2020

The issue seems to be that the long names are CSS4 colors, which do not match the base (original MATLAB?) colors for c,m, y.

@tacaswell
Copy link
Member

The values of {'c', 'y', 'm', 'g'} have been what they are from at least e34a333 (2004). I have a vague recollection of discussing changing this around the 2.0 style changes. Given that we were committed to providing an easy way to get back to the old style, if we changed the meaning of 'b' we would have to add an API (even if only private) to control the str -> rgb mapping which seemed a bridge too far.

The single-letter colors are defined at

BASE_COLORS = {
'b': (0, 0, 1), # blue
'g': (0, 0.5, 0), # green
'r': (1, 0, 0), # red
'c': (0, 0.75, 0.75), # cyan
'm': (0.75, 0, 0.75), # magenta
'y': (0.75, 0.75, 0), # yellow
'k': (0, 0, 0), # black
'w': (1, 1, 1), # white
}
and the CSS4 are farther down the same file:
CSS4_COLORS = {
'aliceblue': '#F0F8FF',
'antiquewhite': '#FAEBD7',
'aqua': '#00FFFF',
'aquamarine': '#7FFFD4',
'azure': '#F0FFFF',
'beige': '#F5F5DC',
'bisque': '#FFE4C4',
'black': '#000000',
'blanchedalmond': '#FFEBCD',
'blue': '#0000FF',
'blueviolet': '#8A2BE2',
'brown': '#A52A2A',
'burlywood': '#DEB887',
'cadetblue': '#5F9EA0',
'chartreuse': '#7FFF00',
'chocolate': '#D2691E',
'coral': '#FF7F50',
'cornflowerblue': '#6495ED',
'cornsilk': '#FFF8DC',
'crimson': '#DC143C',
'cyan': '#00FFFF',
'darkblue': '#00008B',
'darkcyan': '#008B8B',
'darkgoldenrod': '#B8860B',
'darkgray': '#A9A9A9',
'darkgreen': '#006400',
'darkgrey': '#A9A9A9',
'darkkhaki': '#BDB76B',
'darkmagenta': '#8B008B',
'darkolivegreen': '#556B2F',
'darkorange': '#FF8C00',
'darkorchid': '#9932CC',
'darkred': '#8B0000',
'darksalmon': '#E9967A',
'darkseagreen': '#8FBC8F',
'darkslateblue': '#483D8B',
'darkslategray': '#2F4F4F',
'darkslategrey': '#2F4F4F',
'darkturquoise': '#00CED1',
'darkviolet': '#9400D3',
'deeppink': '#FF1493',
'deepskyblue': '#00BFFF',
'dimgray': '#696969',
'dimgrey': '#696969',
'dodgerblue': '#1E90FF',
'firebrick': '#B22222',
'floralwhite': '#FFFAF0',
'forestgreen': '#228B22',
'fuchsia': '#FF00FF',
'gainsboro': '#DCDCDC',
'ghostwhite': '#F8F8FF',
'gold': '#FFD700',
'goldenrod': '#DAA520',
'gray': '#808080',
'green': '#008000',
'greenyellow': '#ADFF2F',
'grey': '#808080',
'honeydew': '#F0FFF0',
'hotpink': '#FF69B4',
'indianred': '#CD5C5C',
'indigo': '#4B0082',
'ivory': '#FFFFF0',
'khaki': '#F0E68C',
'lavender': '#E6E6FA',
'lavenderblush': '#FFF0F5',
'lawngreen': '#7CFC00',
'lemonchiffon': '#FFFACD',
'lightblue': '#ADD8E6',
'lightcoral': '#F08080',
'lightcyan': '#E0FFFF',
'lightgoldenrodyellow': '#FAFAD2',
'lightgray': '#D3D3D3',
'lightgreen': '#90EE90',
'lightgrey': '#D3D3D3',
'lightpink': '#FFB6C1',
'lightsalmon': '#FFA07A',
'lightseagreen': '#20B2AA',
'lightskyblue': '#87CEFA',
'lightslategray': '#778899',
'lightslategrey': '#778899',
'lightsteelblue': '#B0C4DE',
'lightyellow': '#FFFFE0',
'lime': '#00FF00',
'limegreen': '#32CD32',
'linen': '#FAF0E6',
'magenta': '#FF00FF',
'maroon': '#800000',
'mediumaquamarine': '#66CDAA',
'mediumblue': '#0000CD',
'mediumorchid': '#BA55D3',
'mediumpurple': '#9370DB',
'mediumseagreen': '#3CB371',
'mediumslateblue': '#7B68EE',
'mediumspringgreen': '#00FA9A',
'mediumturquoise': '#48D1CC',
'mediumvioletred': '#C71585',
'midnightblue': '#191970',
'mintcream': '#F5FFFA',
'mistyrose': '#FFE4E1',
'moccasin': '#FFE4B5',
'navajowhite': '#FFDEAD',
'navy': '#000080',
'oldlace': '#FDF5E6',
'olive': '#808000',
'olivedrab': '#6B8E23',
'orange': '#FFA500',
'orangered': '#FF4500',
'orchid': '#DA70D6',
'palegoldenrod': '#EEE8AA',
'palegreen': '#98FB98',
'paleturquoise': '#AFEEEE',
'palevioletred': '#DB7093',
'papayawhip': '#FFEFD5',
'peachpuff': '#FFDAB9',
'peru': '#CD853F',
'pink': '#FFC0CB',
'plum': '#DDA0DD',
'powderblue': '#B0E0E6',
'purple': '#800080',
'rebeccapurple': '#663399',
'red': '#FF0000',
'rosybrown': '#BC8F8F',
'royalblue': '#4169E1',
'saddlebrown': '#8B4513',
'salmon': '#FA8072',
'sandybrown': '#F4A460',
'seagreen': '#2E8B57',
'seashell': '#FFF5EE',
'sienna': '#A0522D',
'silver': '#C0C0C0',
'skyblue': '#87CEEB',
'slateblue': '#6A5ACD',
'slategray': '#708090',
'slategrey': '#708090',
'snow': '#FFFAFA',
'springgreen': '#00FF7F',
'steelblue': '#4682B4',
'tan': '#D2B48C',
'teal': '#008080',
'thistle': '#D8BFD8',
'tomato': '#FF6347',
'turquoise': '#40E0D0',
'violet': '#EE82EE',
'wheat': '#F5DEB3',
'white': '#FFFFFF',
'whitesmoke': '#F5F5F5',
'yellow': '#FFFF00',
'yellowgreen': '#9ACD32'}

While walking through the blame on this I found that in 2016 I tried to change the single-letter names to be hex like the rest of the color definitions and that broke tests so got abandoned.

From my attempts to look at the MATLAB docs (which I can only find back to 2015 online) I don't think this is something we inherited from them. I suspect that this "dimming" of the colors was an intentional aesthetic choice, but we would need confirmation from someone who was around back then.

@mdboom
Copy link
Member

mdboom commented Jun 9, 2020

This decision predates me, I'm afraid (though I remember the discussion in the 2.0 timeframe of how to handle this in a backward compatible way, if at all). Maybe @efiring knows?

@efiring
Copy link
Member

efiring commented Jun 9, 2020

I think we did inherit the single-letter colors from Matlab. I suspect JDH did this in the very beginning. In early days of both Matlab and mpl, they were the most commonly used colors, by far, forming the default color cycle. There was never any intention that they correspond to colors from some extensive set; they are obviously very simple modifications of RGBCMYK extremes. The modifications are to make them work better. The clearest example of this 'y'. It is much more visible than "yellow". As a color for a line, "yellow" is unusable.

@efiring
Copy link
Member

efiring commented Jun 9, 2020

Wherever the docs has "one of {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}, they are the single character short-hand notations for blue, green, red, cyan, magenta, yellow, black, and white." it could be modified, "...notations for shades of blue...and white, respectively. The particular shades were chosen early in the development of Matplotlib to be suitable for lines against typical backgrounds." The hope here is that the "shades of" phrasing would help reduce any expectation that 'y' should be the same as "yellow". This expectation should already be somewhat reduced by the current phrasing, in which 'y' is in quotes but yellow is not. The former is a name, the latter is generic.

@QuLogic
Copy link
Member Author

QuLogic commented Jun 18, 2020

I just remembered there are multiple locations of this, and #17665 only updated one of them. There's also:

  • module docstring of lib/matplotlib/colors.py
  • example examples/color/color_demo.py (though it doesn't say what the single-character colors mean, so maybe that's fine.)

@QuLogic QuLogic reopened this Jun 18, 2020
@jklymak
Copy link
Member

jklymak commented Jun 19, 2020

A suggestion might be to have long names for these shades so they aren’t ambiguous. Ie mpl-yellow ?

@timhoffm
Copy link
Member

I don't think we need yet another set of names. The single-letter characters won't go away by introducing corresponding long names. They don't get less ambigous as well: You could only make the connection 'y' -> 'mpl-yellow' in the docs, but that's not better than directly explaining 'y' is a shade of yellow, in fact you still would have to do that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants