模拟 ggplot2 默认调色板

258
我该使用哪个函数来模拟ggplot2的默认颜色调色板,以获得所需数量的颜色。例如,输入3将生成一个带有这些颜色的十六进制颜色字符向量: enter image description here

14
请看一下“scales”包。 - hadley
3
是的!我在桌子上放了一份 display.brewer.all() 的打印输出。我认为对于因素来说,我最喜欢Set1。 - John Colby
好主意!我也要做同样的打印输出。关于Set1的选择,我已经发现自己在大多数新图表中都在使用它。 - Suraj
5个回答

318

这只是围绕着彩色轮的等间距色调,从15开始:

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
例如:
n = 4
cols = gg_color_hue(n)

dev.new(width = 4, height = 4)
plot(1:n, pch = 16, cex = 2, col = cols)

在此输入图片描述


2
+1 我喜欢您的简洁、明了的解决方案,不过我仍在努力理解为什么您在seq中有 length=n+1,而我是 length=n - Andrie
hcl(h = x) == hcl(x = x + 360),所以在代码中,hcl(hues, ...) 返回的第一个和第 n+1 个条目是相同的。在 hcl(hues, ...)[1:n] 中删除了第 n+1 个条目,因此您最终得到 n 个均匀间隔的色调。在代码中包含 n+1 值使代数变得更加整洁。 - Russ Hyde

224

这是来自于

library(scales)
show_col(hue_pal()(4))

四色 ggplot

show_col(hue_pal()(3))

三色ggplot


1
奇怪的是,颜色(至少在第二张图片中)与它们的RGB代码不匹配。然而,查看我本地制作的图表,这些RGB代码是正确的。 - Sparhawk
1
可能是浏览器的问题? - Climbs_lika_Spyder
1
非常奇怪。在Firefox中,绿色是#15ba3e,在Chromium中是#00b83a,在下载图像并在专用图像程序(Gwenview)中查看后,它是#00b839。只有Konqueror正确显示它为#00ba38。因此只有一个是正确的,而且没有一致的! - Sparhawk
1
有没有办法获取颜色名称,例如'red2','blue3'?颜色代码,例如#00b83a,不易直观使用。 - SJ9
3
为了方便复制粘贴,十六进制颜色值如下: #f8766d - 红色 #00ba38 - 绿色 #83b0fc - 蓝色 - pluke

75

这些回答都非常好,但我想分享在stackoverflow上发现的另一件非常有用的事情,这是直接链接

基本上,@DidzisElferts展示了如何获取ggplot用于构建您创建的图表的所有颜色、坐标等。非常不错!

p <- ggplot(mpg,aes(x=class,fill=class)) + geom_bar()
ggplot_build(p)$data
[[1]]
     fill  y count x ndensity ncount  density PANEL group ymin ymax xmin xmax
1 #F8766D  5     5 1        1      1 1.111111     1     1    0    5 0.55 1.45
2 #C49A00 47    47 2        1      1 1.111111     1     2    0   47 1.55 2.45
3 #53B400 41    41 3        1      1 1.111111     1     3    0   41 2.55 3.45
4 #00C094 11    11 4        1      1 1.111111     1     4    0   11 3.55 4.45
5 #00B6EB 33    33 5        1      1 1.111111     1     5    0   33 4.55 5.45
6 #A58AFF 35    35 6        1      1 1.111111     1     6    0   35 5.55 6.45
7 #FB61D7 62    62 7        1      1 1.111111     1     7    0   62 6.55 7.45

53

来源于Hadley Wickham所写的ggplot2书籍第106页:

默认的颜色方案scale_colour_hue会在hcl色彩环中均匀地选择色调。

通过一些逆向工程,你可以构建这个函数:

ggplotColours <- function(n = 6, h = c(0, 360) + 15){
  if ((diff(h) %% 360) < 1) h[2] <- h[2] - 360/n
  hcl(h = (seq(h[1], h[2], length = n)), c = 100, l = 65)
}
展示这个在条形图中的示例:
y <- 1:3
barplot(y, col = ggplotColours(n = 3))

在此输入图片描述


3
比这还要简单。你可以避免代数的第一行,因为尽管帮助文档中没有提到,但 hcl 会循环使用大于360的值。 - John Colby
17
你甚至可以使用scales:::show_col(ggplotColours(n=3))来显示颜色及其对应的数值。 - Stat-R
虽然我还没有想出如何让比例尺和它的show_col输出绘制的(十六进制或其他格式的)值。 - Stefano

0

如果你想要获取十六进制值而不是图表,可以使用以下方法:

hue_pal()(3)

不要使用这段代码:

show_col(hue_pal()(3))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接