前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跟着Plos Biology学作图:R语言ggplot2散点图并添加误差线和带置信区间的拟合曲线

跟着Plos Biology学作图:R语言ggplot2散点图并添加误差线和带置信区间的拟合曲线

作者头像
用户7010445
发布2022-04-08 13:47:34
2.1K0
发布2022-04-08 13:47:34
举报
文章被收录于专栏:小明的数据分析笔记本

论文

Large variation in the association between seasonal antibiotic use and resistance across multiple bacterial species and antibiotic classes

数据代码链接

https://github.com/orgs/gradlab/repositories

今天的推文重复一下论文中的 Figure 1B

image.png

论文提供的代码涉及到了map系列函数,这个我之前基本没有用过,功能很强大。这里还涉及到了如何批量循环作图

首先是数据集

代码语言:javascript
复制
library(readr)
library(tidyverse)

use.model.params<-read_csv("use-resistance-seasonality/tables/use_model_values.csv")
use.deviates <- read_csv("use-resistance-seasonality/tables/use_seasonal_deviates.csv")

准备作图配色

代码语言:javascript
复制
colors <- setNames( c("#220050", "#b30059","#0091a8","#359023", "#ffa500"), 
                   c("Macrolides", "Nitrofurans", "Penicillins", "Quinolones", "Tetracyclines") )

三个自定义函数

代码语言:javascript
复制
# 第一个
filter_models_AIC_func <- function(table, group_cols) {
  
  table.fil = table %>%
    group_by_at(vars(all_of(group_cols))) %>%
    mutate(rank = dense_rank(AIC)) %>%
    ungroup() %>%
    filter(rank == 1) %>%
    select(-AIC, -rank)
  
  return(table.fil)
}

# 第二个

cos_func = function(month, amplitude, phase, omega, intercept) {
  amplitude * cos(omega *(month - phase)) + intercept
} 

# 第三个是画图函数
plot_use_model_func = function(deviates, class, amplitude, phase, omega, a_lower, a_upper, sig) {
  
  col = colors[class]
  
  if (sig) { 
    title = paste(class, "*")
  } else {
    title = class
  }
  
  ci = data.frame(month=seq(1,12,0.01)) %>%
    mutate(lower_ci = map_dbl(month, ~cos_func(., a_lower, phase, omega, 0))) %>%
    mutate(upper_ci = map_dbl(month, ~cos_func(., a_upper, phase, omega, 0))) 
  
  p = ggplot(data = deviates, aes(x = month)) +
    geom_point(aes(x = month, y = seasonal_deviate), color = col, size = 1) +
    geom_errorbar(aes(x = month, ymin = seasonal_deviate - sem, ymax = seasonal_deviate + sem), width = 0.5, color = col) + 
    stat_function(fun = cos_func, args = list(a = amplitude, phase = phase, omega = omega, intercept = 0), size = 0.7, color = col) +
    geom_ribbon(data = ci, aes(x = month, ymin = lower_ci, ymax = upper_ci), fill = col, alpha = 0.3) +
    scale_x_continuous(breaks=c(1, 3, 5, 7, 9, 11)) +
    ggtitle(title) +
    xlab("Month") +
    theme_classic() +
    theme(legend.position="none",
          plot.title = element_text(size = 11, hjust = 0.5, face = "bold"),
          axis.text = element_text(size = 10),
          axis.title.x = element_text(size = 11),
          axis.title.y = element_blank()
    )
  
  return(p)
}

数据整合

代码语言:javascript
复制
use.model.params.fil <- filter_models_AIC_func(use.model.params, c("drug_class"))

f1b_data_model = use.model.params.fil %>%
  filter(term %in% c("amplitude", "phase")) %>%
  select(drug_class, omega, term, estimate, ci.lower, ci.upper, p.value.BH) %>%
  gather(variable, value, -(c("drug_class", "term", "omega"))) %>%
  unite(temp, term, variable) %>%
  spread(temp, value) %>%
  mutate(sig = amplitude_p.value.BH < 0.05) 

f1b_data_deviates = f1b_data_model %>%
  select(drug_class, omega) %>%
  left_join(use.deviates) %>%
  select(drug_class, month, seasonal_deviate, sem)

作图

代码语言:javascript
复制
f1b_data_model %>%
  left_join(
    f1b_data_deviates %>%
      nest(-drug_class) %>%
      rename(deviates_table = data),
    by = c("drug_class")
  ) %>% 
  
  #make plots
  mutate(plot = pmap(.l = list(deviates = deviates_table, class = drug_class, amplitude = amplitude_estimate,
                               phase = phase_estimate, omega = omega, a_lower = amplitude_ci.lower,
                               a_upper = amplitude_ci.upper, sig = sig),
                     .f = plot_use_model_func)) %>%
  pull(plot) -> f1b_plots

这里他的处理方式是将多个图保存到一个数据框的一列

使用ggpubr包中的函数拼图

代码语言:javascript
复制
library(ggpubr)
f1b = do.call(ggarrange, c(f1b_plots, nrow = 2, ncol = 3, align = "hv")) %>%
  annotate_figure(left = text_grob("Seasonal deviates in use (mean daily claims/10,000 people)", size = 11, rot = 90)) 
print(f1b)

image.png

这个数据处理和作图的代码整体还相对比较复杂,如果有时间的话争取录视频逐行解释其中的代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 论文
  • 数据代码链接
  • 首先是数据集
  • 准备作图配色
  • 三个自定义函数
  • 数据整合
  • 作图
  • 使用ggpubr包中的函数拼图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档