【问题标题】:How can I create plots with different y variables in a loop in R?如何在 R 的循环中创建具有不同 y 变量的图?
【发布时间】:2017-06-09 17:10:22
【问题描述】:

提前道歉,我对 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]))
}

到目前为止,它所做的是按照我的意愿制作每个情节,但没有那些自定义标签。

再次,我很抱歉含糊不清或遗漏了一些东西 - 感到困惑。

谢谢!

【问题讨论】:

  • 尝试使用变量名和常规的旧字符串格式动态创建标题。对于轴,您需要创建一个查找表(类似于 Python 中的字典)以将适当的轴映射到给定的图形。
  • 谢谢。鉴于这是一个探索性程序,我不会纠缠于让它变得完美,所以如果我可以拥有动态标题,那么我就不会为轴而烦恼。我认为我遇到的问题是确保每个图的标题都根据它正在绘制的数据列,但现在它在标题中插入的文本比我想要的多得多,建议我的参考(“名称 [i ]") 没有按照我的想法工作......

标签: r plot


【解决方案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]
  )
  }

【讨论】:

  • 不错!但是使用列表列表似乎有点过头了——一个字符向量列表可能就足够了。
  • @Gregor 感谢您的建议!我改进了答案,但我应该保持相同的下标:labels[[i]][[2]]?我没有看到更好的方法来做到这一点,但它看起来不是很好。
  • 您现在可以去掉第二个子集上的双括号。也就是说,[[i]][[2]] 可以是[[i]][2]。由于您使用的是命名列表,因此使用for (y in c("cyl", "disp", "hp")) 可能会更好(确保列表名称匹配disp 而不是displacment)。然后你可以做y = mtcars[, y] 而不是依赖索引和列顺序。当然,用ys 替换其他is。
  • @Gregor 不错!再次感谢。我保留了i,因为更改为y 可能会造成混淆。
【解决方案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))
}

【讨论】:

    【解决方案3】:

    您可以使用带有构面的 ggplot 来减少代码,而无需循环和重复代码...

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

    【讨论】:

    • 完美,谢谢!仍然没有完全解决循环问题,但这会让我继续前进。
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多