图例
尽管大多数重要的参数坐标轴和图例是共享的,但是有一些额外的设置仅适用于图例
图例比坐标轴更复杂,因为:
- 一个图例能从多个图层中展示多个图形属性(例如:颜色和形状),并且在不同层的不同几何对象的图例也不同
- 坐标轴总是看起来在相同的位置。图例可以出现在不同的位置,因此需要一些全局的方式来控制它们
- 图例有很多细节可以微调:它们应该垂直或水平展示?有多少列?关键字应该有多大?
1. 图层和图例
一个图例需要从多个图层中画出符号
例如,如果将颜色既映射到点上又映射到线上的话,关键字既展示点又展示线。如果映射到填充颜色上,会得到一个矩形
默认情况下,如果相应的图形属性被aes()映射到一个向量的话,图像会仅仅展示这个图层,可以用show.legend来修改是否展示图层:FALSE避免图例中的图层展示出来;TRUE则强制一个图层无论在什么情况下都展示出来
以下技巧结合TRUE能有效的突出数据点的展示
df <- data.frame(x = c(0.50, 0.75, 1.00, 1,25, 1.50), y= c(1, 2, 3), z = c('a', 'b', 'c'))
ggplot(df, aes(y, y)) +
geom_point(size = 4, color= "grey20") +
geom_point(aes(color = z), size = 2)
ggplot(df, aes(y, y)) +
geom_point(size = 4, color = "grey20", show.legend = TRUE) +
geom_point(aes(color = z), size = 2)
有时想要图例和图形中的几何对象有所不同。如果使用了透明度或大小来区分重合了的部分,并且在图形中添加了颜色,那么这种区分几何对象的做法特别有用。可以使用guid_legend()函数的override.aes参数
norm <- data.frame(x = rnorm(1000), y = rnorm(1000))
norm$z <- cut(norm$x, 3, labels = c("a", "b", "c"))
ggplot(norm, aes(x, y))+
geom_point(aes(color = z), alpha = 0.1)
ggplot(norm, aes(x, y)) +
geom_point(aes(color = z), alpha = 0.1) +
guides(color = guide_legend(override.aes = list(alpha = 1)))
ggplot2试着使用最少的图例来准确的表达图中使用的图形属性。它通过将相同的变量映射到不同的几个属性中来组合图例
下图展示了这些点是如何工作的:如果颜色和形状被映射到相同的变量中,那么仅仅用一个图例就够了
ggplot(df, aes(x, y)) +
geom_point(aes(color = z))
ggplot(df, aes(x, y)) +
geom_point(aes(shape = z))
ggplot(df, aes(x, y)) +
geom_point(aes(shape = z, color = z))
为了图例的合并,它们必须有相同的name(“名字”)。因此如果改变了其中一个标度的名字,也需要改变其它标度的名字
2. 图例布局
影响图例展示的很多设置由主题系统(theme system)所控制
可以用theme()函数来调整这些主题设定
图例的位置和对齐方式的调整被主题设定参数legend.position控制,它可以取值为right、left、top、bottom、none(无图例)
df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
base <- ggplot(df, aes(x ,y)) +
geom_point(aes(color = z), size = 3) +
xlab(NULL) + ylab(NULL)
base + theme(legend.position = "right") # 默认
base + theme(legend.position = "bottom")
base + theme(legend.position = "none")
在左/右和上/下之间转化来调整关键字在每个图例中的展示方式(横着还是竖着),和多个图例的堆叠方式(水平还是垂直)。如果需要,可以独立地调整这些设置
- legend.direction:图例中条目的布局(“horizontal”或“vertical”)
- legend.box:多个图例的安排(“horizontal”或“vertical”)
- legnd.box.just:当有多个图例时,整个区间内的每个图例的对齐方式(top、bootom、left、right)
另外,如果在图中有很大的空白空间,可以将图例放到图的里面。把legend.position参数设为一个长度为2的数值向量来达成这个目标。这个数值代表在面板区域中的相对位置:c(0, 1)表示左上角,c(1, 0)表示右下角
可以参阅legend.position及legend.justification相同的方式来控制图例的位置。不过,精确的定位图例需要经过大量的测试,并经历多次错误
base <- ggplot(df, aes(x, y)) +
geom_point(aes(color = z), size = 3)
base + theme(legend.position = c(0, 1), legend.justification = c(0, 1))
base + theme(legend.position = c(0.5, 0.5), legend.justification = c(0.5, 0.5))
base + theme(legend.position = c(1, 0), legend.justification = c(1, 0))
图例也有一个边距,可以使用legend.margin = unit(0, “mm”)来加以控制