倒置发散色板

9

我经常使用一个散发色谱,映射到一个参数上,在中间附近有一个有趣的转折点。

不幸的是,可用的散发色谱——如C. Brewer的那些——似乎都在两个极端具有饱和的颜色,而不是在中间,通常定义为白色或浅灰色。下面是一个例子以供参考。

enter image description here

文本标签指示的连续参数通过一个最优值,其中相关曲线的峰值达到最大值。

在一个明亮的白色或灰色背景(typical for ggplot2)下,我的数据的最有趣的部分几乎变得看不见了;我希望它能更加突出,而两侧的值则从中心逐渐淡化,并且具有不同的色调。是否有任何良好的散发色谱资源,其中间更强烈地饱和,两侧逐渐淡化?

以下是一段样本代码,以黑色作为中性中点(我更喜欢某些不那么戏剧性的东西,但很难使两侧都与之融合)。

require(RColorBrewer)
grid.newpage()
grid.raster(brewer.pal(7,"PRGn"), 0.25, 0.5, 0.4, 1)

custom <- c(brewer.pal(3,"BuPu"), "black", rev(brewer.pal(3,"BuGn")))
grid.raster(custom, 0.75, 0.5, 0.4, 1)

enter image description here

编辑:澄清一下,我熟悉colorRampPalettescale_colour_gradientn,我需要的是:

1- 选择适合此目的的好颜色;

2- 定义一个颜色比例尺,将手工制作的调色板映射到变量上,类似于scale_colour_gradient2mid参数的处理(中央颜色可能不在参数范围的正中间)。


2
colorRampPalette能够实现这个功能,例如par(bg = 'grey97', xpd = NA);plot(1:1000, pch = 19, cex = 5, col = colorRampPalette(c('lightgreen','black','mediumpurple1'))(1000))。如果你想要更浅的颜色,只需要重复颜色即可:plot(1:1000, pch = 19, cex = 5, col = colorRampPalette(c('lightgreen','lightgreen','black','mediumpurple1','mediumpurple1'))(1000)) - rawr
@rawr 我已经编辑了问题,并添加了补充说明以澄清问题。 - baptiste
2个回答

11
您可能会喜欢玩弄一下choose_palette(),这是一个相对较新的功能,属于优秀的colorspace软件包。
该软件包中的函数可以完全且大致正交地控制色彩空间的色调、色度和亮度特征。 choose_palette()为您提供了一种方便的方法来探索开放的巨大可能性空间。
以下是启动调色板选择器的代码,以及GUI工具的截图。(请注意,要使范围中间比两端更暗,您需要交换发散调色板的默认亮度值,在此处表示为“L1”和“L2”。)
library(colorspace)
library(grid)

custom <- choose_palette()

enter image description here

下面是我玩了一分钟后得到的一个例子

custom <- diverge_hcl(20, h=c(-225,277), c=80, l=c(80,25))
grid.newpage()
grid.raster(custom, 0.25, 0.5, 0.4, 1)

enter image description here

这个包的内容和设计思路都有详细的文档,在包说明文件中可以找到 (vignette("hcl-colors")),并且在一篇配套文章中也有介绍 "逃离RGB颜色空间:为统计图形选择颜色" (警告:pdf文件),该文章发表在《计算统计与数据分析》杂志上。


1
谢谢,这是一个很棒的工具。(我希望 Rstudio 不会在每次需要 tck 的时候都崩溃。) - baptiste
越想,就越觉得这是一件根本上难以实现的事情。在我看来,你肯定不会得到一个看起来甚至只有正常分歧比例尺一半好的比例尺(即使在你特定的应用中使用它可能更好)。 - Josh O'Brien
1
这确实有些棘手,我同意。我希望有一些交互式工具可以在特定颜色空间的切片上绘制贝塞尔曲线(修复色度、色调、亮度或其他更好的感知参数),然后沿着曲线的横坐标定义映射。 - baptiste
@JoshO'Brien 你如何生成一个调色板来为地图着色,并将其嵌入到 scall_fill_gradientn 调用中? - iouraich
@iouraich -- 抱歉,我不是 ggplot2 的用户,所以我一时半会儿想不到。 - Josh O'Brien
显示剩余3条评论

3
过去我曾经采用的一种方法是将分歧坡道反转(这与你所做的接近,但不完全相同),然后使用 alpha 通道来减弱坡道的两端。
library(ggplot2)
pal <- brewer.pal(7,"PRGn")
custom <- c(rev(pal[1:3]),rev(pal[5:7]))
alpha  <-  c(seq(3),rev(seq(3)))/3
x <- 1:6
y <- rep(1)
MyDF <- data.frame(custom,alpha,x,y)
MyPlot <- ggplot(data = MyDF, aes(x = x, y = y, fill=custom, alpha=alpha)) + geom_bar(stat = "identity", color="white") + 
          scale_fill_identity() + scale_alpha_continuous(range = c(0.6, 1))
MyPlot

enter image description here

我所知道唯一讨论颜色反转的文章是《循环数据图像:高分辨率循环空间数据的图形》(Morphet & Symanzik, 2010),但没有在线版本,抱歉。基本上,他们改变值和饱和度使得颜色渐变的两端融合在一起,但细节方面描述得有些简略。这里是他们其中一个图形的图片。

他们在现已弃用的CircSpatial包中有这些斜坡,因此您可以从那里了解他们如何制作斜坡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接