你的色彩图有多差?(2014)

2020-08-03 00:42:06

Def grayify_Cmap(Cmap):";";";";返回色彩映射的灰度版本";";";cmap=plt。厘米。Get_Cmap(Cmap)Colors=Cmap(np.。Arange(Cmap.。N))#将RGBA转换为感知的灰度亮度#cf。Http://alienryderflex.com/hsp.html rgb_weight=[0.299,0.587,0.114]亮度=np。SQRT(NP。点(Colors[:,:3]**2,RGB_Weight)颜色[:,:3]=亮度[:,np。Check Alignment of PHs>[newaxis]返回cmap。FROM_LIST(Cmap.。名称+";_grayscale";,Colors,Cmap。N)。

此功能的作用是为您提供任何matplotlib颜色图的亮度校正灰度版本。我发现,如果以黑白打印,这项功能对于快速检查我的曲线图可能会是什么样子很有用,但我认为它可能更有助于激起互联网对JET的普遍不满。

如果你想向加入色敏数据极客的行列迈进一步,最好的选择就是猛烈抨击JET。即使你不知道它的名字,我可以保证,如果你读过很多科学论文,你以前一定见过Jet。例如,这里是神经科学杂志上一篇情节的快照,它被一篇关于这个主题的适当的粗鲁的博客帖子歪曲了:

Jet是MATLAB最初使用的默认颜色栏,在Python的matplotlib包的早期就继承了这个默认设置。不使用JET的理由有很多,你可以在网上找到反对它的很好的理由。对于一些更温和、更微妙的论点,我会从彩虹颜色地图(仍然)被认为有害的论文开始,而对于更一般的可视化技巧,我会从更好的图形的十条简单规则开始。

那么,在这场讨论中,我还有什么要补充的,那就是还没有人说过呢?实际上没有什么,除了我上面分享的代码片段。让我给你看看它是做什么的。

让我们从定义一些数据开始,看看它在默认JET色彩映射表中是什么样子:

%matplotlib内联导入numpy AS NP导入matplotlib.pylot AS PLT x=NP。Linspace(0,6)y=Np。Linspace(0,3)[:,np.。Newaxis]z=10*np。Cos(x**2)*np。EXP(-y)。

我们将使用matplotlib的imshow命令将其可视化。默认情况下,它将使用JET颜色映射表:

乍一看,这可能看起来还可以。但是仔细检查,你可能会注意到JET的亮度曲线非常复杂,因为你的眼睛对不同颜色的光有不同程度的敏感度,亮度不是你可能天真地想象的简单的RGB值的总和,而是单个值的加权欧几里得和。你可以在Imagemagick的网站上找到比你所需要的更多的信息。

当您使用上面使用的JET颜色映射并使用上面的代码片段将其转换为亮度时,您将获得以下结果:

真是一团糟!这张颜色图的灰度版本在中间有奇怪的亮度尖峰,这使得在稍微复杂的情况下弄清楚剧情中发生了什么变得令人难以置信地困难。(注:仅灰度版本的颜色图中间有奇怪的亮度尖峰,这使得在稍微复杂的情况下很难弄清楚情节中发生了什么。)。更好的做法是使用具有统一亮度渐变的色彩映射表,例如内置的灰度色彩映射表。让我们把这个放在前两个旁边:

Cmap=[PLT.。厘米。JET,灰度_Cmap(';JET&39;),PLT。厘米。Gray]无花果,轴=PLT。子图(1,3,figsize=(12,3))图。SUBPLOTS_ADJUST(wspace=0)用于cmap,ax in zip(cmap,axes):IM=ax。Imshow(z,cmap=cmap)ax.。SET_TITLE(Cmap.。名称)无花果。ColorBar(im,ax=ax)。

特别要注意的是,在左面板中,您的眼睛被吸引到黄色和青色区域,因为亮度更高。这可能会产生不幸的副作用,突出显示数据中可能并不实际存在的";特性!

如果我们仔细观察JET的颜色剖面,我们可以更清楚地看到这个亮度峰值:

Def show_color map(Cmap):IM=NP。外部(NP.。1(10),NP。Arange(100))无花果,ax=plt.。Subplots(2,figsize=(6,1.5),sublot_kw=dict(xticks=[],yticks=[]))图。SUBPLOTS_ADJUST(hspace=0.1)AX[0]。Imshow(im,cmap=cmap)ax[1]。Imshow(im,cmap=grayify_cmap(Cmap))show_color map(';jet';)。

一旦你有了与彩色版本对齐的灰度级,就很容易指出喷射光谱中的这些亮度峰值。相比之下,请查看立方体螺旋颜色贴图:

这是一个彩虹状的色彩映射表,按照设计,它在其颜色级数上具有统一的亮度渐变。它当然不是在所有情况下的最佳选择,但你可以很容易地争辩说,它总是比喷气式飞机更好的选择。

在matplotlib中查看所有可用的色彩映射表的这种可视化是很有用的。下面是一个执行此操作的快速脚本:

图,轴=PLT。子图(36,6,figsize=(10,7))图。Subplots_adjust(Left=0,Right=1,Bottom=0,top=1,hspace=0.1,wspace=0.1)im=np。外部(NP.。1(10),NP。Arange(100))cmap=[m表示PLT中的m。厘米。如果不是m,则为datad。以(";_r";)]cmap结尾。SORT()AXES=AXES。托特。轴中AX的RAVEL():AX。Zip(cmap,axes[1::3],axes[2::3],axes[::3])中cmap、color_ax、grey_ax、null_ax的Axis(';off';):DENULL_AX COLOR_AX。Set_title(Cmap,FontSize=10)COLOR_AX。Imshow(im,cmap=cmap)GREAY_AX。Imshow(im,cmap=grayify_cmap(Cmap))。

这里有一些色彩映射表,它们有非常漂亮的线性亮度梯度,这是你在选择色彩映射表时应该牢记的事情。

有关为任何给定数据选择合适的色彩映射表的内容可以写得更多;有关matplotlib的映射表(以及一些有趣的亮度插图)的更深入讨论,您可以参考matplotlib;的选择色彩映射表文档。

如果您对Python中经过深思熟虑的默认颜色选择的简化统计绘图感兴趣,我建议您看看Michael Waskom的海运项目,特别是相关的调色板教程。

这篇文章完全是在IPython笔记本上写的。您可以下载此笔记本,或在此处查看静态视图。