Label
为图片添加:
标题,Title:标题的目的是总结主要的发现;
副标题,subtitle:在标题下面以较小的字体添加额外的细节。
图片的说明文字,caption:在图的右下角添加文本,通常用来描述数据的来源。
x,y,color:重新设置坐标轴和图例的标题;横纵坐标的标题中最好带有单位。
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
geom_smooth(se = FALSE) +
labs(
title = "Fuel efficiency generally decreases with engine size",
subtitle = "Two seaters (sports cars) are an exception because of their light weight",
caption = "Data from fueleconomy.gov",
x = "Engine displacement (L)",
y = "Highway fuel economy (mpg)",
colour = "Car type"
)
注释
不那么智能的工具geom_text()和geom_label()
除了标注图片的主要部分,标注单个或一组观测值有时会很有用。
文本标记对于标记图形很有用,它们本身可以用作散点图(geom_text()和散点图很相似,但有一个额外的美学属性:label
),也可以与其他几何对象结合使用,例如,给points打标签或标注bars的高度。geom_text()
只向图形添加文本,geom_label()
在文本后面绘制一个矩形,使其更易于阅读。
函数1 | 函数2 |
---|---|
仅向图形中添加文本,check_overlap=TRUE可以不在同一位置绘制多个文本 | 在文本后绘制一个矩形,可以设置矩形的属性。没有check_overlap功能,也就是会绘制所有标签。没有angle 美学属性,且比geom_text()慢。fill 美学属性可以填充label的背景颜色。 |
1)parse:如果为TRUE,labels将被解析成表达式,并如?plotmath
所描述的那样展示。
2)nudge_x,nudge_y:“nudge”,轻推。在水平和垂直方向上轻推标签的位置,位移text远离point时很有用,特别在离散尺度上,不能和position
一起指定。
3)label.padding:labels周围的填充量,默认0.25 lines。
4)label.r:圆角半径,默认0.15 lines。
5)label.size:label边框大小,默认0.25,单位为mm。
6)show.legend:图例中是否应该包含本layer的信息?NA表示有美学映射时展示,没有就不展示;FALSE表示总是不展示;TRUE表示总是展示;也可以是一个named logical vector用来选择性展示美学属性。
7)check_overlap:如果为TRUE,与同一个layer中之前的文本有重叠的text将不在图片上画了。check_overlap发生在绘制时间且按data中出现的顺序,所以在调用geom_text()之前应该将data按照标签列进行排序。
图中,a text element的 height 和 width 是0,你看到的是 physical unites 而不是 data units。所以即使图片的大小更改,text labels 仍然是相同的大小,也因此你可能会看到一些图中text labels跑到了整个绘图区域之外,因为 axis limits 不会自动延伸以包含所有的 text label。
以上两个函数为data中的每一行添加标签,如果需要给特定的点添加label,可以用annotate()
。
所以到现在你应该明白,在给图添加标签之前你需要准备label data,这个label data可以是你绘图数据中的一个子集。
# 准备label data:每种车型中最高效的车。
# row_number()等于rank(,ties.method="first")
best_in_class <- mpg %>%
group_by(class) %>%
filter(row_number(desc(hwy)) == 1)
# 用geom_text()为对应的点添加labels,但labels之间、labels和points之间互相重叠导致图片可读性差
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
geom_text(aes(label = model), data = best_in_class)
# 可用geom_label()将label用方框标出来,再用nudge将label拉离point一点点
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
geom_label(aes(label = model), data = best_in_class, nudge_y = 2, alpha = 0.5)
美学属性hjust
和vjust
用来控制label的对齐方式,即point相对于label的位置,所有组合如下:
hjust
和vjust
的值可以是 ("left", "middle", "right", "bottom", "center", "top"),也可以用0表示right/bottom,1表示top/left。"inward" 总是将文本向中心对齐, "outward"总是将文本向远离中心的方向对齐(这里的中心可以理解为图片的中心):
df <- data.frame(
x = c(1, 1, 2, 2, 1.5),
y = c(1, 2, 1, 2, 1.5),
text = c("bottom-left", "bottom-right", "top-left", "top-right", "center")
)
ggplot(df, aes(x, y)) +
geom_text(aes(label = text))
ggplot(df, aes(x, y)) +
geom_text(aes(label = text), vjust = "inward", hjust = "inward")
“inward”和“outward”,左图的正确标题应该是“set hjust and vjust without inward”,右图的正确标题应该是“set hjust and vjust with inward”。
自动定位不重叠的text labels的工具ggrepel包
以上两个工具不能解决labels互相重叠的问题,ggrepel包
可以解决,这个包里包括两个函数:geom_text_repel()
、geom_label_repel()
,可以使labels互相远离、labels远离data points、labels远离绘图区域的边缘。
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
geom_point(size = 3, shape = 1, data = best_in_class) +
ggrepel::geom_label_repel(aes(label = model), data = best_in_class)
几个小例子:
1)用labels代替legend直接放在图片里:首先确定labels的位置,可以是median(每种class),另外需关闭图例:theme(legend.position = "none")。
2)将一个label放在图片的角落:label data需要放在数据框里。
2)将一个label放在图片的边缘:将label的坐标设置为Inf。
其他帮助注释图片的工具
1)geom_hline()
和geom_vline()
为图片添加参考线,推荐设置:厚度(size=2)
;颜色(color=white)
;画在原始数据层的下面,目的是不会喧宾夺主。
2)geom_rect()
在感兴趣的点周围画方框,方框的边界用xmin
、xmax
、ymin
、ymax
。
3)geom_segment()
,设置arrow
参数画一个箭头指向一个点,用x
、y
、xend
、yend
定义箭头的开始和结束位置。
网友评论