与色彩相关的函数
palette() |
调色板 |
colors() |
R中有字符串名称的颜色 |
rgb() |
由红绿蓝分量生成颜色值(向量) |
col2rgb() |
将字符串颜色转为rgb色值。 |
rgb2hsv(col2rgb(“blue”)) |
由rgb转换为hsv色值 |

# colors()为R中所有有名字的颜色
colors() %>% length()
#> [1] 657
colors()[21:36] %>% show_col()

# rgb()前三个参数为红、绿、蓝经过maxColorValue标准化的分量
red <- (1:9 %>% rescale()) / 2
green <- (1:9 %>% rescale()) / 2 + 0.5
blue <- 1:9 %>% rescale()
rgb(red, green, blue, maxColorValue = 1) %>% show_col()

#> [,1]
#> red 255
#> green 0
#> blue 0
#> [,1]
#> h 0.6666667
#> s 1.0000000
#> v 1.0000000
创建调色板
调色板即颜色比例尺函数,接收整数,输出相应个数的、均匀变化的颜色列表
R自带的六个调色板
rainbow()
,七彩色
heat.colors()
,红-黄-白
terrain.colors()
,绿-黄-白
topo.colors()
,蓝-绿-黄
cm.colors()
,青-粉
gray()
,黑-白,参数必须在[0,1]之间

show_col(heat.colors(16))

show_col(terrain.colors(16))

show_col(topo.colors(16))


show_col(seq(0, 1, length.out = 16) %>% gray())

RColorBrewer包中的调色板
# 通过下列代码观察预先设定的颜色集
library(RColorBrewer)
display.brewer.all()

display.brewer.all(type = 'seq')

display.brewer.all(type = 'div')

#> maxcolors category colorblind
#> BrBG 11 div TRUE
#> PiYG 11 div TRUE
#> PRGn 11 div TRUE
#> PuOr 11 div TRUE
#> RdBu 11 div TRUE
#> RdGy 11 div FALSE
#> RdYlBu 11 div TRUE
#> RdYlGn 11 div FALSE
#> Spectral 11 div FALSE
#> Accent 8 qual FALSE
#> Dark2 8 qual TRUE
#> Paired 12 qual TRUE
#> Pastel1 9 qual FALSE
#> Pastel2 8 qual FALSE
#> Set1 9 qual FALSE
#> Set2 8 qual TRUE
#> Set3 12 qual FALSE
#> Blues 9 seq TRUE
#> BuGn 9 seq TRUE
#> BuPu 9 seq TRUE
#> GnBu 9 seq TRUE
#> Greens 9 seq TRUE
#> Greys 9 seq TRUE
#> Oranges 9 seq TRUE
#> OrRd 9 seq TRUE
#> PuBu 9 seq TRUE
#> PuBuGn 9 seq TRUE
#> PuRd 9 seq TRUE
#> Purples 9 seq TRUE
#> RdPu 9 seq TRUE
#> Reds 9 seq TRUE
#> YlGn 9 seq TRUE
#> YlGnBu 9 seq TRUE
#> YlOrBr 9 seq TRUE
#> YlOrRd 9 seq TRUE
brewer.pal(n = 9, name = "YlGn") %>% # 选择一个调色板,n不能超过maxcolors
scales::show_col()
# 同样的功能还可用 scales::brewer_pal()
scales::brewer_pal(palette = "YlGn")(9) %>% scales::show_col()

创建颜色比例尺
上述调色板返回的颜色向量都是均匀变化的,但很多时候数据的变化是不均匀的,要求颜色也要不均匀的变化,这就需要一个真正的颜色比例尺。
library(scales)
# 定义颜色比例尺,接收任意数字向量,返回相应的颜色向量
# 如果数字向量是不均匀的,那么这个颜色向量也是不均匀的
num_to_color <- function(num_domain, color_range) {
# colour_ramp()是一个函数工厂,接收一个颜色向量
# 返回一个从[0,1]到这个颜色两端的比例尺函数
color_scale <- colour_ramp(color_range)
# color_scale() 接收一个从0到1的向量,按照比例尺返回相应项数的颜色向量
num_domain %>%
rescale() %>% # rescale()将数字向量映射到[0,1]上
color_scale()
}
num_domain <- c(1, 2, 13, 14, 45, 46, 57, 99, 100) # 假设这是一个变量的所有数据
color_range <- c("red", "green", "blue") # 把0到1映射到红-绿-蓝上
colors <- num_to_color(num_domain, color_range)
show_col(colors) # 由于数据是不均匀的,颜色向量也是不均匀的

虽然根据数据生成的颜色比例尺是数量有限的,但按照这个方法,可以通过插值获取新颜色,理论上可以表现的颜色是无穷多的。
n <- 80 # 一个新数,对应什么颜色呢?
# 一个典型的比例尺运算
c(num_domain, n) %>%
num_to_color(color_range) %>%
`[`(length(num_domain) + 1) %>%
show_col()

LS0tDQp0aXRsZTogIkNvbG9yIFNjYWxlIg0Kc3VidGl0bGU6ICIiDQphdXRob3I6ICJIdW1vb24iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCmRvY3VtZW50Y2xhc3M6IGN0ZXhhcnQNCmNsYXNzb3B0aW9uOiBoeXBlcnJlZiwNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kc291cmNlKCIuLi9SbWFya2Rvd24tdGVtcGxhdGUvUm1hcmtkb3duX2NvbmZpZy5SIikNCg0KIyMgZ2xvYmFsIG9wdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgd2lkdGggPSBjb25maWckd2lkdGgsDQogIGZpZy53aWR0aCA9IGNvbmZpZyRmaWcud2lkdGgsDQogIGZpZy5hc3AgPSBjb25maWckZmlnLmFzcCwNCiAgb3V0LndpZHRoID0gY29uZmlnJG91dC53aWR0aCwNCiAgZmlnLmFsaWduID0gY29uZmlnJGZpZy5hbGlnbiwNCiAgZmlnLnBhdGggPSBjb25maWckZmlnLnBhdGgsDQogIGZpZy5zaG93ID0gY29uZmlnJGZpZy5zaG93LA0KICB3YXJuID0gY29uZmlnJHdhcm4sDQogIHdhcm5pbmcgPSBjb25maWckd2FybmluZywNCiAgbWVzc2FnZSA9IGNvbmZpZyRtZXNzYWdlLA0KICBlY2hvID0gY29uZmlnJGVjaG8sDQogIGV2YWwgPSBjb25maWckZXZhbCwNCiAgdGlkeSA9IGNvbmZpZyR0aWR5LA0KICBjb21tZW50ID0gY29uZmlnJGNvbW1lbnQsDQogIGNvbGxhcHNlID0gRiwNCiAgY2FjaGUgPSBjb25maWckY2FjaGUsDQogIGNhY2hlLmNvbW1lbnRzID0gY29uZmlnJGNhY2hlLmNvbW1lbnRzLA0KICBhdXRvZGVwID0gY29uZmlnJGF1dG9kZXANCikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmRvd25sb2FkdGhpczo6ZG93bmxvYWRfZGlyKA0KICBwYXRoID0gIi4uL1JtYXJrZG93bi10ZW1wbGF0ZSIsDQogIG91dHB1dF9uYW1lID0gIlJzY3JpcHQiLA0KICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgUiBzY3JpcHRzIiwNCiAgYnV0dG9uX3R5cGUgPSAiZGFuZ2VyIiwNCiAgc2VsZl9jb250YWluZWQgPSBGQUxTRQ0KKQ0KZG93bmxvYWR0aGlzOjpkb3dubG9hZF9kaXIoDQogIHBhdGggPSAiLi4vY3NzIiwNCiAgb3V0cHV0X25hbWUgPSAiY3NzIiwNCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIGNzcyIsDQogIGJ1dHRvbl90eXBlID0gInN1Y2Nlc3MiLA0KICBzZWxmX2NvbnRhaW5lZCA9IEZBTFNFDQopDQpkb3dubG9hZHRoaXM6OmRvd25sb2FkX2ZpbGUoDQogIHBhdGggPSAiX291dHB1dC55bWwiLA0KICBvdXRwdXRfbmFtZSA9ICJfb3V0cHV0IiwNCiAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIGNvbmZpZyIsDQogIGJ1dHRvbl90eXBlID0gImRlZmF1bHQiLA0KICBzZWxmX2NvbnRhaW5lZCA9IEZBTFNFDQopDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoc2NhbGVzKQ0KYGBgDQoNCiMjIOS4juiJsuW9qeebuOWFs+eahOWHveaVsA0KDQp8IOWHveaVsCAgICAgICAgICAgICAgICAgICAgIHwg5Yqf6IO9ICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IHBhbGV0dGUoKSAgICAgICAgICAgICAgICB8IOiwg+iJsuadvyAgICAgICAgICAgICAgICAgICAgfA0KfCBjb2xvcnMoKSAgICAgICAgICAgICAgICAgfCBS5Lit5pyJ5a2X56ym5Liy5ZCN56ew55qE6aKc6ImyICAgICAgICAgICAgICAgfA0KfCByZ2IoKSAgICAgICAgICAgICAgICAgICAgfCDnlLHnuqLnu7/ok53liIbph4/nlJ/miJDpopzoibLlgLzvvIjlkJHph4/vvIkgICAgICAgICAgICAgIHwNCnwgY29sMnJnYigpICAgICAgICAgICAgICAgIHwg5bCG5a2X56ym5Liy6aKc6Imy6L2s5Li6cmdi6Imy5YC844CCIHwNCnwgcmdiMmhzdihjb2wycmdiKCJibHVlIikpIHwg55Sxcmdi6L2s5o2i5Li6aHN26Imy5YC8ICAgICAgICAgICAgIHwNCg0KDQpgYGB7cn0NCnBhbGV0dGUoKSAlPiUgc2hvd19jb2woKQ0KDQojIGNvbG9ycygp5Li6UuS4reaJgOacieacieWQjeWtl+eahOminOiJsg0KY29sb3JzKCkgJT4lIGxlbmd0aCgpDQpjb2xvcnMoKVsyMTozNl0gJT4lIHNob3dfY29sKCkNCg0KIyByZ2IoKeWJjeS4ieS4quWPguaVsOS4uue6ouOAgee7v+OAgeiTnee7j+i/h21heENvbG9yVmFsdWXmoIflh4bljJbnmoTliIbph48NCnJlZCA8LSAoMTo5ICU+JSByZXNjYWxlKCkpIC8gMg0KZ3JlZW4gPC0gKDE6OSAlPiUgcmVzY2FsZSgpKSAvIDIgKyAwLjUNCmJsdWUgPC0gMTo5ICU+JSByZXNjYWxlKCkNCnJnYihyZWQsIGdyZWVuLCBibHVlLCBtYXhDb2xvclZhbHVlID0gMSkgJT4lIHNob3dfY29sKCkNCg0KY29sMnJnYigicmVkIikNCg0KcmdiMmhzdihjb2wycmdiKCJibHVlIikpDQpgYGANCiMjIOWIm+W7uuiwg+iJsuadvw0KDQrosIPoibLmnb/ljbPpopzoibLmr5TkvovlsLrlh73mlbDvvIzmjqXmlLbmlbTmlbDvvIzovpPlh7rnm7jlupTkuKrmlbDnmoTjgIEqKuWdh+WMgOWPmOWMlueahCoq6aKc6Imy5YiX6KGoDQoNCiMjIyBS6Ieq5bim55qE5YWt5Liq6LCD6Imy5p2/DQoNCmByYWluYm93KClg77yM5LiD5b2p6ImyDQoNCmBoZWF0LmNvbG9ycygpYO+8jOe6oi3pu4Qt55m9DQoNCmB0ZXJyYWluLmNvbG9ycygpYO+8jOe7vy3pu4Qt55m9DQoNCmB0b3BvLmNvbG9ycygpYO+8jOiTnS3nu78t6buEDQoNCmBjbS5jb2xvcnMoKWDvvIzpnZIt57KJDQoNCmBncmF5KClg77yM6buRLeeZve+8jOWPguaVsOW/hemhu+WcqFswLDFd5LmL6Ze0DQoNCmBgYHtyfQ0Kc2hvd19jb2wocmFpbmJvdygxNikpDQpzaG93X2NvbChoZWF0LmNvbG9ycygxNikpDQpzaG93X2NvbCh0ZXJyYWluLmNvbG9ycygxNikpDQpzaG93X2NvbCh0b3BvLmNvbG9ycygxNikpDQpzaG93X2NvbChjbS5jb2xvcnMoMTYpKQ0Kc2hvd19jb2woc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxNikgJT4lIGdyYXkoKSkNCmBgYA0KDQojIyMgUkNvbG9yQnJld2Vy5YyF5Lit55qE6LCD6Imy5p2/DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9DQojIOmAmui/h+S4i+WIl+S7o+eggeinguWvn+mihOWFiOiuvuWumueahOminOiJsumbhg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpkaXNwbGF5LmJyZXdlci5hbGwoKQ0KZGlzcGxheS5icmV3ZXIuYWxsKHR5cGUgPSAnc2VxJykNCmRpc3BsYXkuYnJld2VyLmFsbCh0eXBlID0gJ2RpdicpDQpicmV3ZXIucGFsLmluZm8NCmJyZXdlci5wYWwobiA9IDksIG5hbWUgPSAiWWxHbiIpICU+JSAjIOmAieaLqeS4gOS4quiwg+iJsuadv++8jG7kuI3og73otoXov4dtYXhjb2xvcnMNCiAgc2NhbGVzOjpzaG93X2NvbCgpDQoNCg0KIyDlkIzmoLfnmoTlip/og73ov5jlj6/nlKggc2NhbGVzOjpicmV3ZXJfcGFsKCkNCnNjYWxlczo6YnJld2VyX3BhbChwYWxldHRlID0gIllsR24iKSg5KSAlPiUgc2NhbGVzOjpzaG93X2NvbCgpDQpgYGANCg0KIyMg5Yib5bu66aKc6Imy5q+U5L6L5bC6DQoNCuS4iui/sOiwg+iJsuadv+i/lOWbnueahOminOiJsuWQkemHj+mDveaYr+Wdh+WMgOWPmOWMlueahO+8jOS9huW+iOWkmuaXtuWAmeaVsOaNrueahOWPmOWMluaYr+S4jeWdh+WMgOeahO+8jOimgeaxguminOiJsuS5n+imgeS4jeWdh+WMgOeahOWPmOWMlu+8jOi/meWwsemcgOimgeS4gOS4quecn+ato+eahOminOiJsuavlOS+i+WwuuOAgg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCg0KIyDlrprkuYnpopzoibLmr5TkvovlsLrvvIzmjqXmlLbku7vmhI/mlbDlrZflkJHph4/vvIzov5Tlm57nm7jlupTnmoTpopzoibLlkJHph48NCiMg5aaC5p6c5pWw5a2X5ZCR6YeP5piv5LiN5Z2H5YyA55qE77yM6YKj5LmI6L+Z5Liq6aKc6Imy5ZCR6YeP5Lmf5piv5LiN5Z2H5YyA55qEDQpudW1fdG9fY29sb3IgPC0gZnVuY3Rpb24obnVtX2RvbWFpbiwgY29sb3JfcmFuZ2UpIHsNCiAgIyBjb2xvdXJfcmFtcCgp5piv5LiA5Liq5Ye95pWw5bel5Y6C77yM5o6l5pS25LiA5Liq6aKc6Imy5ZCR6YePDQogICMg6L+U5Zue5LiA5Liq5LuOWzAsMV3liLDov5nkuKrpopzoibLkuKTnq6/nmoTmr5TkvovlsLrlh73mlbANCiAgY29sb3Jfc2NhbGUgPC0gY29sb3VyX3JhbXAoY29sb3JfcmFuZ2UpDQogICMgY29sb3Jfc2NhbGUoKSDmjqXmlLbkuIDkuKrku44w5YiwMeeahOWQkemHj++8jOaMieeFp+avlOS+i+Wwuui/lOWbnuebuOW6lOmhueaVsOeahOminOiJsuWQkemHjw0KDQogIG51bV9kb21haW4gJT4lDQogICAgcmVzY2FsZSgpICU+JSAjIHJlc2NhbGUoKeWwhuaVsOWtl+WQkemHj+aYoOWwhOWIsFswLDFd5LiKDQogICAgY29sb3Jfc2NhbGUoKQ0KfQ0KDQpudW1fZG9tYWluIDwtIGMoMSwgMiwgMTMsIDE0LCA0NSwgNDYsIDU3LCA5OSwgMTAwKSAjIOWBh+iuvui/meaYr+S4gOS4quWPmOmHj+eahOaJgOacieaVsOaNrg0KY29sb3JfcmFuZ2UgPC0gYygicmVkIiwgImdyZWVuIiwgImJsdWUiKSAjIOaKijDliLAx5pig5bCE5Yiw57qiLee7vy3ok53kuIoNCg0KY29sb3JzIDwtIG51bV90b19jb2xvcihudW1fZG9tYWluLCBjb2xvcl9yYW5nZSkNCnNob3dfY29sKGNvbG9ycykgIyDnlLHkuo7mlbDmja7mmK/kuI3lnYfljIDnmoTvvIzpopzoibLlkJHph4/kuZ/mmK/kuI3lnYfljIDnmoQNCmBgYA0KDQromb3nhLbmoLnmja7mlbDmja7nlJ/miJDnmoTpopzoibLmr5TkvovlsLrmmK/mlbDph4/mnInpmZDnmoTvvIzkvYbmjInnhafov5nkuKrmlrnms5XvvIzlj6/ku6XpgJrov4fmj5LlgLzojrflj5bmlrDpopzoibLvvIznkIborrrkuIrlj6/ku6XooajnjrDnmoTpopzoibLmmK/ml6DnqbflpJrnmoTjgIINCmBgYHtyfQ0KbiA8LSA4MCAjIOS4gOS4quaWsOaVsO+8jOWvueW6lOS7gOS5iOminOiJsuWRou+8nw0KDQojIOS4gOS4quWFuOWei+eahOavlOS+i+Wwuui/kOeulw0KYyhudW1fZG9tYWluLCBuKSAlPiUNCiAgbnVtX3RvX2NvbG9yKGNvbG9yX3JhbmdlKSAlPiUNCiAgYFtgKGxlbmd0aChudW1fZG9tYWluKSArIDEpICU+JQ0KICBzaG93X2NvbCgpDQpgYGANCg==