Skip to content

Commit

Permalink
Merge pull request #6390 from anntzer/xkcd-colors-namespace
Browse files Browse the repository at this point in the history
API: Use xkcd: prefix to avoid color name clashes.
  • Loading branch information
tacaswell committed May 12, 2016
1 parent 9b39f3e commit c2b6769
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 40 deletions.
49 changes: 19 additions & 30 deletions doc/users/colors.rst
Expand Up @@ -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}

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)):
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')
11 changes: 3 additions & 8 deletions lib/matplotlib/_color_data.py
Expand Up @@ -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()}


# https://drafts.csswg.org/css-color-4/#named-colors
Expand Down
4 changes: 2 additions & 2 deletions lib/matplotlib/tests/test_colors.py
Expand Up @@ -562,7 +562,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'))
assert XKCD_blue == '#0343df'


Expand Down Expand Up @@ -608,7 +608,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'))
Expand Down

0 comments on commit c2b6769

Please sign in to comment.