Nov 21 2022 · Aleksandra Płońska, Piotr Płoński

9 ways to set colors in Matplotlib

Matplotlib colorsMatplotlib is a powerful visualization package for Python. It is very customizable, thanks to this it is widly used in commercial and in academic use cases. In this article, I will show you 9 different ways how to set colors in Matplotlib plots. All parts of the plot can be customized with a new color. You can set colors for axes, labels, background, title. However, not every data scientist is a graphic designer that can compose nice looking colors in a single plot, so I can show you how to use predefined Matplotlib styles to get attractive plots.

1. Define color as RGB/RGBA float touple

The first method to define a color in a Matplotlib is to use RGB (red, green, blue) or RGBA (red, green, blue, alpha) touple of floats. The numbers should be in range [0, 1]. Each number in the touple controls how many of base color will be in final color. For example (1, 0, 0) is red color because there is 0 of green and blue. The alpha parameter in RGBA controls transparency. It is useful when we have overlaping elements in the plot.

Below is a minimal example of how to set color in the plot. We simply pass color parameter in the plot function with touple:

plt.plot(data, color=(0,1,0))

Plot with several colors is presented below. RGB colors are randomly generated.

x = np.array(range(100)) 

fig = plt.figure()
ax = plt.subplot(111)

ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)

for i in range(11):
    r = np.round(np.random.rand(),1)
    g = np.round(np.random.rand(),1)
    b = np.round(np.random.rand(),1)
    
    y = i + np.random.rand(100)*0.25
    plt.plot(x, y, color=[r,g,b])
    plt.annotate(f"({r}, {g}, {b})", (100, y[-1]))

Matplotlib rgb colors

Here is an example of histograms with overlaping distributions, we use alpha parameter to visualize them:

np.random.seed(12)
x = np.array(range(100)) 

fig = plt.figure()
ax = plt.subplot(111)

ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)

for i in range(4):
    r = np.round(np.random.rand(),1)
    g = np.round(np.random.rand(),1)
    b = np.round(np.random.rand(),1)
    a = np.round(np.clip(np.random.rand(), 0, 1), 1)
    
    y = i+np.random.normal(i*3, 1.5, (4-i)*100)
    plt.hist(y, color=[r,g,b, a], label=str(np.round(i*0.1, 1)))
    plt.annotate(f"({r}, {g}, {b}, {a})", (i*4, (4-i)*20))

Matplotlib rgba colors

2. Matplotlib color as RGB/RGBA hex

The RGB and RGBA colors can be defined as hex strings, similar to CSS style sheet language. The minimum value is 00 and maximum value is FF. You need to start string with #.

plt.plot([3,1,2,4], color="#11aa00")
plt.plot([4,2,1,3], color="#11aa0055")
plt.annotate(f"#11aa00", (0.1, 2.8))
plt.annotate(f"#11aa0055", (0.1, 3.8))

Matplotlib hex color

3. Shorthand RGB/RGBA hex

The hex string can be shorted if there are the duplicate values for each channel. For example #11aa00 can be passed as #1a0 and #11aa0055 can be passed as #1a05:

plt.plot([3,1,2,4], color="#1a0")
plt.plot([4,2,1,3], color="#1a05")
plt.annotate(f"#1a0", (0.1, 2.8))
plt.annotate(f"#1a05", (0.1, 3.8))

Matplotlib short hex colors

Please remember, that if you are using shorthand hex, then it should be applied to all channels.

4. Gray scale

You can define a color as a gray scale by passing a string representation of float number from range [0,1]. Please remember that the float needs to be passed as a string. Below is an example of gray scale colors:

np.random.seed(14)
x = np.array(range(100)) 
fig = plt.figure()
ax = plt.subplot(111)
ax.set_facecolor('#222')
ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)

for i in range(11):
    r = np.round(np.random.rand(),1)
    g = np.round(np.random.rand(),1)
    b = np.round(np.random.rand(),1)
    
    y = i + np.random.rand(100)*0.25
    plt.plot(x,  y, color=f"{i/10}")
    plt.annotate(f"{i/10}", (100-2, y[-1]), color="w")

Matplotlib gray scale color color

5. Single letter string

Matplotlib package has implementation of several sets of named colors. The first type of named colors are single letter colors. You can list them with the following code:

import matplotlib.colors as mcolors
print(mcolors.BASE_COLORS)

Output:

{'b': (0, 0, 1),
 'g': (0, 0.5, 0),
 'r': (1, 0, 0),
 'c': (0, 0.75, 0.75),
 'm': (0.75, 0, 0.75),
 'y': (0.75, 0.75, 0),
 'k': (0, 0, 0),
 'w': (1, 1, 1)}

Below is an example that is using all single letter colors:

colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']

np.random.seed(14)
x = np.array(range(100)) 
fig = plt.figure()
ax = plt.subplot(111)
ax.set_facecolor('#333')
ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)

for i in range(8):
    r = np.round(np.random.rand(),1)
    g = np.round(np.random.rand(),1)
    b = np.round(np.random.rand(),1)
    
    y = i + np.random.rand(100)*0.25
    plt.plot(x,  y, color=colors[i])
    plt.annotate(f"{colors[i]}", (100, y[-1]), color="w")

Matplotlib base colors

6. X11/CSS color names

The next set of named colors comes from X11 list. Those are the same color names as used in CSS styling language (from web development). There are 148 color names available. You can list them with the following command:

import matplotlib.colors as mcolors
print(mcolors.CSS4_COLORS)

You can check their visualization in Matplotlib documentation or in Wikipedia article about X11 colors.

Example color names:

print(mcolors.CSS4_COLORS)

>>> { 'aliceblue': '#F0F8FF',
      'antiquewhite': '#FAEBD7',
      'aqua': '#00FFFF',
      'aquamarine': '#7FFFD4',
      'azure': '#F0FFFF',
      'beige': '#F5F5DC',
      'bisque': '#FFE4C4',
      ...

7. XKCD color names

The XKCD is a website with comics, run by Randall Munroe. He made a survey about most used RGB colors anc compiled them into the list. There are 949 colors available in the Matplotlib package. You can list XKCD colors with the following command:

import matplotlib.colors as mcolors
print(mcolors.XKCD_COLORS)

>>> { 'xkcd:cloudy blue': '#acc2d9',
      'xkcd:dark pastel green': '#56ae57',
      'xkcd:dust': '#b2996e',
      'xkcd:electric lime': '#a8ff04',
      'xkcd:fresh green': '#69d84f',
      'xkcd:light eggplant': '#894585',
      'xkcd:nasty green': '#70b23f',
      ...

Please check the XKCD website to check all color names.

8. Cycler colors

There is colors cycler available in the Matplotlib. It define a list of colors that by default are used in the plot. The are used in the cycle. You can list them with following command:

print(plt.rcParams["axes.prop_cycle"])

>>> cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])

You can observe color cycle by ploting several lines in the chart without specifying the color:

x = np.array(range(10))

for i in range(30):
    plt.plot(x, i+x)

Matplotlib color cycle

You can access the cycler colors by string "Cx", where x is a color index in the list. For example to get first color from the cycler list you will use color="C0" - counting starts from 0 :-)

9. Tableau colors

The last set of named colors is from Tableau palette. You can access them with the following code:

print(mcolors.TABLEAU_COLORS)

>>> { 'tab:blue': '#1f77b4',
      'tab:orange': '#ff7f0e',
      'tab:green': '#2ca02c',
      'tab:red': '#d62728',
      'tab:purple': '#9467bd',
      'tab:brown': '#8c564b',
      'tab:pink': '#e377c2',
      'tab:gray': '#7f7f7f',
      'tab:olive': '#bcbd22',
      'tab:cyan': '#17becf'}

Customize colors in the Matplotlib chart

You can set a new color to any part of the Matplotlib chart. Let's take a default view for very simple plot:

plt.plot([1,3,2,4])

Matplotlib example default plot

We can change the background color outside the plot and inside the plot:

fig, ax = plt.subplots(facecolor="red")
ax.set_facecolor(color="green")
ax.plot([1,3,2,4], color="C1")

Matplotlib set background color

We can change colors for title, labels, and ticks:

fig, ax = plt.subplots(facecolor="gray")
ax.set_facecolor(color="azure")
ax.set_title("Title", color="aqua")
ax.set_xlabel("X Label", color="magenta")
ax.set_ylabel('Y Label', color="orange")
ax.tick_params(labelcolor='red')
ax.plot([1,3,2,4])

Matplotlib labels title ticks

Predefined Matplotlib styles

There predefined styles in Matplotlib so you don't need to worry which colors to select. Each style defines background color, text color and new cycles colors. It is a complete set of colors. You can list all available styles with the following code:

print(plt.style.available)

>>> [ 'Solarize_Light2',
      '_classic_test_patch',
      '_mpl-gallery',
      '_mpl-gallery-nogrid',
      'bmh',
      'classic',
      'dark_background',
      'fast',
      'fivethirtyeight',
      'ggplot',
      'grayscale',
      'seaborn-v0_8',
      'seaborn-v0_8-bright',
      'seaborn-v0_8-colorblind',
      'seaborn-v0_8-dark',
      'seaborn-v0_8-dark-palette',
      'seaborn-v0_8-darkgrid',
      'seaborn-v0_8-deep',
      'seaborn-v0_8-muted',
      'seaborn-v0_8-notebook',
      'seaborn-v0_8-paper',
      'seaborn-v0_8-pastel',
      'seaborn-v0_8-poster',
      'seaborn-v0_8-talk',
      'seaborn-v0_8-ticks',
      'seaborn-v0_8-white',
      'seaborn-v0_8-whitegrid',
      'tableau-colorblind10']

You can set the style globally for all plots:

plt.style.use("ggplot")

or you can set style just for single plot:

with plt.style.context("ggplot"):
    plt.plot([1,2,3])

I've plotted all styles below with lines plot:

x = np.array(range(10)) 
fig = plt.figure(figsize=(10, 20), tight_layout=True)

for i, style in enumerate(['default'] + plt.style.available):
    with plt.style.context(style):
        ax = fig.add_subplot(10, 3, i + 1)
        for i in range(10):
            y = i + np.random.rand(10)*0.25
            ax.plot(x,  y)
            
    if style == "dark_background":
        ax.set_title(style, color="k")
    else:
        ax.set_title(style)

Matplotlib styles deplayed on line plots

All styles with histograms:

fig = plt.figure(figsize=(10, 20), tight_layout=True)

for i, style in enumerate(['default'] + plt.style.available):
    with plt.style.context(style):
        ax = fig.add_subplot(10, 3, i + 1)
        for i in range(4):
            y = i+np.random.normal(i*3, 1.5, (4-i)*100)
            ax.hist(y)
    
    if style == "dark_background":
        ax.set_title(style, color="k")
    else:
        ax.set_title(style)

Matplotlib styles deplayed on bar plots

Summary

Matplotlib is a perfect library for scientific and commercial visualizations. It is highly customizable. There are 9 ways to set a new color. You can change color for every part of the plot. There are many predefined styles available in the package, that can help you to create attractive charts.