9.11.2 方案

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

    9.11.2.1 样本数据

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

    9.11.2.2 简单的颜色设置

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

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

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

    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")

    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.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 颜色 - 图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 颜色 - 图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. #> breaks: waiver
    14. #> call: call
    15. #> clone: function
    16. #> dimension: function
    17. #> drop: TRUE
    18. #> expand: waiver
    19. #> get_breaks: function
    20. #> get_breaks_minor: function
    21. #> get_limits: function
    22. #> guide: legend
    23. #> is_discrete: function
    24. #> is_empty: function
    25. #> labels: waiver
    26. #> limits: NULL
    27. #> make_sec_title: function
    28. #> make_title: function
    29. #> map: function
    30. #> map_df: function
    31. #> n.breaks.cache: NULL
    32. #> na.translate: TRUE
    33. #> na.value: NA
    34. #> name: waiver
    35. #> palette: function
    36. #> palette.cache: NULL
    37. #> position: left
    38. #> range: <ggproto object: Class RangeDiscrete, Range, gg>
    39. #> range: NULL
    40. #> reset: function
    41. #> train: function
    42. #> super: <ggproto object: Class RangeDiscrete, Range, gg>
    43. #> reset: function
    44. #> scale_name: manual
    45. #> train: function
    46. #> train_df: function
    47. #> transform: function
    48. #> transform_df: function
    49. #> super: <ggproto object: Class ScaleDiscrete, Scale, gg>
    50. # 为了在点线中使用颜色,加
    51. scale_colour_manual(values = cbPalette)
    52. #> <ggproto object: Class ScaleDiscrete, Scale, gg>
    53. #> aesthetics: colour
    54. #> axis_order: function
    55. #> break_info: function
    56. #> break_positions: function
    57. #> breaks: waiver
    58. #> call: call
    59. #> clone: function
    60. #> dimension: function
    61. #> drop: TRUE
    62. #> expand: waiver
    63. #> get_breaks: function
    64. #> get_breaks_minor: function
    65. #> get_labels: function
    66. #> get_limits: function
    67. #> is_discrete: function
    68. #> is_empty: function
    69. #> labels: waiver
    70. #> limits: NULL
    71. #> make_sec_title: function
    72. #> make_title: function
    73. #> map: function
    74. #> n.breaks.cache: NULL
    75. #> na.translate: TRUE
    76. #> na.value: NA
    77. #> name: waiver
    78. #> palette: function
    79. #> palette.cache: NULL
    80. #> position: left
    81. #> range: <ggproto object: Class RangeDiscrete, Range, gg>
    82. #> range: NULL
    83. #> reset: function
    84. #> train: function
    85. #> super: <ggproto object: Class RangeDiscrete, Range, gg>
    86. #> reset: function
    87. #> scale_name: manual
    88. #> train: function
    89. #> train_df: function
    90. #> transform: function
    91. #> transform_df: function
    92. #> super: <ggproto object: Class ScaleDiscrete, Scale, gg>

    这个颜色集来源于网站: 。

    图 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")

    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)

    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

    亮度为 45 时的颜色图表:

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

    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")

    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"))

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

    9.11.2.9 连续颜色

    9.11 颜色 - 图23

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

    9.11.2.10 比色图表

    9.11.2.11 十六进制色码图

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

    色码图 图 9.3: 色码图

    9.11.2.12 RColorBrewer 调色板图表

    图 9.4: 调色板图表