如何在R中的循环中创建具有不同y变量的绘图?
提前道歉,我对R和编程一般都是新手 我有一个由几个水质变量组成的数据集,这些变量都是每年测量的。我想做的似乎很简单,就是创建几个探索性散点图,在x轴上绘制每个变量与时间的关系。我一直在研究如何使用循环来实现自动化(是的,我知道循环不受欢迎,但正如我所说,我是新手),因为我必须在这之后进行一系列分析,不想编写大量冗余代码 生成每个图形的过程都很顺利,但如何给每个图形一个唯一的标识符(即,根据我循环的特定变量编写y标签和图表标题)我还是一片空白 下面是我的代码,虽然我不确定它有多有用。关于如何引导循环函数执行我希望它执行的操作的建议将非常有用如何在R中的循环中创建具有不同y变量的绘图?,r,plot,R,Plot,提前道歉,我对R和编程一般都是新手 我有一个由几个水质变量组成的数据集,这些变量都是每年测量的。我想做的似乎很简单,就是创建几个探索性散点图,在x轴上绘制每个变量与时间的关系。我一直在研究如何使用循环来实现自动化(是的,我知道循环不受欢迎,但正如我所说,我是新手),因为我必须在这之后进行一系列分析,不想编写大量冗余代码 生成每个图形的过程都很顺利,但如何给每个图形一个唯一的标识符(即,根据我循环的特定变量编写y标签和图表标题)我还是一片空白 下面是我的代码,虽然我不确定它有多有用。关于如何引导循
WQdata <- data # the dataframe
names <- colnames(WQdata[, -1]) # names of variables, excluding Year which was first column
Year <- WQdata$Year
vars <- c(WQdata[, -1]) # removed year,
for (i in vars) {
xlim <- range(Year)
ylim <- range(i)
plot(x=Year,
y=i,
type="p",
main=paste(names[i]),
xlab="Year",
ylab=paste(names[i]))
}
WQdata您可以尝试创建标题和y标签的列表,并在循环中引用它们
使用mtcars的示例如下:
labels <- list("cyl" = c("main - cylinders", "ylabel - cylinders"),
"disp" = c("main displacement", "ylabel - cylinders"),
"hp" = c("main horsepower", "ylabel - horsepower")
)
for (i in colnames(mtcars)[2:4]){
plot(x=mtcars[,'mpg'],
y=mtcars[ ,i],
type = "p",
main = labels[[i]][1],
xlab= "mpg",
ylab= labels[[i]][2]
)
}
标签以下是使用字符向量和索引的答案:
df <- data.frame(YEAR = c(2013,2014,2015,2014,2013),
INCHES = c(12,36,34,23,12),
TEMP = c(89,98,76,87,65),
PRESSURE = c(0.05, 0.10, 0.12, 0.85, 0.90))
# Must correspond to variables except for `YEAR` in `df`
# `y_axis_labels` are your custom labels
y_axis_labels = c("Inches", "Temperature", "Pressure")
y_axis_vars = names(df[, -1])
xlim <- range(df$YEAR)
for(i in 1:length(y_axis_vars)){
curr_y_axis_var = y_axis_vars[i]
ylim <- range(df[[curr_y_axis_var]])
plot(x = df$YEAR,
y = df[[curr_y_axis_var]],
type = "p",
main = paste(curr_y_axis_var),
xlab = 'YEAR',
ylab = paste(curr_y_axis_var))
}
df您可以使用带有方面的ggplot来减少代码,而无需循环和重复代码。。。
库(ggplot2)
图书馆(tidyverse)
df%
聚集(-mpg,key=“var”,value=“value”)
ggplot(df,aes(x=mpg,y=value))+
几何点(α=0.3)+
几何光滑(方法=“lm”)+
面_包裹(~var,scales=“free”)+
主题_bw()
尝试使用变量名和常规的旧字符串格式动态创建标题。对于轴,您需要创建一个查找表(类似于Python中的字典),以将适当的轴映射到给定的图形。谢谢。考虑到这是一个探索性的过程,我不想让它变得完美,所以如果我可以拥有动态标题,那么我就不会为轴而烦恼。我想我遇到的问题是确保每个绘图都是根据它正在绘制的数据列来命名的,但是现在它在标题中插入了比我想要的更多的文本,这表明我的引用(“名称[I]”)没有按我的想法工作……太好了!但是使用列表列表似乎有点过头了——一个字符向量列表可能就足够了。@Gregor谢谢你的建议!我改进了答案,但我是否应该保持相同的订阅:标签[[I]][[2]]
?我看不出更好的方法,但看起来不太好。现在可以去掉第二个子集中的双括号。也就是说,[[i]][[2]]
可以是[[i]][2]
。由于您使用的是命名列表,所以最好说for(y in c(“cyl”、“disp”、“hp”)
(确保列表名称与disp
匹配,而不是displact
)。然后您可以执行y=mtcars[,y]
而不是依赖索引和列顺序。当然,用y
s替换另一个i
s。@Gregor Nice!再次感谢。我保留了I
,因为更改为y
可能会让人困惑。太好了,谢谢!仍然没有完全解决循环问题,但这将允许我继续前进。