从颜色 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 种颜色的渐变的主要内容,如果未能解决你的问题,请参考以下文章