如何循环包含ggplot2代码的变量,将它们绘制在R中的同一个图形上?

如何循环包含ggplot2代码的变量,将它们绘制在R中的同一个图形上?,r,for-loop,ggplot2,graphics,dynamic-programming,R,For Loop,Ggplot2,Graphics,Dynamic Programming,我试图在一个GGR中使用for循环绘制多条线。目前,我不认为我可以使用melt()命令将数据转换为长格式,因为我计划在以后的图形中添加一些附加功能(过滤器、用户输入等,在一个闪亮的仪表板中-这将是我的第一个仪表板,因此如果我不正确,请告诉我)。我目前设置了以下代码(见下文),将geom_line()命令分配给动态变量(生成x1和x2)。接下来,我生成一个字符串向量,该向量与创建的动态变量相关联。变量m被指定为my ggplot()命令。如何使用字符串向量调用x变量,创建一个与m+x1+x2+sc

我试图在一个GGR中使用for循环绘制多条线。目前,我不认为我可以使用melt()命令将数据转换为长格式,因为我计划在以后的图形中添加一些附加功能(过滤器、用户输入等,在一个闪亮的仪表板中-这将是我的第一个仪表板,因此如果我不正确,请告诉我)。我目前设置了以下代码(见下文),将geom_line()命令分配给动态变量(生成x1和x2)。接下来,我生成一个字符串向量,该向量与创建的动态变量相关联。变量m被指定为my ggplot()命令。如何使用字符串向量调用x变量,创建一个与m+x1+x2+scale_color_手册(“红色”、“绿色”)等价的绘图?请注意,这是一个质量控制过程,需要在各种图表中绘制200多个变量,因此解决方案需要可扩展,不需要我显式键入每个x变量

# Create mock data - need to run the timeStamp() function on it's own first
timeStamp <- function(){
  start <- readline("Enter Start Date (YYYY-MM-DD): ")  
  end <- readline("Enter End Date (YYYY-MM-DD): ")
  
  start <- as.POSIXct(start)
  end <- as.POSIXct(end)
  end <- end + as.difftime(1, unit = "days")
  interval <- 60
  
  Date <- seq(from=start, by = interval*60, to=end)
  
  Date <- as.data.frame(Date)
  n <- nrow(Date)
  
  Date <- Date[-1, ]
  
  Date <- as.data.frame(Date)
  
  assign("Date", Date, envir = .GlobalEnv)
  
}

timeStamp()

# Run timestamp function for any leap year use format 2028-01-01 to 2028-12-31 as inputs

# Creates remaining mock data
mock1 <- rep(c(1), times = 87840)
mock2 <- rep(c(2), times = 87840)
mock3 <- runif(87840, min=-100, max=100)
mock4 <- runif(87840, min=-10, max=10)
mock5 <- runif(87840, min=-150, max=150)
newDate <- rbind(Date, Date, Date, Date, Date,
                 Date, Date, Date, Date, Date)
# Inputs to for loop
dataFinal <- as.data.frame(cbind(newDate, mock1, mock2, mock5, mock4, mock3))
name <- list(names(dataFinal))
price <- names(dataFinal[ ,c(4,6)])


m <- ggplot(dataFinal)
for (i in seq_along(price)) { 
  dynamVar <- paste0("x", i)
  dynamCol <- paste0("col", i)
  assign(dynamVar, geom_line(aes_string(x = "Date", y = price[i], colour = as.factor(assign(dynamCol, price[i])))))
}
xPlot <- sprintf("x%s",seq(1:length(price)))

# This line of code produces a mock graphic that I am wanting to recreate, but instead of specifying x1 and x2, I want to produce the graph dynamically
m+x1+x2+scale_colour_manual(values=c("red", "green"))
#创建模拟数据-需要先运行自己的timeStamp()函数

时间戳有两种方法。首先是加法,它与你的要求最直接相关。我将使用
purrr::reduce

purrr::reduce(
  price, .init = m, 
  ~ .x + geom_line(aes_string(x = "Date", y = .y, color = as.factor(.y))), 
)
方法2是使用
geom\u line
的组美学。您只需要首先透视数据

dataFinal %>% 
  dplyr::select(c(1,4,6)) %>% 
  dplyr::sample_n(1e3) %>% 
  tidyr::pivot_longer(-Date) %>% 
  ggplot(aes(x = Date, y = value)) + 
  geom_line(aes(group = name, colour = as.factor(name)))
我对数据进行了采样,因为除此之外,
mock5
屏蔽了
mock3
(即使已绘制)


作为旁注,由于R在很大程度上是一种函数式编程语言,通常认为让函数(如
timeStamp
)修改全局环境是不明智的。而是让它返回数据,以便用户可以指定他/她的选择的符号(
myData)你能在你的数据中包含一个可复制的示例吗?我无法共享我正在使用的数据,但让我创建一些模拟数据,我会发布这些数据。@Cauder我已经更新了问题以包含模拟数据谢谢!这非常有效。另外,谢谢你关于日期数据生成的建议-我没有想到这一点。