默认颜色更改#
如 其他地方 详细讨论的,jet 是一个经验上糟糕的色图,不应作为默认色图。由于改变图表外观会破坏向后兼容性,这一改变被推迟的时间远远超过了应有的时间。除了更改默认色图,我们还计划借此机会更改图表上的默认颜色循环,并为填充图(imshow、pcolor、contourf 等)和类似散点图的图表采用不同的色图。
默认热图颜色映射#
选择一个新的色图是容易引发无谓争论的领域(“不,它应该是_这种_颜色”),因此我们提出了一些评估提议色图的标准(通过Nathaniel Smith)。
它应该是一个顺序色图,因为发散色图在不知道数据“中心”位置的情况下,实际上非常具有误导性,而对于默认色图,我们通常不会知道。
它应该是感知上均匀的,即,人类对相邻颜色之间距离的主观判断应尽可能线性地对应于它们所代表的数值之间的差异,至少在局部上是如此。
它应该有一个感知上均匀的亮度渐变,即如果你转换为灰度,它仍然应该是均匀的。这在实际应用中(灰度打印机仍然存在!)和因为亮度是一个非常强烈且自然的幅度提示方面都很有用。
它还应该有一些色调上的变化,因为色调变化是一个非常有帮助的感知辅助线索,有两个线索总比一个好,而且没有理由不这样做。
色调变化应选择为即使对于更常见的色盲类型也能产生合理的结果。(这排除了像红到绿这样的选择。)
为了加分,选择一个即使去掉亮度变化仍然有效的色调渐变会很好,因为这样我们可以使用带有亮度变化的版本用于2D图,而仅使用色调变化的版本用于3D图。(在3D图中,你真的希望将亮度通道保留给光照/阴影,因为你的大脑非常擅长从亮度变化中提取3D形状。如果3D表面本身具有大量的亮度变化,那么这将破坏观察形状的能力。)
不侵犯任何现有知识产权
示例脚本#
建议的色图#
默认散点颜色映射#
对于类似热图的应用,覆盖尽可能多的亮度范围可能是理想的,然而在颜色映射标记时,标记过于接近白色可能会成为问题。因此,我们建议为基于标记的应用使用一个不同的(但可能相关的)颜色映射,而不是热图的颜色映射。设计参数与上述相同,只是亮度变化更为有限。
示例脚本#
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1234)
fig, (ax1, ax2) = plt.subplots(1, 2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
ax1.scatter(x, y, s=area, c=colors, alpha=0.5)
X,Y = np.meshgrid(np.arange(0, 2*np.pi, .2),
np.arange(0, 2*np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
Q = ax2.quiver(X, Y, U, V, units='width')
qd = np.random.rand(np.prod(X.shape))
Q.set_array(qd)
建议的色图#
颜色循环 / 定性颜色图#
在绘制线条时,通常希望绘制多条线条或艺术家,这些线条或艺术家需要能够区分,但没有固有的顺序。
示例脚本#
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2)
x = np.linspace(0, 1, 10)
for j in range(10):
ax1.plot(x, x * j)
th = np.linspace(0, 2*np.pi, 1024)
for j in np.linspace(0, np.pi, 10):
ax2.plot(th, np.sin(th + j))
ax2.set_xlim(0, 2*np.pi)