120

我经常使用ggplot2它使渐变变得很好(单击此处查看示例)。我需要在基础上工作,我认为scales也可以在那里使用来创建颜色渐变,但我对如何操作非常不满意。基本目标是生成从 x 颜色到 y 颜色的 n 种颜色的调色板。该解决方案需要在基础上工作。这是一个起点,但没有地方可以输入 n。

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

我很清楚:

brewer.pal(8, "Spectral") 

RColorBrewer. 我正在寻找更多类似于如何ggplot2处理渐变的方法,即我有这两种颜色并且我想要15种颜色。我怎样才能做到这一点?

4

5 回答 5

198

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)

在此处输入图像描述

于 2012-11-12T23:21:54.087 回答
55

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

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

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

结果图像:

在此处输入图像描述

于 2015-05-29T15:41:17.897 回答
22

尝试以下操作:

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)

在此处输入图像描述

于 2016-02-26T16:04:10.147 回答
8

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

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

更多关于灰度的信息在这里。

添加

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

本文档包含更详细的信息和选项。pdf

于 2014-09-24T11:30:51.070 回答
0

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

该软件包非常易于使用 - 您只需将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

在此处输入图像描述

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

于 2021-07-09T16:44:13.300 回答