使用 ggplot2 仅针对特定变量创建箱线图循环
Creating a boxplot loop with ggplot2 for only certain variables
我有一个包含 99 个观察值的数据集,我需要为其中包含特定字符串的数据集创建箱线图。但是,当我 运行 这段代码时,我从原始函数而不是循环中得到了 57 个完全相同的图。我想知道如何防止绘图被覆盖但仍然创建所有 57 个。这是代码和绘图的图片。
谢谢!
Boxplot Format
#starting boxplot function
myboxplot <- function(mydata=ivf_dataset, myexposure =
"ART_CURRENT", myoutcome = "MEG3_DMR_mean")
{bp <- ggplot(ivf_dataset, aes(ART_CURRENT, MEG3_DMR_mean))
bp <- bp + geom_boxplot(aes(group =ART_CURRENT))
}
#pulling out variables needed for plots
outcomes = names(ivf_dataset)[grep("_DMR_", names(ivf_dataset),
ignore.case = T)]
#creating loop for 57 boxplots
allplots <- list()
for (i in seq_along(outcomes))
{
allplots[[i]]<- myboxplot (myexposure = "ART_CURRENT", myoutcome =
outcomes[i])
}
allplots
我建议阅读有关标准和非标准评估以及它如何与 tidyverse 一起工作的内容。这里有一些链接
http://adv-r.had.co.nz/Functions.html#function-arguments
http://adv-r.had.co.nz/Computing-on-the-language.html
我也觉得这个有用
https://rstudio-pubs-static.s3.amazonaws.com/97970_465837f898094848b293e3988a1328c6.html
此外,您需要生成一个示例,以便可以重现您的问题。这是我创建的数据。
df <- data.frame(label = rep(c("a","b","c"), 5),
x = rnorm(15),
y = rnorm(15),
x2 = rnorm(15, 10),
y2 = rnorm(15, 5))
我保持你的大部分代码不变,只改变了需要改变的地方。
myboxplot2 <- function(mydata = df, myexposure, myoutcome){
bp <- ggplot(mydata, aes_(as.name(myexposure), as.name(myoutcome))) +
geom_boxplot()
print(bp)
}
myboxplot2(myexposure = "label", myoutcome = "y")
因为aes()
使用了非标准评价,所以需要使用aes_()
。再次阅读上面的链接。
我在这里获取所有以 x 开头的列。我假设您的代码获得了您想要的列。
outcomes <- names(df)[grep("^x", names(df), ignore.case = TRUE)]
这里我和你一样循环。不过,我只存储了绘图对象。
allplots <- list()
for (i in seq_along(outcomes)){
allplots[[i]]<- myboxplot2(myexposure = "label", myoutcome = outcomes[i])$plot
}
allplots
我有一个包含 99 个观察值的数据集,我需要为其中包含特定字符串的数据集创建箱线图。但是,当我 运行 这段代码时,我从原始函数而不是循环中得到了 57 个完全相同的图。我想知道如何防止绘图被覆盖但仍然创建所有 57 个。这是代码和绘图的图片。 谢谢!
Boxplot Format
#starting boxplot function
myboxplot <- function(mydata=ivf_dataset, myexposure =
"ART_CURRENT", myoutcome = "MEG3_DMR_mean")
{bp <- ggplot(ivf_dataset, aes(ART_CURRENT, MEG3_DMR_mean))
bp <- bp + geom_boxplot(aes(group =ART_CURRENT))
}
#pulling out variables needed for plots
outcomes = names(ivf_dataset)[grep("_DMR_", names(ivf_dataset),
ignore.case = T)]
#creating loop for 57 boxplots
allplots <- list()
for (i in seq_along(outcomes))
{
allplots[[i]]<- myboxplot (myexposure = "ART_CURRENT", myoutcome =
outcomes[i])
}
allplots
我建议阅读有关标准和非标准评估以及它如何与 tidyverse 一起工作的内容。这里有一些链接
http://adv-r.had.co.nz/Functions.html#function-arguments
http://adv-r.had.co.nz/Computing-on-the-language.html
我也觉得这个有用
https://rstudio-pubs-static.s3.amazonaws.com/97970_465837f898094848b293e3988a1328c6.html
此外,您需要生成一个示例,以便可以重现您的问题。这是我创建的数据。
df <- data.frame(label = rep(c("a","b","c"), 5),
x = rnorm(15),
y = rnorm(15),
x2 = rnorm(15, 10),
y2 = rnorm(15, 5))
我保持你的大部分代码不变,只改变了需要改变的地方。
myboxplot2 <- function(mydata = df, myexposure, myoutcome){
bp <- ggplot(mydata, aes_(as.name(myexposure), as.name(myoutcome))) +
geom_boxplot()
print(bp)
}
myboxplot2(myexposure = "label", myoutcome = "y")
因为aes()
使用了非标准评价,所以需要使用aes_()
。再次阅读上面的链接。
我在这里获取所有以 x 开头的列。我假设您的代码获得了您想要的列。
outcomes <- names(df)[grep("^x", names(df), ignore.case = TRUE)]
这里我和你一样循环。不过,我只存储了绘图对象。
allplots <- list()
for (i in seq_along(outcomes)){
allplots[[i]]<- myboxplot2(myexposure = "label", myoutcome = outcomes[i])$plot
}
allplots