ggplot2学习(三)

ggplot2基础(3)——注释

ggplot2基础(1)
ggplot2基础(2)——坐标轴
ggplot2基础(3)——注释
ggplot2基础(4)——主题
ggplot2基础(5)——配色与图例

使用ggplot2过程中,离不开在其中添加各种各样的文字信息,对于坐标轴上的文字内容,可以使用的函数包括lab()xlab()ylab等多个函数,我们已经在上一章中进行了详细的介绍,这一章我们主要介绍图中的其他文字标注方式——注释。

参考的内容主要是:

1 annotate函数

如果想要在图片上添加注释,目前比较推荐的是使用annotate函数,该函数会在图片上增加注释图层,该图层不会映射到DataFrame对象。其定义为:

annotate(
  geom,
  x = NULL,
  y = NULL,
  xmin = NULL,
  xmax = NULL,
  ymin = NULL,
  ymax = NULL,
  xend = NULL,
  yend = NULL,
  vjust,
  hjust,
  arrow = NULL,
  parse = FALSE,  
  ...,
  na.rm = FALSE
)

其中

  • geom 注释的类型,可选项包括"text"(文本)、"rect"(矩形)、"segment"(线段)、"pointrange"(点线段)、"curve"(曲线)等
  • x, y, xmin, ymin, xmax, ymax, xend, yend, vjust, hjust 注释所在的位置信息
  • arrow 设置箭头信息(只有注释类型为线段或曲线时起作用)
  • parse 逻辑型参数;若设为TRUE,则label参数的内容遵循plotmath的编译规则
  • ... 一些视觉参数,可以参考aes函数的设置
  • na.rm 默认值为FALSE,此时缺失的值会被移除,并会给出警告信息;如果设置为TRUE,则缺失值会被删除而不给出任何警告信息。

1.1 文本型注释——text

使用文本型注释,除了将geom参数设置为text外,还需要设置label参数:

library(ggplot2)

p = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point()

p + annotate("text", x=3, y=48, label="Group1") +
    annotate("text", x=4.5, y=66, label="Group2")
image.png

如果坐标轴为连续值,则可以将xy设置为Inf-Inf,以便于在绘图区域的边缘放置注解。

p + 
annotate("text", x=-Inf, y=Inf, label="Upper left", hjust=-.2, vjust=2) +
annotate("text", x= mean(range(faithful$eruptions)), y=-Inf, vjust=-0.4, label="Bottom middle")
image.png

此外,还可以在label中使用Latex公式(其实是plotmath),以实现公式的编辑(同时将parse参数设置为TRUE)。如果需要在公式中使用普通的文字,则需要在其中将普通文字以单引号引起来,同时添加*作为分隔。

p = ggplot(data.frame(x=c(-3, 3)), aes(x=x)) +
    stat_function(fun=dnorm)

p + annotate("text", x=0, y=0.05, size=4, parse=TRUE, label="'Function:' * y==frac(1, sqrt(2 * pi)) * e^{-x^2/2}")
image.png

1.2 线型注释(含箭头)——segment、curve

如果要在图片中添加线段型注释,则需要将geom设置为"segment",同时设置xyxendyend,分别代表起点和终点的坐标

如果要为线段添加箭头,则需要设置arrow参数

arrow参数一般使用arrow()函数来进行设置,其常用的参数有:

  • ends 如果设置为"both",则表示线段的两边均有箭头,否则只在线段的终端进行设置
  • angel 箭头的角度,如果设置为90,则可以作为范围的标签进行使用
  • length 箭头的长度,一般可以使用unit(长度,"单位")的形式来使用

更多的使用可以加载grid包后,用?arrow命令来查看

p <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
    geom_point()
p + annotate("segment", x = 2.5, xend = 4, y = 15, yend = 25, color = "blue", size=4)
image.png
p <- ggplot(mpg, aes(displ, hwy)) +
  geom_point(
    data=filter(mpg, manufacturer=="subaru"),
    color="orange",
    size=3, 
    
  ) +
  geom_point() 

p + 
    annotate(geom = "segment", x = 4, y = 35, xend = 2.65, yend = 27, arrow = arrow(length = unit(4, "mm")), size=2)+
    annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
image.png

当需要使用更加美观的曲线时,需要将geom设置为"curve",同时想要调整曲线的曲率,则可以调整curvature参数。

p + 
    annotate(geom = "curve", x = 4, y = 35, xend = 2.65, yend = 27, curvature = .3, arrow = arrow(length = unit(4, "mm")), size=2)+
    annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
image.png

1.3 阴影注释——rect

使用阴影注释(在图片中添加矩形方框),除了需要将geom参数设置为"rect"外,还需要设置好xminyminxmaxymax,以便于确定矩形的范围。

ggplot(economics) + 
  geom_line(aes(date, unemploy)) + 
  annotate("rect", 
           xmin=as.Date("1970-01-01","%Y-%m-%d"), 
           xmax=as.Date("1979-12-31","%Y-%m-%d"), 
           ymin=-Inf, ymax=Inf, fill="blue", alpha=.1)+
  xlab("date") + 
  ylab("unemployment")
image.png

2 其他注释

2.1 直线注释

前面提到的是线段注释,如果想要使用直线类型的注释,可选的选项包括:

  • geom_hline()
  • geom_vline()
  • geom_abline()

其中geom_abline()的参数主要包括:

  • slope 表示斜率
  • intercept 表示截距

早期的ggplot中并未包含annotate函数,因此绝大多数使用的是直线、geom_rect等对象进行注释

library(ggplot2)

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

p + 
    geom_hline(yintercept=25) +
    geom_vline(xintercept=3) +
    geom_abline(slope=3, intercept=20)
image.png

2.2 文字注释——geom_text与geom_label

使用geom_text()geom_label()也可以在图中添加文字,进而实现注释的效果。但是需要注意的是,当使用这两个函数时,会在图中增加一个文字图层,同时该图层会映射到DataFrame中。例如,在下面的例子中,文字"Group 1"是我们使用annotate()函数绘制的,我们将其透明度设置为0.1,而"Group 2"是我们使用geom_text()函数绘制的,在绘制时,我们同样将其透明度设置为0.1,但是由于geom_text函数对DataFrame数据(即faithful)的映射,因此"Group 2"被绘制了n次,因此尽管其透明度也被设置为0.1,但是其清晰度则远远高于"Group 1"。

此外需要注意的是相对于geom_text而言,geom_label会在文本周围添加一个背景

library(ggplot2)

p = ggplot(faithful, aes(x=eruptions, y=waiting)) + 
    geom_point()

p + annotate("text", x=3, y=48, label="Group1", alpha=0.1) +
    geom_text(x=4.5, y=66, label="Group2", alpha=0.1)
image.png

3 分面注释

在分面上添加注释的方法有很多种,最主要还是依赖于要表达的信息:

3.1 方法一

使用分面变量创建一个新的数据框,然后设定每个分面需要绘制的值,最后配合新的数据框使用geom_text()函数

mpg_plot <- ggplot(mpg, aes(x = displ, y = hwy)) +
    geom_point() +
    facet_grid(. ~ drv)

f_labels = data.frame(drv=c("4", "f", "r"), label=c("4wd", "Front", "Rear"))

mpg_plot +
    geom_text(x=6, y=40, mapping=aes(label=label), data=f_labels)
image.png
lm_labels <- function(dat) {
  mod <- lm(hwy ~ displ, data = dat)
  formula <- sprintf("italic(y) == %.2f %+.2f * italic(x)",
                     round(coef(mod)[1], 2), round(coef(mod)[2], 2))
  r <- cor(dat$displ, dat$hwy)
  r2 <- sprintf("italic(R^2) == %.2f", r^2)
  data.frame(formula = formula, r2 = r2, stringsAsFactors = FALSE)
}

library(dplyr)
labels <- mpg %>%
  group_by(drv) %>%
  do(lm_labels(.))

mpg_plot + 
    geom_smooth(method=lm, se=FALSE) +
    geom_text(data=labels, aes(label=formula), x=3, y=40, parse=TRUE) +
    geom_text(x=3, y=35, aes(label=r2), data=labels, parse=TRUE, hjust=0)
image.png

3.2 方法二

使用gghighlight

# install.packages("gghighlight")

ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
    geom_point() +
    gghighlight::gghighlight() +
    facet_wrap(.~factor(cyl))
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容