从具有非标准求值的for循环生成绘图

从具有非标准求值的for循环生成绘图,r,for-loop,ggplot2,R,For Loop,Ggplot2,我正在尝试使用R中的ggplot从for循环生成绘图 让我们创建一个数据集: # Libraries library(tidyverse) # Set seed set.seed(123) # Create data frame df <- data.frame( time = c( rep(1,20), rep(2, 20), rep(3, 20) ), value_a =c(rnorm(n = 60, mean = 50, sd = 10)), value_b =c(

我正在尝试使用
R
中的
ggplot
从for循环生成绘图

让我们创建一个数据集:

# Libraries
library(tidyverse)

# Set seed
set.seed(123)

# Create data frame
df <- data.frame(
  time = c( rep(1,20), rep(2, 20), rep(3, 20) ), 
  value_a =c(rnorm(n = 60, mean = 50, sd = 10)),
  value_b =c(rnorm(n = 60, mean = 50, sd = 10)),
  value_c =c(rnorm(n = 60, mean = 50, sd = 10))
)

接下来,我想为数据帧的每一列生成这些图(时间在x轴上,值在y轴上)。我认为一个for循环就可以做到这一点:

for(i in colnames(df)[-1]){
  print(
    ggplot(df_a, aes(x= time, y = i)) +
      geom_jitter(position=position_jitter(width=0.1)) +
      scale_y_continuous(limits = c(0,100))
  )
}
它提供了以下错误:

错误:离散值提供给连续刻度

错误的产生是因为for循环中的
i
被视为一个字符向量,并且我不能(逻辑上)为离散值提供连续的刻度

在for循环外再现错误:

ggplot(df_a, aes(x= time, y = "value_a")) + # value_a is provided as character vector
  geom_jitter(position=position_jitter(width=0.1)) +
  scale_y_continuous(limits = c(0,100))
问题


有没有办法防止“value_a”被解释为字符向量,以便我能够控制循环中的比例?或者有没有其他方法可以方便地从数据帧中的不同列生成绘图?

我同意PoGibas的意见-重塑为长格式并使用
facet
可能是更好的方法。但是,如果您需要它来创建不同的绘图/图像等,请使用
eval(sym(i))
,如下所示:

库(tidyverse)
#播种
种子集(123)
#创建数据帧

df我将
熔化
并使用facets-这更像是
ggplot2
wayHey user213544,要扩展@PoGibas的评论,您熔化(或pivot_longer())df,然后只是值a,值b的子集…例如:df%>%pivot_longer(-time)%%>%filter(name==“value_a”)%%>%ggplot()+几何抖动(aes(x=time,y=value))我已经修改了标题,使其更好地搜索-希望这符合你的想法
ggplot(df_a, aes(x= time, y = "value_a")) + # value_a is provided as character vector
  geom_jitter(position=position_jitter(width=0.1)) +
  scale_y_continuous(limits = c(0,100))