如何在R中的循环中创建具有不同y变量的图?

时间:2017-01-24 18:13:22

标签: r plot

提前道歉,我对R和一般的编程都很陌生。

我有几个水质变量的数据集,每年都进行测量。我想要做的似乎很简单,即创建几个探索性散点图,在x轴上绘制每个变量与时间的关系图。我一直在考虑用循环来做这个(是的,我知道循环并不受欢迎,但就像我说的,我是新的)自动化它,因为我将不得不做一堆之后的分析并不想写一堆冗余代码。

生成每个图表已经很好了,但是我在如何为每个图表赋予唯一标识符(即根据我正在循环的特定变量写出y标签和图表标题)上留下了空白。 / p>

以下是我对代码的看法,但我不确定它有多么有用。关于如何诱导循环功能做我想做的事情的建议会很棒。

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]))
}

到目前为止,这是我想要的每个情节,但没有那些自定义标签。

再次,我为模糊或遗漏而道歉 - 感到困惑。

谢谢!

3 个答案:

答案 0 :(得分:3)

你可以使用ggplot with facets来减少没有循环和重复代码的代码......

library(ggplot2)
library(tidyverse)

df <- mtcars %>%
    gather(-mpg, key="var", value = "value")

ggplot(df, aes(x = mpg, y = value)) +
    geom_point(alpha = 0.3) +
    geom_smooth(method = "lm") +
    facet_wrap(~var, scales = "free") +
    theme_bw()

答案 1 :(得分:1)

您可以尝试创建标题和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]
  )
  }

答案 2 :(得分:0)

以下是使用字符向量和索引的答案:

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))
}