9.7 图例

9.7.1 问题

你想用 ggplot2 修改图表中的图例。

9.7.2 方案

从带有默认选项的示例图开始:

  1. library(ggplot2)
  2. bp <- ggplot(data = PlantGrowth, aes(x = group, y = weight,
  3. fill = group)) + geom_boxplot()
  4. bp

9.7 图例 - 图1

9.7.2.1 去除图例

使用 guides(fill=FALSE), 用想要的颜色替代填充色.

你也可以用 theme() 移除图表中所有的图例。

  1. # 删除特定美学的图例(填充)
  2. bp + guides(fill = FALSE)

9.7 图例 - 图2

  1. # 在指定比例时也可以这样做
  2. bp + scale_fill_discrete(guide = FALSE)

9.7 图例 - 图3

  1. # 这将移除所有的图例
  2. bp + theme(legend.position = "none")

9.7 图例 - 图4

9.7.2.2 在图例中改变变量的顺序

这会将变量的顺序更改为 trt1,ctrl,trt2:

  1. bp + scale_fill_discrete(breaks = c("trt1", "ctrl", "trt2"))

9.7 图例 - 图5

根据指定颜色的方式,你可能必须使用不同的比例,如 scale_fill_manual(), scale_colour_hue(), scale_colour_manual(), scale_shape_discrete(), scale_linetype_discrete() 等。

9.7.2.3 反转图例中的条目顺序

反转图例顺序:

  1. # 这两种方式等同:
  2. bp + guides(fill = guide_legend(reverse = TRUE))

9.7 图例 - 图6

  1. bp + scale_fill_discrete(guide = guide_legend(reverse = TRUE))

9.7 图例 - 图7

  1. # 你也可以直接修改比例尺:
  2. bp + scale_fill_discrete(breaks = rev(levels(PlantGrowth$group)))

9.7 图例 - 图8

你可以使用不同的比例尺,如 scale_fill_manual(), scale_colour_hue(), scale_colour_manual(), scale_shape_discrete(), scale_linetype_discrete() 等,而不是 scale_fill_discrete()

9.7.2.4 隐藏图例标题

这将隐藏图例标题:

  1. # 为了填充的图例移除标题
  2. bp + guides(fill = guide_legend(title = NULL))

9.7 图例 - 图9

  1. # 为了所有的图例移除标题
  2. bp + theme(legend.title = element_blank())

9.7 图例 - 图10

9.7.2.5 修改图例标题和标签的文字

有两种方法可以更改图例标题和标签。 第一种方法是告诉 scale 使用具有不同的标题和标签。 第二种方法是更改数据框,使因子具有所需的形式。

9.7.2.5.1 使用比例尺

图例可能由 fill, colour, linetype, shape 或其他因素所介导.

9.7.2.5.2 使用填充和颜色

因为图例中的变量 group 被映射到颜色 fill,所以必须使用 scale_fill_xxx,其中 xxx 是将 group 的每个因子级别映射到不同颜色的方法。 默认设置是在每个因子级别的色轮上使用不同的色调,但也可以手动指定每个级别的颜色。

  1. bp + scale_fill_discrete(name = "Experimental\nCondition")

9.7 图例 - 图11

  1. bp + scale_fill_discrete(name = "Experimental\nCondition",
  2. breaks = c("ctrl", "trt1", "trt2"), labels = c("Control",
  3. "Treatment 1", "Treatment 2"))

9.7 图例 - 图12

  1. # 使用手动刻度而不是色调
  2. bp + scale_fill_manual(values = c("#999999", "#E69F00",
  3. "#56B4E9"), name = "Experimental\nCondition", breaks = c("ctrl",
  4. "trt1", "trt2"), labels = c("Control", "Treatment 1",
  5. "Treatment 2"))

9.7 图例 - 图13

请注意,这并未更改 x 轴标签。 有关如何修改轴标签的信息,请参见坐标轴

如果使用折线图,则可能需要使用 scale_colour_xxx()scale_shape_xxx() 而不是 scale_fill_xxx()颜色映射到线条和点的颜色,而填充映射到区域填充的颜色。 形状映射到点的形状。

我们将在这里为线图使用不同的数据集,因为 PlantGrowth 数据集不适用于折线图。

  1. # 一个不同的数据集
  2. df1 <- data.frame(sex = factor(c("Female", "Female", "Male",
  3. "Male")), time = factor(c("Lunch", "Dinner", "Lunch",
  4. "Dinner"), levels = c("Lunch", "Dinner")), total_bill = c(13.53,
  5. 16.81, 16.24, 17.42))
  6. # 基本的图表
  7. lp <- ggplot(data = df1, aes(x = time, y = total_bill, group = sex,
  8. shape = sex)) + geom_line() + geom_point()
  9. lp

9.7 图例 - 图14

  1. # 更改图例
  2. lp + scale_shape_discrete(name = "Payer", breaks = c("Female",
  3. "Male"), labels = c("Woman", "Man"))

9.7 图例 - 图15

如果你同时使用 colourshape,它们都需要给出比例规格。 否则会有两个独立的图例。

  1. # 指定颜色和形状
  2. lp1 <- ggplot(data = df1, aes(x = time, y = total_bill,
  3. group = sex, shape = sex, colour = sex)) + geom_line() +
  4. geom_point()
  5. lp1

9.7 图例 - 图16

  1. # 如果你仅仅指定颜色,将会发生
  2. lp1 + scale_colour_discrete(name = "Payer", breaks = c("Female",
  3. "Male"), labels = c("Woman", "Man"))

9.7 图例 - 图17

  1. # 指定的颜色和形状
  2. lp1 + scale_colour_discrete(name = "Payer", breaks = c("Female",
  3. "Male"), labels = c("Woman", "Man")) + scale_shape_discrete(name = "Payer",
  4. breaks = c("Female", "Male"), labels = c("Woman", "Man"))

9.7 图例 - 图18

9.7.2.5.3 比例尺的种类

比例尺有很多种。 它们采用「scale_xxx_yyy」的形式。 以下是一些常用的 xxxyyy 值:

xxx描述
colour线和点的颜色
fill填充区域的颜色 (比如:柱状图)
线条类型Solid/dashed/dotted lines
形状点的形状
大小Size of points
alpha不透明度/透明度
yyy描述
hue色轮的颜色相同
manual手动指定的值(例如,颜色,点形状,线型)
gradient颜色渐变
greyShades of grey
discrete不连续的值 (比如颜色,点的形状,线条类型,点的大小
continuous连续的值(透明度,颜色,点的大小)

9.7.2.6 更改数据框中的因子

更改图例标题和标签的另一种方法是直接修改数据框。

  1. pg <- PlantGrowth # 把数据复制到新的数据框
  2. # 重命名列中的列和值
  3. levels(pg$group)[levels(pg$group) == "ctrl"] <- "Control"
  4. levels(pg$group)[levels(pg$group) == "trt1"] <- "Treatment 1"
  5. levels(pg$group)[levels(pg$group) == "trt2"] <- "Treatment 2"
  6. names(pg)[names(pg) == "group"] <- "Experimental Condition"
  7. # 查看最终结果的几行
  8. head(pg)
  9. #> weight Experimental Condition
  10. #> 1 4.17 Control
  11. #> 2 5.58 Control
  12. #> 3 5.18 Control
  13. #> 4 6.11 Control
  14. #> 5 4.50 Control
  15. #> 6 4.61 Control
  16. # 画图
  17. ggplot(data = pg, aes(x = `Experimental Condition`, y = weight,
  18. fill = `Experimental Condition`)) + geom_boxplot()

9.7 图例 - 图19

图例标题“实验条件”很长,如果它被分成两行可能看起来更好,但是这种方法效果不好,因为你必须在列的名称中加上一个换行符。另一种方法,有尺度,通常是更好的方法。

另请注意使用反引号而不是引号。由于变量名中的空格,它们是必需的。

9.7.2.7 修改图例标题和标签的外观

  1. # 题目外观
  2. bp + theme(legend.title = element_text(colour = "blue",
  3. size = 16, face = "bold"))

9.7 图例 - 图20

  1. # 标签外观
  2. bp + theme(legend.text = element_text(colour = "blue", size = 16,
  3. face = "bold"))

9.7 图例 - 图21

9.7.2.8 修改图例框

默认情况下,图例周围没有框。 添加框并修改其属性:

  1. bp + theme(legend.background = element_rect())

9.7 图例 - 图22

  1. bp + theme(legend.background = element_rect(fill = "gray90",
  2. size = 0.5, linetype = "dotted"))

9.7 图例 - 图23

9.7.2.9 改变图例位置

将图例位置放在绘图区域外(左/右/上/下):

  1. bp + theme(legend.position = "top")

9.7 图例 - 图24

也可以将图例定位在绘图区域内。 请注意,下面的数字位置是相对于整个区域的,包括标题和标签,而不仅仅是绘图区域。

  1. # 将图例放在图表中,其中 x,y 为 0, 0(左下角)到 1,
  2. # 1(右上角)
  3. bp + theme(legend.position = c(0.5, 0.5))

9.7 图例 - 图25

  1. # 设置图例的「锚点」(左下角为 0, 0; 右上角为 1, 1)
  2. # 将图例框的左下角放在图的左下角
  3. bp + theme(legend.justification = c(0, 0), legend.position = c(0,
  4. 0))

9.7 图例 - 图26

  1. # 将图例框的右下角放在图表的右下角
  2. bp + theme(legend.justification = c(1, 0), legend.position = c(1,
  3. 0))

9.7 图例 - 图27

9.7.2.10 隐藏在图例中的斜线

如果使用轮廓制作条形图(通过设置 color = “black”),它将通过图例中的颜色绘制斜线。 没有内置的方法来删除斜杠,但可以覆盖它们。

  1. # 没有边缘线
  2. ggplot(data = PlantGrowth, aes(x = group, fill = group)) +
  3. geom_bar()

9.7 图例 - 图28

  1. # 添加轮廓,但图例中会出现斜线
  2. ggplot(data = PlantGrowth, aes(x = group, fill = group)) +
  3. geom_bar(colour = "black")

9.7 图例 - 图29

  1. # 隐藏斜线:首先绘制没有轮廓的条形图并添加图例,
  2. # 然后用轮廓再次绘制条形图,但带有空白图例.
  3. ggplot(data = PlantGrowth, aes(x = group, fill = group)) +
  4. geom_bar() + geom_bar(colour = "black", show.legend = FALSE)

9.7 图例 - 图30

9.7.3 注意

更多信息,请阅读 ggplot2-图例属性