Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
for循环,并更高效地生成绘图_R_Ggplot2_Plot - Fatal编程技术网

for循环,并更高效地生成绘图

for循环,并更高效地生成绘图,r,ggplot2,plot,R,Ggplot2,Plot,我总是手动和单独绘制绘图。我在想,是否有更有效的方法生成绘图 下面是我用来生成绘图的代码。我首先编写了两个函数,然后分别生成绘图(我将把整个代码放在下面)。我是否可能使用for loop来绘制这些图 非常感谢您提前给出的答案 library(ggpubr) # plot function perplot <- function (df, x, y, k,o){ ggplot (df, aes(x=x, y=y))+ geom_point()+ theme_class

我总是手动和单独绘制绘图。我在想,是否有更有效的方法生成绘图

下面是我用来生成绘图的代码。我首先编写了两个函数,然后分别生成绘图(我将把整个代码放在下面)。我是否可能使用for loop来绘制这些图


非常感谢您提前给出的答案

library(ggpubr)

# plot function
perplot <- function (df, x, y, k,o){
  ggplot (df, aes(x=x, y=y))+ 
    geom_point()+
    theme_classic()+
    labs(x='perception', y='response')+
    ggtitle((paste('subject',k,',','lambda = ',o))) 
}

geplot <- function (df, x, y, k, o){
  ggplot (df, aes(x=x, y=y))+ 
    geom_point()+
    geom_smooth(se=FALSE)+
    theme_classic()+
    labs(x='stimulus', y='response')+
    ggtitle((paste('subject',k,',','lambda = ',o))) 
}

# plots from dataplot
s1p1 <- perplot (dataplot,dataplot$per_dis,dataplot$response_0.2,1,0.2) 
s1p2 <- perplot (dataplot,dataplot$per_dis,dataplot$response_0.5,1,0.5)
s1p3 <- perplot (dataplot,dataplot$per_dis,dataplot$response_0.9,1,0.9) 
s1p4 <- perplot (dataplot,dataplot$per_dis,dataplot$response_1.5,1,1.5)
s1p5 <- perplot (dataplot,dataplot$per_dis,dataplot$response_2,1,2)

s1p11 <- geplot (dataplot,dataplot$phy_dis,dataplot$response_0.2,1,0.2)
s1p21 <- geplot (dataplot,dataplot$phy_dis,dataplot$response_0.5,1,0.5)
s1p31 <- geplot (dataplot,dataplot$phy_dis,dataplot$response_0.9,1,0.9)
s1p41 <- geplot (dataplot,dataplot$phy_dis,dataplot$response_1.5,1,1.5)
s1p51 <- geplot (dataplot,dataplot$phy_dis,dataplot$response_2,1,2)

subject1 <- ggarrange(s1p1,s1p2,s1p3,s1p4,s1p5,s1p11,s1p21,s1p31,s1p41,s1p51,ncol = 5,nrow = 2)
annotate_figure(subject1,
                top = text_grob("Perception sd = 0.8", color = "red", face = "bold", size = 14))

# plots from dataplot2
s2p1 <- perplot (dataplot2,dataplot2$per_dis,dataplot2$response_0.2,2,0.2) 
s2p2 <- perplot (dataplot2,dataplot2$per_dis,dataplot2$response_0.5,2,0.5) 
s2p3 <- perplot (dataplot2,dataplot2$per_dis,dataplot2$response_0.9,2,0.9)
s2p4 <- perplot (dataplot2,dataplot2$per_dis,dataplot2$response_1.5,2,1.5)
s2p5 <- perplot (dataplot2,dataplot2$per_dis,dataplot2$response_2,2,2)

s2p11 <- geplot (dataplot2,dataplot2$phy_dis,dataplot2$response_0.2,2,0.2)
s2p21 <- geplot (dataplot2,dataplot2$phy_dis,dataplot2$response_0.5,2,0.5)
s2p31 <- geplot (dataplot2,dataplot2$phy_dis,dataplot2$response_0.9,2,0.9)
s2p41 <- geplot (dataplot2,dataplot2$phy_dis,dataplot2$response_1.5,2,1.5)
s2p51 <- geplot (dataplot2,dataplot2$phy_dis,dataplot2$response_2,2,2)

subject2 <- ggarrange(s2p1,s2p2,s2p3,s2p4,s2p5,s2p11,s2p21,s2p31,s2p41,s2p51,ncol=5,nrow=2)
annotate_figure(subject2,
                top = text_grob("Perception sd = 2", color = "red", face = "bold", size = 14))
库(ggpubr)
#绘图函数

perplot仅为最后一个绘图位,效率略高。使用拼凑包,因为我更喜欢它,而且它可以很好地处理绘图列表

查看拼凑的小插曲如何添加标题

library(patchwork)

response <- c(0.2, 0.5, 0.9, 1.5, 2)
per_dis <- lapply(response, function(i) perplot (dataplot2, dataplot2$per_dis, dataplot2[[paste("response", i, sep = "_")]], 2, i))
phy_dis <- lapply(response, function(i) perplot (dataplot2, dataplot2$phy_dis, dataplot2[[paste("response", i, sep = "_")]], 2, i))

library(patchwork)
wrap_plots(c(per_dis, phy_dis), nrow = 2)
库(拼凑)

回复:谢谢你的建议。我已经删除了不直接相关的代码,只留下用于绘图的代码。我的问题是,我是否可以使用for循环或其他方法来生成具有类似结构的图。你的问题是什么?当然可以使用for循环或其他方法,因为基本上应用的是不同的k和o值。是关于矢量化还是循环隐藏()?谢谢tjebo,抱歉误解,我会把代码放回去的。很抱歉,我把dataplot中的绘图和dataplot 2中的绘图放在一起,因为我在想是否可以将所有内容循环在一起,因为它们具有非常相似的结构。感谢Martin的分享,我现在将查看该答案。我的问题是,我不确定如何使用for循环或其他方法来生成这些绘图。还有一个词要告诉您的绘图函数-您通过子集运算符引用列,但在使用ggplot时,这不是一个好的做法。检查如何正确引用函数中的列非常感谢您的回答。我可以问一下,我该如何回答?我试图直接将其作为响应,但未能运行。当y随i值、响应_0.2-0.2、响应_0.5-0.5等而改变时@KennyYu查看更新的答案-使用
paste
[[
@KennyYu check,还有他关于advanced R的书。此外,您的代码中有大量重复,可以将其转换为函数。在许多情况下,使用apply系列比for循环更安全、更整洁(尽管这部分是出于品味)。编写函数时,我最喜欢的原则是:让每个函数只做一项小工作,然后您可以始终构建一个结合它们的大函数。这样更易于调试和微调。我非常感谢您的帮助。我刚刚开始学习R一段时间,我确实注意到我的代码效率非常低(在本周之前,我基本上都是手工和单独完成的)。我正在尝试学习更多关于apply family、for loop和函数的知识,以使我的代码更简洁。非常感谢!
library(patchwork)

response <- c(0.2, 0.5, 0.9, 1.5, 2)
per_dis <- lapply(response, function(i) perplot (dataplot2, dataplot2$per_dis, dataplot2[[paste("response", i, sep = "_")]], 2, i))
phy_dis <- lapply(response, function(i) perplot (dataplot2, dataplot2$phy_dis, dataplot2[[paste("response", i, sep = "_")]], 2, i))

library(patchwork)
wrap_plots(c(per_dis, phy_dis), nrow = 2)