查看原文
其他

使用分面展示不同组别的双 Y 轴图形

庄闪闪 庄闪闪的R语言手册 2023-09-04

点击下方公众号,回复资料分享,收获惊喜

简介

最近科研时候有个需求:使用分面展示不同组别的双 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


相关推荐

colourpicker包:图形颜色拾取器


visdat包:助你一眼看穿数据结构和缺失值!


report包:助你自动出统计报告!


reticulate包|数据科学者的福音



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存