Color names¶
ProPlot registers several new color names and includes tools for defining your own color names. These features are described below.
Included colors¶
ProPlot adds new color names from the XKCD color survey and
the Open Color UI design color
palettes. You can use show_colors
to generate a table of these
colors. Note that matplotlib’s native X11/CSS4 named colors are still
registered, but some of these color names may be overwritten by the XKCD names,
and we encourage choosing colors from the below tables instead. XKCD colors
are normally available in matplotlib under the
xkcd:
prefix, but ProPlot doesn’t require this prefix because the XKCD
selection is larger and the names are more likely to match your intuition
for what a color “should” look like.
To reduce the number of registered color names to a more manageable size,
ProPlot filters the available XKCD colors so that they are sufficiently
distinct in a perceptually uniform colorspace.
This makes it a bit easier to pick out colors from the table generated with
show_colors
. Similar names were also cleaned up – for
example, 'reddish'
and 'reddy'
are changed to 'red'
.
[1]:
import proplot as pplt
fig, axs = pplt.show_colors()
Modifying colors¶
You can quickly modify colors using the set_alpha
,
set_hue
, set_saturation
,
set_luminance
, shift_hue
,
scale_saturation
and scale_luminance
functions. The set
functions change individual hue, saturation, or
luminance values in the perceptually uniform colorspace
specified by the space
keyword. The shift
and scale
functions shift or
scale the hue, saturation, or luminance by the input value – for example,
scale_luminance('color', 1.2)
makes 'color'
20% brighter. These
are useful for creating color gradations outside of Cycle
or
if you simply spot a color you like and want to make it a bit brighter,
less vibrant, etc.
[2]:
import proplot as pplt
import numpy as np
# Figure
state = np.random.RandomState(51423)
fig, axs = pplt.subplots(ncols=3, axwidth=2)
axs.format(
suptitle='Modifying colors',
toplabels=('Shifted hue', 'Scaled luminance', 'Scaled saturation'),
toplabelweight='normal',
xformatter='none', yformatter='none',
)
# Shifted hue
N = 50
fmt = pplt.SimpleFormatter()
marker = 'o'
for shift in (0, -60, 60):
x, y = state.rand(2, N)
color = pplt.shift_hue('grass', shift)
axs[0].scatter(x, y, marker=marker, c=color, legend='b', label=fmt(shift))
# Scaled luminance
for scale in (0.2, 1, 2):
x, y = state.rand(2, N)
color = pplt.scale_luminance('bright red', scale)
axs[1].scatter(x, y, marker=marker, c=color, legend='b', label=fmt(scale))
# Scaled saturation
for scale in (0, 1, 3):
x, y = state.rand(2, N)
color = pplt.scale_saturation('ocean blue', scale)
axs[2].scatter(x, y, marker=marker, c=color, legend='b', label=fmt(scale))
Colors from colormaps¶
If you want to draw an individual color from a colormap or a color cycle,
use color=(cmap, coord)
or color=(cycle, index)
with any command
that accepts the color
keyword. The coord
should be between 0
and
1
, while the index
is the index on the list of cycle colors. This
feature is powered by the ColorDatabase
class. This is
useful if you spot a nice color in one of the available colormaps or color
cycles and want to use it for some arbitrary plot element. Use the
to_rgb
or to_rgba
functions to retrieve
the RGB or RGBA channel values.
[3]:
import proplot as pplt
import numpy as np
# Drawing from colormaps
fig = pplt.figure(refwidth=2.2, share=False)
ax = fig.subplot(121)
name = 'Deep'
idxs = pplt.arange(0, 1, 0.2)
state = np.random.RandomState(51423)
state.shuffle(idxs)
for idx in idxs:
data = (state.rand(20) - 0.4).cumsum()
h = ax.plot(
data, lw=5, color=(name, idx),
label=f'idx {idx:.1f}', legend='l', legend_kw={'ncols': 1}
)
ax.colorbar(pplt.Colormap(name), loc='l', locator='none')
ax.format(title=f'Drawing from colormap {name!r}', grid=True)
# Drawing from color cycles
ax = fig.subplot(122)
name = 'Qual1'
idxs = np.arange(6)
state.shuffle(idxs)
for idx in idxs:
data = (state.rand(20) - 0.4).cumsum()
h = ax.plot(
data, lw=5, color=(name, idx),
label=f'idx {idx:.0f}', legend='r', legend_kw={'ncols': 1}
)
ax.colorbar(pplt.Colormap(name), loc='r', locator='none')
ax.format(title=f'Drawing from color cycle {name!r}')
fig.format(
abc='A.', titleloc='l',
suptitle='On-the-fly color selections',
xformatter='null', yformatter='null',
)
Using your own colors¶
You can register your own colors by adding .txt
files to the
colors
subfolder inside user_folder
and calling register_colors
. This command is also called
on import. You can also manually pass file paths, dictionaries, name=color
keyword arguments to register_colors
. Each color
file should contain lines that look like color: #xxyyzz
where color
is the registered color name and #xxyyzz
is
the HEX value. Lines beginning with #
are ignored as comments.