首页 > 解决方案 > 在循环的 ggplot 中定义 xlim 并可视化重叠变量

问题描述

我想循环我的数据两次以获得以下图集:

一种包括彼此相似且具有不同垂直误差线的背景值。在这种情况下,它们相互重叠,我无法区分它们,这在另一个图形程序中是可能的。geom_jitterposition_dodge没有帮助。我想清楚地看到所有背景值及其误差线。

另一个不包括背景值。我想为每个循环图应用一个变化的 x 限制。

一个 csv 的 dput 数据类似于我的实际数据:

structure(list(Al = c(14000, 23000, NA, 13400, 13400, 12000, 
NA, NA, 0.005), Co = c(NA, 56.7, 34.2, 180, NA, NA, NA, 25, 0.005
), Mg = c(24, 200, 90, NA, NA, 123, 98, NA, 0.005), a1 = c(0.05, 
0.12, 0.09, NA, 0.07, NA, NA, NA, NA), a2 = c(NA, NA, NA, 0.01, 
0.07, 1.08, 0.05, NA, NA), a3 = c(0.4, 1.2, 0.3, 1.1, 0.7, 1.5, 
0.25, 0.78, NA), bg_a1 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.002
), bg_a2 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.003), bg_a3 = c(NA, 
NA, NA, NA, NA, NA, NA, NA, 0.002), err_a1 = c(NA, NA, NA, NA, 
NA, NA, NA, NA, 0.0013), err_a2 = c(NA, NA, NA, NA, NA, NA, NA, 
NA, 0.007), err_a3 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.003)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
    cols = list(Al = structure(list(), class = c("collector_double", 
    "collector")), Co = structure(list(), class = c("collector_double", 
    "collector")), Mg = structure(list(), class = c("collector_double", 
    "collector")), a1 = structure(list(), class = c("collector_double", 
    "collector")), a2 = structure(list(), class = c("collector_double", 
    "collector")), a3 = structure(list(), class = c("collector_double", 
    "collector")), bg_a1 = structure(list(), class = c("collector_double", 
    "collector")), bg_a2 = structure(list(), class = c("collector_double", 
    "collector")), bg_a3 = structure(list(), class = c("collector_double", 
    "collector")), err_a1 = structure(list(), class = c("collector_double", 
    "collector")), err_a2 = structure(list(), class = c("collector_double", 
    "collector")), err_a3 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

示例数据:

~Al,   ~Co,   ~Mg,  ~a1,  ~a2,  ~a3, ~bg_a1, ~bg_a2, ~bg_a3, ~err_a1, ~err_a2, ~err_a3,
  14000,    NA,    24, 0.05,   NA,  0.4,     NA,     NA,     NA,      NA,      NA,      NA,
  23000,  56.7,   200, 0.12,   NA,  1.2,     NA,     NA,     NA,      NA,      NA,      NA,
     NA,  34.2,    90, 0.09,   NA,  0.3,     NA,     NA,     NA,      NA,      NA,      NA,
  13400,   180,    NA,   NA, 0.01,  1.1,     NA,     NA,     NA,      NA,      NA,      NA,
  13400,    NA,    NA, 0.07, 0.07,  0.7,     NA,     NA,     NA,      NA,      NA,      NA,
  12000,    NA,   123,   NA, 1.08,  1.5,     NA,     NA,     NA,      NA,      NA,      NA,
     NA,    NA,    98,   NA, 0.05, 0.25,     NA,     NA,     NA,      NA,      NA,      NA,
     NA,    25,    NA,   NA,   NA, 0.78,     NA,     NA,     NA,      NA,      NA,      NA,
  0.005, 0.005, 0.005,   NA,   NA,   NA,  0.002,  0.003,  0.002,  0.0013,   0.007,   0.003

还有我的代码,当我想要第二组具有可变 x 限制的图时,其中的背景值及其误差条被注释掉:

library(tidyverse)
library(ggpubr)
library(scales)

ref <- read_csv("test.csv")

ref1 <- ref %>% 
  gather(s_type,s_all,a1,a2,a3) %>%
  gather(bg_type,bg_all,bg_a1,bg_a2,bg_a3) %>%
  gather(err_type,err_all,err_a1,err_a2,err_a3)

acq <- select(ref1, Al:Mg)

lower <- ref1$bg_all-ref1$err_all
upper <- ref1$bg_all+ref1$err_all

label <- c('a1','a2','a3',
           'a1 bg','a2 bg','a3 bg')


for (ii in seq_along(colnames(acq))) {

  current_col <- colnames(acq)[ii]

  print(paste0('Plot col: ', current_col))

  ## plot ##
  g <- ggplot(ref1, aes_string(x=acq[[current_col]], y='s_all',
                               colour='s_type', group='s_type', shape='s_type'),
              pseudo_log_trans(), ylim=c(0,1.5))+
    geom_point(na.rm= FALSE)+ 
    geom_smooth(aes_string(x=acq[[current_col]], y='s_all', colour='s_type'),
                method='lm', formula= y ~ x, show.legend = FALSE, se=FALSE) +
    stat_cor(method = "pearson", label.x = 3,show.legend = FALSE) +
    #    geom_point(aes_string(x=acq[[current_col]], y='bg_all',colour='bg_type',shape='bg_type'),
    #              na.rm = FALSE)+
    #  geom_errorbar(mapping=aes(ymin=lower,ymax=upper), show.legend = FALSE) +
    scale_color_manual("", values = c('royalblue', 'seagreen','tomato',
                                      'royalblue', 'seagreen','tomato'),
                       labels= label) +
    scale_shape_manual("", values=c(16,16,16,
                                    0,0,0),labels= label) + 
    scale_size_manual("", values = c(3,3,3,
                                     3,3,3)) +
    labs(y="a", x=paste(current_col,"(g)")) +
    theme(axis.text.x  = element_text( size = 12), 
          axis.text.y  = element_text(size = 12), 
          axis.title.y = element_text(size = 15),
          axis.title.x = element_text(size = 15)) 

  ggsave(g,file=paste0("plot_",current_col,".pdf"))
  print(g)
  #dev.off()
}

谢谢你。

标签: rloopsggplot2

解决方案


这会做。我已将子集和 xlim 的代码添加到您的原始代码中。

for (ii in seq_along(colnames(acq))) {
  ref2 <- ref1[complete.cases(ref1$s_all),]

  current_col <- colnames(acq)[ii]

  print(paste0('Plot col: ', current_col))

  ## plot ##
  g <- ggplot(ref1, aes_string(x=acq[[current_col]], y='s_all',
                               colour='s_type', group='s_type', shape='s_type'),
              pseudo_log_trans())+
    ylim(c(0,1.5))+ 
    xlim(min(ref2[[current_col]], na.rm = TRUE), max(ref2[[current_col]], na.rm = FALSE)) +
    geom_point(na.rm= FALSE)+ 
    geom_smooth(aes_string(x=acq[[current_col]], y='s_all', colour='s_type'),
                method='lm', formula= y ~ x, show.legend = FALSE, se=FALSE) +
    stat_cor(method = "pearson", show.legend = FALSE) +
    #    geom_point(aes_string(x=acq[[current_col]], y='bg_all',colour='bg_type',shape='bg_type'),
    #              na.rm = FALSE)+
    #  geom_errorbar(mapping=aes(ymin=lower,ymax=upper), show.legend = FALSE) +
    scale_color_manual("", values = c('royalblue', 'seagreen','tomato',
                                      'royalblue', 'seagreen','tomato'),
                       labels= label) +
    scale_shape_manual("", values=c(16,16,16,
                                    0,0,0),labels= label) + 
    scale_size_manual("", values = c(3,3,3,
                                     3,3,3)) +
    labs(y="a", x=paste(current_col,"(g)")) +
    theme(axis.text.x  = element_text( size = 12), 
          axis.text.y  = element_text(size = 12), 
          axis.title.y = element_text(size = 15),
          axis.title.x = element_text(size = 15)) 

  ggsave(g,file=paste0("plot_",current_col,".pdf"))
  print(g)
  #dev.off()
  }

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述


推荐阅读