我经常使用 ggplot2
使渐变效果很好 (click here for an example)。我需要在 base 中工作,我认为 scales
也可以用于创建颜色渐变,但我对如何使用非常不满意。基本目标是生成从 x 颜色到 y 颜色的 n 种颜色的调色板。该解决方案需要在基础上工作。这是一个起点,但没有地方可以输入 n。
scale_colour_gradientn(colours=c("red", "blue"))
我很清楚:
brewer.pal(8, "Spectral")
来自 RColorBrewer
。我正在寻找更多类似于 ggplot2
处理渐变的方法,它说我有这两种颜色,并且我想要 15 种颜色。我怎样才能做到这一点?
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)
https://i.stack.imgur.com/dGQU0.png
只是扩展上一个答案colorRampPalette
可以处理两种以上的颜色。
因此,对于更扩展的“热图”类型,您可以....
colfunc<-colorRampPalette(c("red","yellow","springgreen","royalblue"))
plot(rep(1,50),col=(colfunc(50)), pch=19,cex=2)
结果图像:
https://i.stack.imgur.com/28xXQ.png
尝试以下操作:
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)
https://i.stack.imgur.com/9HJJN.png
上面的答案很有用,但在图表中,很难区分较暗的黑色渐变。我发现的一种替代方法是使用灰色渐变,如下所示
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
另一种方法(不一定比以前的答案更好!)是使用 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()
产生:
https://i.stack.imgur.com/HnREA.jpg
为此,它使用 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
生成的图:
https://i.stack.imgur.com/md2Lv.jpg
希望有人觉得这很有用,因为它是我在提出这个问题后最终使用的解决方案。
brewer.pal(8, "Spectral")
,您可以将生成的颜色矢量提供给colorRampPalette
,以沿该渐变生成更多颜色。例如:colorRampPalette(brewer.pal(8, "Spectral"))
。