Skip to content

Single-character colors do not match long names #17591

Closed

Description

@QuLogic

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

Activity

  1. changed the title [-]Single-character color names do not match long ones[/-] [+]Single-character colors do not match long names[/+] on Jun 9, 2020
  2. removed
    🌱 Good first issueOpen a pull request against these issues if there are no active ones!
    on Jun 9, 2020
  3. timhoffm commented on Jun 9, 2020

    @timhoffm
    Member

    😨

    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.
  4. timhoffm commented on Jun 9, 2020

    @timhoffm
    Member

    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.

  5. tacaswell commented on Jun 9, 2020

    @tacaswell
    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.

  6. mdboom commented on Jun 9, 2020

    @mdboom
    Member

    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?

  7. efiring commented on Jun 9, 2020

    @efiring
    Member

    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.

  8. efiring commented on Jun 9, 2020

    @efiring
    Member

    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.

  9. added this to the v3.3.0 milestone on Jun 18, 2020
  10. QuLogic commented on Jun 18, 2020

    @QuLogic
    MemberAuthor

    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.)
  11. jklymak commented on Jun 19, 2020

    @jklymak
    Member

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

  12. timhoffm commented on Jun 24, 2020

    @timhoffm
    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.

  13. added a commit that references this issue on Jul 9, 2020
    3b2c517
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions