ggplot2-工具箱2

1. 标签

主要使用函数geom_text()在特定的x和y坐标处添加标签label
geom_text()支持修改所有几何对象的大多数图形属性,因为调整文本展示形式的方法不可胜数

family设置字体,当前只有3种通用字体 sans(默认)、serif和mono
sans是无衬线字体,一般和汉字中的黑体相对应
serif是有衬线字体,一般和汉字中的宋体相对应
mono是等宽字体

df <- data.frame(x = 1, y = 3:1,
	family = c("sans", "serif", "mono"))
ggplot(df, aes(x, y)) +
	geom_text(aes(label = family, family = family))

在图像中使用其它字体会更加繁琐,因为各类图形设备的文本绘制过程不尽相同。
目前共有5类图形设备(png()、pdf()以及基于windows、mac和linux的屏幕设备)较为普及,因此每种通用字体都需要经过5种不同方式的配置
以下2各程序包可以简化配置过程
showtext,通过把所有字体视作多边形进行处理,使得图形设备成为独立图像
extrafont,把字体转换为所有设备通用的标准格式

fontface设置字体风格:默认(plain)、粗体(bold)和斜体(italic)

df <- data.frame(x = 1, y= 3:1,
	face = c("plain", "bold", "italic"))
ggplot(df, aes(x, y)) + 
	geom_text(aes(label = face, fontface = face))

改变文本的对齐方式需要设置参数hjust(“left” “center” “right” “inward” “outward”)
和vjust(“bootom” “middle” “top” “inward” “outward”)

默认对齐方式均为居中"center"。其中 "inward"比较有用,它把文字向图形中央对齐

df <- data.frame(x = c(1, 2, 1, 2, 1.5), y = c(1, 1, 2, 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")

size调整字体大小。与大多数工具不同的是,ggplot2字体不以常见的磅(pts)为单位,而是使用毫米(mm)
angle定义文本的旋转角度
可以将数据映射到这些图形属性上,不过需要谨慎使用,因为很难直观感受到字体大小、字体风格等图形属性与变量间的关系
geom_text()同样有3个参数,但不同的是,这3个参数只能设置为单一值,所以它们适用于所有标签

一般我们在给数据点添加标签时,并不希望文本覆盖到点(或条形)上,所以通常我们会把文本绘制与数据点稍微错开的地方。nudge_x和nudge_y参数设置文本在数据点附近的具体位置

df <- data.frame(trt = c("a", "b", "c"), resp = c(1.2, 3.4, 2.5))
ggplot(df, aes(resp, trt)) + geom_point() +
	geom_text(aes(label = paste0("(", resp, ")")), nudge_y = -0.25) + xlim(1, 3.6)

如果check_overlap = TRUE,重叠标签会自动删除。原理很简单,标签会根据数据框中的顺序依次绘制在图像中;如果某个标签会覆盖到已有数据点,它就会被自动忽略

ggplot(mpg, aes(displ, hwy)) +
	geom_text(aes(label = model)) + xlim(1, 8)
ggplot(mpg, aes(displ, hwy)) +
	geom_text(aes(label = model), check_overlap = TRUE) + xlim(1, 8)

geom_label()是geom_text()的衍生版本,它会在文本外绘制矩形框,可以让标签在复杂背景中显得更为清晰

label <- data.frame(waiting = c(55, 80), eruptions = c(2, 4.3), label = c("peak one", "peak two"))
ggplot(faithfuld, aes(waiting, eruptions)) + 
	geom_tile(aes(fill = density)) +
	geom_label(data = label, aes(label = label))

添加标签同样可能带来一些困扰
文本的添加不会改变图像区间,无论图像多大,标签都是固定大小(比如3cm)。理论上讲,图像区间应当随着图像大小的变化而变化,但这在ggplot2中目前还无法实现,因此需要根据数据分布和图像大小设置xlim()和ylim()参数调整图像显示区间

如果需要标记很多数据点,遮盖绘制问题很难避免。check_overlap = TRUE可以一定程度上解决这个问题,但无法决定哪些标签会被移除

文本标签可以替代图例,directlabels程序包中提供了若干相关工具

ggplot(mpg, aes(displ, hwy, color = class)) + geom_point()

ggplot(mpg, aes(displ, hwy, color = class)) + 
	geom_point(show.legend = FALSE) +
	directlabels::geom_dl(aes(label = class), method = "smart.grid")

directlabels程序包提供了一系列标签定位方法,如smart.grid适用于散点图起步,以及修饰频数多边图和折线图的其它方法

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值