R 如何循环列并使用相同的数据创建两个不同的图形

R 如何循环列并使用相同的数据创建两个不同的图形,r,loops,ggplot2,R,Loops,Ggplot2,我对R有点陌生,曾尝试创建一个代码,帮助我循环遍历大型数据集,从而每列生成2个图形。在这样做时,它必须考虑一些指定的变量,并区分它们(请参见代码)。 在第一张图中,它应该做一个箱线图/散点图,在这里我需要区分对照组和患病组。除此之外,我想看看有活动的人和没有活动的人之间的区别 实际上,这是可以工作的代码。现在,我想添加一个代码,将该图形与变量的柱状图相结合,以便对数据的分布有一些线索。我试图将其添加到函数中,但不知何故,它不起作用 此外,我希望将这两个图合并到一个页面中,并在结束循环中遍历整个变

我对R有点陌生,曾尝试创建一个代码,帮助我循环遍历大型数据集,从而每列生成2个图形。在这样做时,它必须考虑一些指定的变量,并区分它们(请参见代码)。 在第一张图中,它应该做一个箱线图/散点图,在这里我需要区分对照组和患病组。除此之外,我想看看有活动的人和没有活动的人之间的区别

实际上,这是可以工作的代码。现在,我想添加一个代码,将该图形与变量的柱状图相结合,以便对数据的分布有一些线索。我试图将其添加到函数中,但不知何故,它不起作用

此外,我希望将这两个图合并到一个页面中,并在结束循环中遍历整个变量集,并将其保存为图像(请参见代码)

请在下面找到我到目前为止的代码。非常感谢您的任何建议

library(ggplot2)
library(purrr)
创建一个包含随机数和2个组的数据帧 用于循环通过列2:5

response = names(df[2:5]) 
使用命名向量

response = set_names(response)
response

expl = set_names(expl)
expl
散点图 函数的第一部分起作用 功能的第1部分

scatter_fun = function(x, y) {
  ggplot(df, aes(x = .data[[x]], y = .data[[y]], color=color) ) + 
    geom_boxplot(fill="lightgrey", colour= "black", alpha=0.7,  
                 outlier.shape=NA) + 



geom_point(position = position_jitter(0.2)) +
    scale_color_manual(values= c("Control"="Orange", "PAD with event" = "Red", "PAD without event"="Green")) + # color the values as as you please
    labs(x = "",
         y = y,
         caption = "") +
    theme_bw() +
    theme(panel.grid.major = element_line(size = 0.1, linetype = 'solid',
                                          colour = "grey"), 
          panel.grid.minor = element_line(size = 0.05, linetype = 'solid',
                                          colour = "grey"),

          legend.title = element_blank(),
          legend.text = element_text(size=13),
          legend.key.size = unit(3,"line"))
ggplot(df, aes(x =.data[[x]])) +
    geom_histogram(fill="Orange", color="black", stat = "count")

}
event_vs_no_event = map(response,
                        ~map(expl, scatter_fun, y = .x) )
函数的第2部分(不起作用) 向函数中添加直方图 这部分对我来说很复杂。我想从函数中得到3样东西 1上半部分给出了结合散点图的箱线图 2下面的部分,我想让循环列(在本例中为b)的直方图 了解价值的分布情况 3随着功能的结束,我想把一页上的两列都转换成PDF 文件,同时在列中循环 为了了解发生了什么,可以删除该图,并使用下面的示例 以身作则 向函数中添加直方图

scatter_fun = function(x, y) {
  ggplot(df, aes(x = .data[[x]], y = .data[[y]], color=color) ) + 
    geom_boxplot(fill="lightgrey", colour= "black", alpha=0.7,  
                 outlier.shape=NA) + 



geom_point(position = position_jitter(0.2)) +
    scale_color_manual(values= c("Control"="Orange", "PAD with event" = "Red", "PAD without event"="Green")) + # color the values as as you please
    labs(x = "",
         y = y,
         caption = "") +
    theme_bw() +
    theme(panel.grid.major = element_line(size = 0.1, linetype = 'solid',
                                          colour = "grey"), 
          panel.grid.minor = element_line(size = 0.05, linetype = 'solid',
                                          colour = "grey"),

          legend.title = element_blank(),
          legend.text = element_text(size=13),
          legend.key.size = unit(3,"line"))
ggplot(df, aes(x =.data[[x]])) +
    geom_histogram(fill="Orange", color="black", stat = "count")

}
event_vs_no_event = map(response,
                        ~map(expl, scatter_fun, y = .x) )
仅指定列名称时的工作方式示例

loopplots = map(expl, ~scatter_fun(.x, "b") ) 
loopplots
当我运行这个程序时,它将控件和PAD分开,但是我不希望它们分开,只希望对这两个组的分布有一个总体的了解

整个循环:当我运行这一部分时,它只保存函数的后一部分

scatter_fun = function(x, y) {
  ggplot(df, aes(x = .data[[x]], y = .data[[y]], color=color) ) + 
    geom_boxplot(fill="lightgrey", colour= "black", alpha=0.7,  
                 outlier.shape=NA) + 



geom_point(position = position_jitter(0.2)) +
    scale_color_manual(values= c("Control"="Orange", "PAD with event" = "Red", "PAD without event"="Green")) + # color the values as as you please
    labs(x = "",
         y = y,
         caption = "") +
    theme_bw() +
    theme(panel.grid.major = element_line(size = 0.1, linetype = 'solid',
                                          colour = "grey"), 
          panel.grid.minor = element_line(size = 0.05, linetype = 'solid',
                                          colour = "grey"),

          legend.title = element_blank(),
          legend.text = element_text(size=13),
          legend.key.size = unit(3,"line"))
ggplot(df, aes(x =.data[[x]])) +
    geom_histogram(fill="Orange", color="black", stat = "count")

}
event_vs_no_event = map(response,
                        ~map(expl, scatter_fun, y = .x) )
检查保存在b上的内容

event_vs_no_event$b
将所有图像保存到1 PDF-->此处,我希望将对应于1列的直方图和散点图保存到1页中

pdf("event_vs_no_event.pdf")
event_vs_no_event
dev.off() 

我建议用这样的东西作为起点。使用带有ggplot的长数据帧比使用宽数据帧方便得多。在这里,我使用tidyr的
collect
生成长数据帧

library(tidyverse)
p1 <- df %>% 
  gather(response , value, -group, -event) %>% 
  ggplot(aes(group, value, color = event)) + 
   geom_boxplot(show.legend = F) + 
   geom_point(position = position_dodge(width = 0.8), show.legend = F) +  
   facet_wrap(~response, scales = "free_y")

p2 <- df %>% 
  gather(response , value, -group, -event) %>% 
  ggplot(aes(value)) + 
  geom_histogram(fill="Orange", color="black", bins= 6) + 
  facet_wrap(~response, scales = "free") 

library(cowplot)

plot_grid(p1, p2, ncol = 1)
库(tidyverse)
p1%
聚集(响应、值、组、事件)%>%
ggplot(aes(组、值、颜色=事件))+
geom_箱线图(show.legend=F)+
几何点(位置=位置减淡(宽度=0.8),显示图例=F)+
小平面包裹(~response,scales=“free_y”)
p2%
聚集(响应、值、组、事件)%>%
ggplot(aes(值))+
几何图形直方图(fill=“橙色”,color=“黑色”,箱子=6)+
面_包裹(~response,scales=“free”)
图书馆(cowplot)
绘图网格(p1、p2、ncol=1)

编辑

没有环的最整洁的方式是s.th。像这样

library(ggbeeswarm)
library(cowplot)
library(tidyverse)
plots <- df %>% 
  gather(response , value, -group, -event) %>% 
  nest(-response) %>% 
  mutate(box_scatter = map2(data, response, ~ggplot(.x,aes(group, value)) + 
        geom_boxplot(show.legend = F) + 
        geom_beeswarm(aes(color = event)) +
        ggtitle(.y))) %>% 
  mutate(hist = map(data, ~ ggplot(.,aes(value)) + 
                      geom_histogram(fill="Orange", color="black", bins= 6)+
                      ggtitle("")))

pdf("all_plots.pdf", width = 15)
map2(plots$box_scatter, plots$hist, 
    ~plot_grid(.x, .y, ncol = 2, labels ="auto"))
dev.off()
库(ggbeeswarm)
图书馆(cowplot)
图书馆(tidyverse)
地块%
聚集(响应、值、组、事件)%>%
嵌套(-response)%%>%
变异(box_scatter=map2(数据,响应,~ggplot(.x,aes(组,值))+
geom_箱线图(show.legend=F)+
geom_beeswarm(aes(颜色=事件))+
ggtitle(.y)))%>%
突变(hist=map(数据,~ggplot(,aes(值))+
几何图形直方图(fill=“橙色”,color=“黑色”,箱子=6)+
(标题(“”))
pdf(“all_plots.pdf”,宽度=15)
地图2(绘图$box\u散点,绘图$hist,
~plot_grid(.x,.y,ncol=2,labels=“auto”))
发展主任()
当然,您也可以使用for循环

pdf("all_plots.pdf", width = 15)
for (i in names(df)[2:5]){
  p1 <- ggplot(df, aes_string("group",i)) + 
    geom_boxplot(show.legend = F) + 
    geom_beeswarm(aes(color = event))

  p2 <- ggplot(df,aes_string(i)) + 
    geom_histogram(fill="Orange", color="black", bins= 6)

  p_all <- plot_grid(p1, p2)
  print(p_all)
} 
dev.off()
pdf(“all_plots.pdf”,宽度=15)
(i以名称(df)[2:5]){

p1虽然有一个问题,但可能是我缺乏使用R编码的经验。我有290个变量,我想在附件中显示:1散点图/箱线图和1页上相应的直方图。然后循环到下一列,并用下一个变量复制相同的变量。最后,我要打印:1个变量(两个图)每页。我添加了一个附件,以便您可以看到它的外观。