-
-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Use xkcd: prefix to avoid color name clashes. #6390
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,68 +4,57 @@ | |
| Specifying Colors | ||
| ***************** | ||
|
|
||
| In almost all places in matplotlib where a color can be specified by the user it can be provided as: | ||
| In almost all places in matplotlib where a color can be specified by the user | ||
| it can be provided as: | ||
|
|
||
| * ``(r, g, b)`` tuples | ||
| * ``(r, g, b, a)`` tuples | ||
| * hex string, ex ``#OFOFOF`` | ||
| * float value between [0, 1] for gray level | ||
| * One of ``{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}`` | ||
| * valid css4/X11 color names | ||
| * valid name from the `XKCD color survey | ||
| * valid CSS4/X11 color names | ||
| * valid name from the `xkcd color survey | ||
| <http://blog.xkcd.com/2010/05/03/color-survey-results/>`__ These | ||
| names are available both with and with out spaces. In the case of name clashes | ||
| the css/X11 names have priority. To ensure colors | ||
| from the XKCD mapping are used prefix the space-less name with | ||
| ``'XKCD'``. | ||
| names are prefixed with ``'xkcd:'`` (e.g., ``'xkcd:sky blue'``) to | ||
| prevent name clashes with the CSS4/X11 names. | ||
|
|
||
| All string specifications of color are case-insensitive. | ||
|
|
||
| Internally, mpl is moving to storing all colors as RGBA float quadruples. | ||
|
|
||
| Name clash between CSS4/X11 and XKCD | ||
| ------------------------------------ | ||
|
|
||
| The color names in the XKCD survey include spaces (unlike css4/X11 | ||
| names). Matplotlib exposes all of the XKCD colors both with and | ||
| without spaces. | ||
|
|
||
| There are 95 (out of 148 colors in the css color list) conflicts | ||
| between the css4/X11 names and the XKCD names. Given that these are | ||
| the standard color names of the web, matplotlib should follow these | ||
| conventions. To accesses the XKCD colors which are shadowed by css4, | ||
| prefix the colorname with ``'XKCD'``, for example ``'blue'`` maps to | ||
| ``'#0000FF'`` where as ``'XKCDblue'`` maps to ``'#0343DF'``. | ||
| There are 95 (out of 148 colors in the css color list) conflicts between the | ||
| CSS4/X11 names and the xkcd names. Given that the former are the standard | ||
| color names of the web, matplotlib should follow them. Thus, xkcd color names | ||
| are prefixed with ``'xkcd:'``, for example ``'blue'`` maps to ``'#0000FF'`` | ||
| where as ``'xkcd:blue'`` maps to ``'#0343DF'``. | ||
|
|
||
| .. plot:: | ||
|
|
||
| import matplotlib.pyplot as plt | ||
| import matplotlib._color_data as mcd | ||
|
|
||
| import matplotlib.patches as mpatch | ||
| overlap = (set(mcd.CSS4_COLORS) & set(mcd.XKCD_COLORS)) | ||
|
|
||
| overlap = {name for name in mcd.CSS4_COLORS | ||
| if "xkcd:" + name in mcd.XKCD_COLORS} | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. without the space stripped names you miss some of the overlaps |
||
|
|
||
| fig = plt.figure(figsize=[4.8, 16]) | ||
| ax = fig.add_axes([0, 0, 1, 1]) | ||
|
|
||
| j = 0 | ||
|
|
||
| for n in sorted(overlap, reverse=True): | ||
| for j, n in enumerate(sorted(overlap, reverse=True)): | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This means you can also drop the |
||
| cn = mcd.CSS4_COLORS[n] | ||
| xkcd = mcd.XKCD_COLORS[n].upper() | ||
| xkcd = mcd.XKCD_COLORS["xkcd:" + n].upper() | ||
| if cn != xkcd: | ||
| print (n, cn, xkcd) | ||
| print(n, cn, xkcd) | ||
|
|
||
| r1 = mpatch.Rectangle((0, j), 1, 1, color=cn) | ||
| r2 = mpatch.Rectangle((1, j), 1, 1, color=xkcd) | ||
| txt = ax.text(2, j+.5, ' ' + n, va='center', fontsize=10) | ||
| ax.add_patch(r1) | ||
| ax.add_patch(r2) | ||
| ax.axhline(j, color='k') | ||
| j += 1 | ||
|
|
||
| ax.text(.5, j+.1, 'X11', ha='center') | ||
| ax.text(1.5, j+.1, 'XKCD', ha='center') | ||
| ax.text(.5, j + .1, 'X11', ha='center') | ||
| ax.text(1.5, j + .1, 'XKCD', ha='center') | ||
| ax.set_xlim(0, 3) | ||
| ax.set_ylim(0, j + 1) | ||
| ax.axis('off') | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -961,14 +961,9 @@ | |
| 'green': '#15b01a', | ||
| 'purple': '#7e1e9c'} | ||
|
|
||
| # normalize to names with no spaces and provide versions with XKCD | ||
| # prefix. | ||
| for k in list(XKCD_COLORS): | ||
| XKCD_COLORS['xkcd'+k] = XKCD_COLORS[k] | ||
| _k = k.replace(' ', '') | ||
| if _k != k: | ||
| XKCD_COLORS[_k] = XKCD_COLORS[k] | ||
| XKCD_COLORS['xkcd'+_k] = XKCD_COLORS[k] | ||
|
|
||
| # Normalize name to "xkcd:<name>" to avoid name collisions. | ||
| XKCD_COLORS = {'xkcd:' + name: value for name, value in XKCD_COLORS.items()} | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is it worth still providing the space-free versions?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure what the space-free versions buys you...
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. slightly terser color names.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we then just standardize on the space-less versions then? Having both just feels like... not being able to make up your mind. (This would also solve the missing overlaps you mention below.) |
||
|
|
||
|
|
||
| # https://drafts.csswg.org/css-color-4/#named-colors | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -563,7 +563,7 @@ def test_xkcd(): | |
| mcolors.colorConverter.to_rgb('blue')) | ||
| assert x11_blue == '#0000ff' | ||
| XKCD_blue = mcolors.rgb2hex( | ||
| mcolors.colorConverter.to_rgb('XKCDblue')) | ||
| mcolors.colorConverter.to_rgb('xkcd:blue')) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does read much better. |
||
| assert XKCD_blue == '#0343df' | ||
|
|
||
|
|
||
|
|
@@ -621,7 +621,7 @@ def test_cn(): | |
| assert red == '#ff0000' | ||
|
|
||
| matplotlib.rcParams['axes.prop_cycle'] = cycler('color', | ||
| ['XKCDblue', 'r']) | ||
| ['xkcd:blue', 'r']) | ||
| XKCD_blue = mcolors.rgb2hex(mcolors.colorConverter.to_rgb('C0')) | ||
| assert XKCD_blue == '#0343df' | ||
| red = mcolors.rgb2hex(mcolors.colorConverter.to_rgb('C1')) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please leave this plot.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Even if we are explicitly name-spacing the colors, I think this chart is still interesting to include in the docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you OK for explicitly namespacing everything then? It'll always be easier to add un-namespaced versions later than removing them...