ChatGPT解决这个技术问题 Extra ChatGPT

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

我经常使用 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 种颜色。我怎样才能做到这一点?

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

t
thelatemail

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


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

只是扩展上一个答案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


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

尝试以下操作:

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


这个函数应该作为默认值添加到 R 基础中!
t
thelatemail

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

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。
a
arranjdavis

另一种方法(不一定比以前的答案更好!)是使用 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

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