从颜色 1 到颜色 2 的 n 种颜色的渐变

Posted

技术标签:

【中文标题】从颜色 1 到颜色 2 的 n 种颜色的渐变【英文标题】:Gradient of n colors ranging from color 1 and color 2 【发布时间】:2012-11-01 10:29:54 【问题描述】:

我经常与 ggplot2 合作,这使得渐变效果很好 (click here for an example)。我需要在基础上工作,我认为scales 也可以在那里用来创建颜色渐变,但我对如何使用非常不满意。基本目标是生成从 x 颜色到 y 颜色的 n 种颜色的调色板。该解决方案需要在基础上工作。这是一个起点,但没有地方可以输入 n。

 scale_colour_gradientn(colours=c("red", "blue"))

我很清楚:

brewer.pal(8, "Spectral") 

来自RColorBrewer。我正在寻找更多类似于ggplot2 处理渐变的方法,它说我有这两种颜色,并且一路上我想要 15 种颜色。我该怎么做?

【问题讨论】:

我认为你需要 scales 包;最新的 ggplot2 版本依赖于底层代码。 IE。你不需要 ggplot2 来使用 scales,你只需要 scales 包。不知道 scales 中的函数是如何工作的 :-) 题外话,因为您特别要求 base,但我发现 colourvalues (also on CRAN) 特别方便将值映射到渐变。它也很轻巧(取决于Rcpp)。 @MichaelChirico 不是题外话,我的意思是我需要使用基础绘图,因为我使用的包是用基础(我认为是 wordcloud)而不是网格编写的。也许发布作为答案? 【参考方案1】:

colorRampPalette 可能是你的朋友:

colfunc <- colorRampPalette(c("black", "white"))
colfunc(10)
# [1] "#000000" "#1C1C1C" "#383838" "#555555" "#717171" "#8D8D8D" "#AAAAAA"
# [8] "#C6C6C6" "#E2E2E2" "#FFFFFF"

只是为了证明它有效:

plot(rep(1,10),col=colfunc(10),pch=19,cex=3)

【讨论】:

请注意,如果您特别迷恋预先存在的调色板,例如brewer.pal(8, "Spectral"),您可以将生成的颜色矢量提供给colorRampPalette,以沿该渐变生成更多颜色。例如:colorRampPalette(brewer.pal(8, "Spectral")). 块中对角线或形状的颜色如何? @thelatemail【参考方案2】:

只是为了扩展上一个答案colorRampPalette可以处理两种以上的颜色。

因此,对于更扩展的“热图”类型的外观,您可以....

colfunc<-colorRampPalette(c("red","yellow","springgreen","royalblue"))
plot(rep(1,50),col=(colfunc(50)), pch=19,cex=2)

生成的图像:

【讨论】:

我还可以在颜色中指定对角线或形状吗? @jsol 我喜欢这个调色板,但绿色太多,黄色太少。有没有办法纠正这个问题? 为不希望看到“springgreen”或“royalblue”等选项的其他人添加。所有可用的颜色都可以通过运行以下命令作为列表返回:colors()。【参考方案3】:

尝试以下方法:

color.gradient <- function(x, colors=c("red","yellow","green"), colsteps=100) 
  return( colorRampPalette(colors) (colsteps) [ findInterval(x, seq(min(x),max(x), length.out=colsteps)) ] )

x <- c((1:100)^2, (100:1)^2)
plot(x,col=color.gradient(x), pch=19,cex=2)

【讨论】:

这个函数应该作为默认添加到 R base 中!【参考方案4】:

上述答案很有用,但在图表中,很难区分较暗的黑色渐变。我发现的一种替代方法是使用灰色渐变,如下所示

palette(gray.colors(10, 0.9, 0.4))
plot(rep(1,10),col=1:10,pch=19,cex=3))

更多关于灰度的信息here.

已添加

当我将上面的代码用于蓝色和黑色等不同颜色时,渐变不是那么清晰。 heat.colors() 似乎更有用。

This document 有更详细的信息和选项。 pdf

【讨论】:

我认为这个答案对于黑白来说是优越的,但不能推广到颜色。感谢您添加此宝贵信息。 +1 添加了一个链接,该链接提供了更好的颜色渐变和色调选项,适用于彩色和黑白。 @DavidDelMonte 我可能保存了文件的副本,但没有更新的链接。不过不知道在哪里上传。 @DavidDelMonte - web.archive.org/web/20141111182737/http://www.stat.tamu.edu/… 始终首先检查archive.org。【参考方案5】:

另一种方法(不一定比以前的答案更好!)是使用 viridis 包。正如here 解释的那样,它允许基于两种以上颜色的各种颜色渐变。

该软件包非常易于使用 - 您只需将 ggplot2 缩放填充函数(例如,scale_fill_gradient(low = "skyblue", high = "dodgerblue4"))替换为等效的 viridis 函数。

所以,改变这个情节的代码:

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = hp)) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Horse power') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_fill_gradient(low = "skyblue", high = "dodgerblue4") +
  theme_classic()

产生:

对此,使用viridis

ggplot(mtcars, aes(wt*1000, mpg)) +
  geom_point(size = 4, aes(colour = factor(cyl))) +
  xlab("Weight (pounds)") + ylab("Miles per gallon (MPG)") + labs(color='Number\nof cylinders') +
  scale_x_continuous(limits = c(1000, 6000), 
                     breaks = c(seq(1000,6000,1000)), 
                     labels = c("1,000", "2,000", "3,000", "4,000", "5,000", "6,000")) + 
  scale_color_viridis(discrete = TRUE) +
  theme_classic()

唯一的区别在于倒数第二行:scale_color_viridis(discrete = TRUE)

这是使用viridis制作的情节:

希望有人觉得这很有用,因为这是我在回答这个问题后最终使用的解决方案。

【讨论】:

以上是关于从颜色 1 到颜色 2 的 n 种颜色的渐变的主要内容,如果未能解决你的问题,请参考以下文章

iOS 绘制颜色渐变圆环

jQuery动画div背景颜色渐变?

ggplot 将颜色渐变缩放到数据范围之外

在 PHP 中生成 RGB 渐变颜色的算法

如何从调色板中进行颜色渐变

html中想要将背景颜色渐变怎么弄?