简介
最近科研时候有个需求:使用分面展示不同组别的双 Y 轴图形。关于双轴绘制,在推文:基于 R 语言的科研论文绘图技巧详解(4)中已经展示过。但是,这幅图绘制包含了太多细节,当时没有细说。今天就基于前面的需求,重新把这类问题进行介绍。本文主要参考Posit Community 答疑帖[1]。
教程
数据介绍
library(tidyverse) # 加载数据===== df = read_csv("df.csv") head(df)
绘制双 Y 轴
首先,根据所需要求,将数据进行整理(使用 filter()
,group_by()
和 mutate()
)。接下来绘制出两个 Y 轴需要展示的图形(geom_bar()
和 geom_line(), geom_point()
)。此时得到的结果如下:
p1 = df %>% filter(type == "Adult") %>% group_by(station) %>% mutate(Percent = 100 * number/sum(number), station=factor(station)) %>% ggplot(aes(station, fill = species)) + geom_bar(aes(y = Percent), position = "stack", stat = "identity") + geom_line(aes(y = depth /4, group = 1)) + geom_point(aes(y = depth /4, group = 1))
注意:由于两个图形的 Y 轴范围差距过大,所以这里做了缩放处理(
y = depth /4
),读者需要根据自己数据做出判断。之后在展示 Y 轴刻度时进行对应修改即可。
之后,添加右侧 Y 轴刻度和标签:scale_y_continuous(sec.axis = sec_axis(~ . * 4, name = "Depth"))
。
注意:这里将 Y 轴刻度放大 4 倍,与前面
y = depth /4
对应。
# 双轴绘制 ====== p1 + scale_y_continuous(sec.axis = sec_axis(~ . * 4, name = "Depth"))
添加分面
在双 Y 轴的基础上可以添加分面来说明不同分类的比较情况。关于分面的更多教程/案例可见:分面中添加不同的直线、R绘图案例|基于分面的折线图绘制、分面中添加不同的直线等。
注意下面代码细节:space = "free_x"
使得 x 轴的空间排布自由化(不然三个类别空间大小相同)。scale = "free_x"
使得各类别的 x 轴刻度可以不同。
library(viridis) p1 + theme_bw() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), panel.grid = element_blank()) + scale_fill_viridis(discrete = T) + facet_grid(~factor(zone,levels = c("A1","A2","A3")), scale = "free_x", space = "free_x")
本文完整代码和数据可见:https://github.com/liangliangzhuang/R_example
小编有话说
新学期即将开始,我即将进入博士二年级阶段。回顾博士一年级的经历,我虽然阅读了一些相关文章,也进行了一两项研究工作,但至今尚未投稿博士期间的论文。与完成博士毕业论文相比,我目前的进展仅相当于整个研究过程的大约 1/4。
学校学制是三年,能否顺利毕业关键看这学期了。革命尚未成功,同志仍须努力!
欢迎读者在评论区留下你们的新学期愿望~
参考资料
[1]
Posit Community 答疑帖: https://community.rstudio.com/t/add-secondary-axis-on-ggplot/138671/7