library(scales)

与色彩相关的函数

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

# 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()

col2rgb("red")
#>       [,1]
#> red    255
#> green    0
#> blue     0
rgb2hsv(col2rgb("blue"))
#>        [,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(rainbow(16))

show_col(heat.colors(16))

show_col(terrain.colors(16))

show_col(topo.colors(16))

show_col(cm.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')

brewer.pal.info
#>          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==