Python系列之Matplotlib-自定义colormap

这篇文章记录了在Matplotlib自定义colormap的方法。

背景

最近想利用给定的颜色设置一个连续变化的colormap,发现Matplotlib并没有像Rggplot2scale_colour_gradient2(low = "white", mid = "#000000", high = "red")设置colormap这么简便的方法,这里记录一下简单设置(能用)的方法。


设置colormap

如下代码实现了low="grey", middle="black", high="red"的效果:

1
2
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list('custom greys', [(.8,.8,.8),(0,0,0),(1,0,0)], N=256)

关键点:

  • LinearSegmentedColormap.from_list从颜色列表创建colormap的函数,默认的LinearSegmentedColormap函数是从颜色字典进行colormap创建的
  • 'custom greys':colormap的名称
  • (.8,.8,.8)颜色并不是使用的(255, 255, 255)这种0~255范围的数字表示的,而是使用的0-1之间的数字表示的,如果使用0~255的数字表示会报错ValueError: RGBA values should be within 0-1 range;还可以使用十六进制的字符表示的颜色创建
  • N=256表示颜色设置的颜色之间过渡的bin数目,数值越大颜色过渡越平滑

颜色表示和转换

内置的颜色及简写

Matplotlib内置了一些常见的颜色,这些颜色可以使用指定的简写形式来代表,如果想指定的颜色不在这个列表内是不能自己想当然或者使用常见的简写来表示的。内置的常见颜色以及简写如下:

  • b: blue
  • g: green
  • r: red
  • c: cyan
  • m: magenta
  • y: yellow
  • k: black
  • w: white

将颜色转换为rgb、rgba

内置的颜色都是非常常见的颜色,数目非常少,而实际使用过程中可能会遇到一些不在这个内置颜色列表中的颜色,这个时候可以有两种方式:

  • 使用十六进制的字符表示的颜色
  • 使用Matplotlib内置的函数将不在内置颜色中的常用颜色或者十六进制的字符表示的颜色转换为0~1范围的数字

如下代码展示了将不在内置颜色中的常用颜色或者十六进制的字符表示的颜色转换为0~1范围的数字的方法:

1
2
3
4
5
6
7
8
# 将常用英文颜色转化为0-1之间的颜色表示
from matplotlib.colors import ColorConverter
ColorConverter.to_rgb("black")
(0.0, 0.0, 0.0)

# 将16进制的字符转换为0-1之间的颜色表示
from matplotlib.colors import ColorConverter
ColorConverter.to_rgb("#000000")


三种颜色指定方式示例

下面使用四种颜色指定方式进行示例:

  • 颜色指定方式一:0-1范围内的数字colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B
  • 颜色指定方式二+三:内置的颜色以及16进制的字符表示colors=['r','#008000','b']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 直接使用(255,0,0)表示red会出错
ValueError: RGBA values should be within 0-1 range
# 可以使用自带的工具进行转换

# 生成测试数据
x = np.arange(0, np.pi, 0.1)
y = np.arange(0, 2 * np.pi, 0.1)
X, Y = np.meshgrid(x, y)
Z = np.cos(X) * np.sin(Y) * 10

# colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] # R -> G -> B
colors=['r','#008000','b']
n_bins = [3, 6, 10, 100] # Discretizes the interpolation into bins
cmap_name = 'my_list'
fig, axs = plt.subplots(2, 2, figsize=(6, 9))
fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05)
for n_bin, ax in zip(n_bins, axs.ravel()):
# Create the colormap
cm = LinearSegmentedColormap.from_list(
cmap_name, colors, N=n_bin)
# Fewer bins will result in "coarser" colomap interpolation
im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm)
ax.set_title("N bins: %s" % n_bin)
fig.colorbar(im, ax=ax)

matplotlib_colormap.png


参考链接



-----本文结束感谢您的阅读-----

本文标题:Python系列之Matplotlib-自定义colormap

文章作者:showteeth

发布时间:2020年04月07日 - 17:03

最后更新:2020年05月21日 - 23:15

原始链接:http://showteeth.tech/posts/10006.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%