这里有一个说明性的例子
如何创建自定义色图。
docstring对于理解
cdict
的含义至关重要。一旦你掌握了这个,你可以像这样使用
cdict
:
cdict = {'red': ((0.0, 1.0, 1.0),
(0.1, 1.0, 1.0),
(0.4, 1.0, 1.0),
(1.0, 0.0, 0.0)),
'green': ((0.0, 0.0, 0.0),
(1.0, 0.0, 0.0)),
'blue': ((0.0, 0.0, 0.0),
(0.1, 0.0, 0.0),
(0.4, 1.0, 1.0),
(1.0, 1.0, 0.0))
}
尽管
cdict
格式给了你很大的灵活性,但我发现对于简单的渐变,它的格式相当不直观。这里有一个实用函数来帮助生成简单的线性分段调色板:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
def make_colormap(seq):
"""Return a LinearSegmentedColormap
seq: a sequence of floats and RGB-tuples. The floats should be increasing
and in the interval (0,1).
"""
seq = [(None,) * 3, 0.0] + list(seq) + [1.0, (None,) * 3]
cdict = {'red': [], 'green': [], 'blue': []}
for i, item in enumerate(seq):
if isinstance(item, float):
r1, g1, b1 = seq[i - 1]
r2, g2, b2 = seq[i + 1]
cdict['red'].append([item, r1, r2])
cdict['green'].append([item, g1, g2])
cdict['blue'].append([item, b1, b2])
return mcolors.LinearSegmentedColormap('CustomMap', cdict)
c = mcolors.ColorConverter().to_rgb
rvb = make_colormap(
[c('red'), c('violet'), 0.33, c('violet'), c('blue'), 0.66, c('blue')])
N = 1000
array_dg = np.random.uniform(0, 10, size=(N, 2))
colors = np.random.uniform(-2, 2, size=(N,))
plt.scatter(array_dg[:, 0], array_dg[:, 1], c=colors, cmap=rvb)
plt.colorbar()
plt.show()
![enter image description here](https://istack.dev59.com/3ULpI.webp)
顺便说一下,
for循环
。
for i in range(0, len(array_dg)):
plt.plot(array_dg[i], markers.next(),alpha=alpha[i], c=colors.next())
每次调用
plt.plot
将为一个点绘制一个图表。这适用于少量的点,但对于许多点来说,速度会变得极其缓慢。
plt.plot
只能绘制一种颜色,但是
plt.scatter
可以为每个点分配不同的颜色。因此,使用
plt.scatter
是正确的方式。
c=
指定了线条颜色,而你在谈论点。如果你真的想要点,那么你只能指定一个markerfacecolor
,使用scatter可能是更好的选择。而且确实ListedColormap
是列出的,不是连续的,可以看看LinearSegmentedColormap
。 - Rutger Kassiesplt.plot(values, 'o')
,你将只绘制标记而没有线条,但标记将具有一个固定的颜色,它不会(也不能)随着值的变化而改变。 - Rutger Kassies