9.11 颜色

9.11.1 问题

你想在图表中用 ggplot2 添加颜色。

9.11.2 方案

ggplot2 中设置颜色,对相互区分不同变量会有些困难,因为这些颜色有一样的亮度,且对色盲者不太友好。一个比较好的通用解决方案是使用对色盲友好的颜色。

9.11.2.1 样本数据

这两个数据集将用来产生下面的图表:

  1. # 两个变量
  2. df <- read.table(header = TRUE, text = "
  3. cond yval
  4. A 2
  5. B 2.5
  6. C 1.6
  7. ")
  8. # 三个变量
  9. df2 <- read.table(header = TRUE, text = "
  10. cond1 cond2 yval
  11. A I 2
  12. A J 2.5
  13. A K 1.6
  14. B I 2.2
  15. B J 2.4
  16. B K 1.2
  17. C I 1.7
  18. C J 2.3
  19. C K 1.9
  20. ")

9.11.2.2 简单的颜色设置

有颜色的线条和点可以直接用 colour = "red", 用颜色名称代替 "red"。填充的对象的颜色,如柱状条,可以用 fill="red" 来进行设置。

如果你想用任何其他非常规颜色,用十六进位码来设置颜色更容易,比如 #FF6699

  1. library(ggplot2)
  2. # 设置:黑色柱状条
  3. ggplot(df, aes(x=cond, y=yval)) + geom_bar(stat="identity")

9.11 颜色 - 图1

  1. # 柱状条外用红色边线
  2. ggplot(df, aes(x=cond, y=yval)) + geom_bar(stat="identity", colour="#FF9999")

9.11 颜色 - 图2

  1. # 红色填充,黑色边线
  2. ggplot(df, aes(x=cond, y=yval)) + geom_bar(stat="identity", fill="#FF9999", colour="black")

9.11 颜色 - 图3

  1. # 标准黑色线条和点
  2. ggplot(df, aes(x=cond, y=yval)) +
  3. geom_line(aes(group=1)) +
  4. geom_point(size=3)

9.11 颜色 - 图4

  1. # 蓝黑色线条,红色点
  2. ggplot(df, aes(x=cond, y=yval)) +
  3. geom_line(aes(group=1), colour="#000099") + # 蓝线
  4. geom_point(size=3, colour="#CC0000") # 红点

9.11 颜色 - 图5

9.11.2.3 将变量值映射到颜色

不用全局改变颜色,你可以将变量映射到颜色——换言之,通过把颜色放到 aes() 函数中,可以设置条件性变量。

  1. # 柱状条: x 和填充都依赖于cond2
  2. ggplot(df, aes(x=cond, y=yval, fill=cond)) + geom_bar(stat="identity")

9.11 颜色 - 图6

  1. # 其他数据集的柱状条;填充依赖于cond2
  2. ggplot(df2, aes(x=cond1, y=yval)) +
  3. geom_bar(aes(fill=cond2), # 填充依赖于cond2
  4. stat="identity",
  5. colour="black", # 所有都是黑色轮廓线
  6. position=position_dodge()) # 把线条并排放置而非堆叠

9.11 颜色 - 图7

  1. # 线和点;颜色依赖于cond2
  2. ggplot(df2, aes(x=cond1, y=yval)) +
  3. geom_line(aes(colour=cond2, group=cond2)) + # 颜色分组都依赖于cond2
  4. geom_point(aes(colour=cond2), # 颜色依赖于cond2
  5. size=3) # 更大的点,不同的形状

9.11 颜色 - 图8

  1. # 以上操作等价; 但把 "colour=cond2" 移到全局的映射用aes()
  2. # ggplot(df2, aes(x=cond1, y=yval, colour=cond2)) +
  3. # geom_line(aes(group=cond2)) +
  4. # geom_point(size=3)

9.11.2.4 对色盲友好的颜色

下面这些是对色盲友好的颜色色板,一个用灰色,一个用黑色:

9.11 颜色 - 图99.11 颜色 - 图10

为了用 ggplot2, 我们在一个变量里储存颜色色板,然后之后调用。

  1. # 灰色的颜色色板:
  2. cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73",
  3. "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
  4. # 黑色的颜色色板k:
  5. cbbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73",
  6. "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
  7. # 为了填充颜色,加
  8. scale_fill_manual(values = cbPalette)
  9. #> <ggproto object: Class ScaleDiscrete, Scale, gg>
  10. #> aesthetics: fill
  11. #> axis_order: function
  12. #> break_info: function
  13. #> break_positions: function
  14. #> breaks: waiver
  15. #> call: call
  16. #> clone: function
  17. #> dimension: function
  18. #> drop: TRUE
  19. #> expand: waiver
  20. #> get_breaks: function
  21. #> get_breaks_minor: function
  22. #> get_labels: function
  23. #> get_limits: function
  24. #> guide: legend
  25. #> is_discrete: function
  26. #> is_empty: function
  27. #> labels: waiver
  28. #> limits: NULL
  29. #> make_sec_title: function
  30. #> make_title: function
  31. #> map: function
  32. #> map_df: function
  33. #> n.breaks.cache: NULL
  34. #> na.translate: TRUE
  35. #> na.value: NA
  36. #> name: waiver
  37. #> palette: function
  38. #> palette.cache: NULL
  39. #> position: left
  40. #> range: <ggproto object: Class RangeDiscrete, Range, gg>
  41. #> range: NULL
  42. #> reset: function
  43. #> train: function
  44. #> super: <ggproto object: Class RangeDiscrete, Range, gg>
  45. #> reset: function
  46. #> scale_name: manual
  47. #> train: function
  48. #> train_df: function
  49. #> transform: function
  50. #> transform_df: function
  51. #> super: <ggproto object: Class ScaleDiscrete, Scale, gg>
  52. # 为了在点线中使用颜色,加
  53. scale_colour_manual(values = cbPalette)
  54. #> <ggproto object: Class ScaleDiscrete, Scale, gg>
  55. #> aesthetics: colour
  56. #> axis_order: function
  57. #> break_info: function
  58. #> break_positions: function
  59. #> breaks: waiver
  60. #> call: call
  61. #> clone: function
  62. #> dimension: function
  63. #> drop: TRUE
  64. #> expand: waiver
  65. #> get_breaks: function
  66. #> get_breaks_minor: function
  67. #> get_labels: function
  68. #> get_limits: function
  69. #> guide: legend
  70. #> is_discrete: function
  71. #> is_empty: function
  72. #> labels: waiver
  73. #> limits: NULL
  74. #> make_sec_title: function
  75. #> make_title: function
  76. #> map: function
  77. #> map_df: function
  78. #> n.breaks.cache: NULL
  79. #> na.translate: TRUE
  80. #> na.value: NA
  81. #> name: waiver
  82. #> palette: function
  83. #> palette.cache: NULL
  84. #> position: left
  85. #> range: <ggproto object: Class RangeDiscrete, Range, gg>
  86. #> range: NULL
  87. #> reset: function
  88. #> train: function
  89. #> super: <ggproto object: Class RangeDiscrete, Range, gg>
  90. #> reset: function
  91. #> scale_name: manual
  92. #> train: function
  93. #> train_df: function
  94. #> transform: function
  95. #> transform_df: function
  96. #> super: <ggproto object: Class ScaleDiscrete, Scale, gg>

这个颜色集来源于网站: http://jfly.iam.u-tokyo.ac.jp/color/

色盲友好调色板 图 9.1: 色盲友好调色板

9.11.2.5 颜色选择

默认情况下,离散比例的颜色围绕 HSL 色环均匀分布。例如,如果有两种颜色,那么它们将从圆圈上的相对点中选择; 如果有三种颜色,它们在色环上将相隔 120° 等等。用于不同级别的颜色如下所示:

均匀色环 图 9.2: 均匀色环

默认颜色选择使用 scale_fill_hue()scale_colour_hue()。 例如,在以下情况下添加这些命令是多余的:

  1. # 这两个是等价的; 默认使用scale_fill_hue()
  2. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity")

9.11 颜色 - 图13

  1. # ggplot(df, aes(x=cond, y=yval, fill=cond)) +
  2. # geom_bar(stat='identity') + scale_fill_hue()
  3. # 这两个是等价的; 默认使用scale_colour_hue()
  4. ggplot(df, aes(x = cond, y = yval, colour = cond)) + geom_point(size = 2)

9.11 颜色 - 图14

  1. # ggplot(df, aes(x=cond, y=yval, colour=cond)) +
  2. # geom_point(size=2) + scale_colour_hue()

9.11.2.6 设置亮度和饱和度(色度)

虽然 scale_fill_hue()scale_colour_hue() 在上面是多余的,但是当你想要改变默认值时,可以使用它们,比如改变亮度或色度。

  1. # 使用 luminance = 45, 而不是默认 65
  2. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  3. scale_fill_hue(l = 40)

9.11 颜色 - 图15

  1. # 从 100 到 50 减少饱和度(亮度), 增加亮度
  2. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  3. scale_fill_hue(c = 45, l = 80)

9.11 颜色 - 图16

  1. # 注意:使用 scale_colour_hue() 设置线和点

亮度为 45 时的颜色图表:

9.11 颜色 - 图17

9.11.2.7 调色板:Color Brewer

你还可以使用其他颜色标度,例如从 RColorBrewer 包中获取。 请参阅下面的 RColorBrewers 调色板图表。

  1. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  2. scale_fill_brewer()

9.11 颜色 - 图18

  1. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  2. scale_fill_brewer(palette = "Set1")

9.11 颜色 - 图19

  1. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  2. scale_fill_brewer(palette = "Spectral")

9.11 颜色 - 图20

  1. # 注意: 使用 scale_colour_brewer() 设置点和线条

9.11.2.8 调色板:手动定义

最后,你可以使用 scale_fill_manual() 定义自己的颜色集。 有关选择特定颜色的帮助,请参阅下面的十六进制代码表。

  1. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  2. scale_fill_manual(values = c("red", "blue", "green"))

9.11 颜色 - 图21

  1. ggplot(df, aes(x = cond, y = yval, fill = cond)) + geom_bar(stat = "identity") +
  2. scale_fill_manual(values = c("#CC6666", "#9999CC", "#66CC99"))

9.11 颜色 - 图22

  1. # 注意:使用 scale_colour_manual() 设置线条和点

9.11.2.9 连续颜色

  1. # 产生一些数据
  2. set.seed(133)
  3. df <- data.frame(xval = rnorm(50), yval = rnorm(50))
  4. # 依赖 yval设置颜色
  5. ggplot(df, aes(x = xval, y = yval, colour = yval)) + geom_point()

9.11 颜色 - 图23

  1. # 使用不同的渐变
  2. ggplot(df, aes(x = xval, y = yval, colour = yval)) + geom_point() +
  3. scale_colour_gradientn(colours = rainbow(4))

9.11 颜色 - 图24

9.11.2.10 比色图表

9.11.2.11 十六进制色码图

颜色可以指定为十六进制 RGB 三元组合,例如 #0066CC。 前两位数字是红色,接下来的两位是绿色,最后两位是蓝色。 每个值的范围从 00 到 FF,以十六进制(base-16)表示,在 base-10 中等于 0 和 255。 例如,在下表中,#FFFFFF 为白色,#990000 为深红色。

色码图 图 9.3: 色码图

色码图来源于 http://www.visibone.com

9.11.2.12 RColorBrewer 调色板图表

调色板图表 图 9.4: 调色板图表