R 如何在运行时在ggplot2中添加线?

R 如何在运行时在ggplot2中添加线?,r,ggplot2,R,Ggplot2,我在R中有一个dataframe,我想编写一个帮助函数,使我能够轻松地在彼此的顶部显示多行 我想用一列布尔值来调用该方法,这些布尔值指示要可视化的数据帧的哪些列。出于几个原因,我想按顺序给它们命名,即“Element1”、“Element2”等 我希望能够在循环中执行此操作,即,对于列表中的每个布尔值,如果为真,请执行以下操作: 使用适当的名称将线添加到绘图中 将名称附加到名称列表中 由于这是一个相对较长的字符串(理想情况下,我希望用尽可能少的代码自动完成所有这一切),我希望使用一个变量,在

我在R中有一个dataframe,我想编写一个帮助函数,使我能够轻松地在彼此的顶部显示多行

我想用一列布尔值来调用该方法,这些布尔值指示要可视化的数据帧的哪些列。出于几个原因,我想按顺序给它们命名,即“Element1”、“Element2”等

我希望能够在循环中执行此操作,即,对于列表中的每个布尔值,如果为真,请执行以下操作:

  • 使用适当的名称将线添加到绘图中
  • 将名称附加到名称列表中
由于这是一个相对较长的字符串(理想情况下,我希望用尽可能少的代码自动完成所有这一切),我希望使用一个变量,在其中存储该字符串,并在每次需要新行时更新它。但是,每次更新此字符串时,该行也会更新。这意味着,每当我更改用于设置线条特征的变量时,线条都会相应更改

因此,当我在一个字符串变量中添加一个名为的行,并且每次添加新行时我都会更新这个变量,最后在绘图中只有一行,因为它们最终都具有相同的名称。如果我尝试引用带有整数I的列,并且每次循环都递增该整数,那么情况也是一样的——当I递增时,该行显示的列也会相应地更改

我如何才能以最符合美学和功能的方式做到这一点

overlay.graphs <- function(df, prog = c(TRUE, TRUE, TRUE)) {
  i <- 1
  names <- "Val"
  n <- nrow(df)
  gg <- ggplot2::ggplot(data = df, ggplot2::aes(x = "Date")) +
    ggplot2::geom_line(ggplot2::aes(y = Price, color = "Val"))
  for (bool in prog) {
    if (bool) {
      temp <- paste("Prog", i)
      gg <- gg + ggplot2::geom_line(ggplot2::aes(y = df[, temp], color = temp))
      names <- c(names, temp)
    }
    i <- i + 1
  }
  gg + ggplot2::scale_color_manual(name = "Legend", breaks = names, values = c("steelblue", "firebrick", "sienna", "seagreen"))
}

overlay.graphs我认为首先对数据进行整形会更简单,这样列选择就可以在ggplot之外完成。例如,假设我们有
mtcars
的前几列作为我们的数据:

library(tidyverse)
my_data <- mtcars[1:5]
my_data %>% names
# [1] "mpg"  "cyl"  "disp" "hp"   "drat"
bool <- c(T, T, F, F, T)
bool_cols <- bool * 1:(length(bool))
# > bool_cols
# [1] 1 2 0 0 5
my_data[bool_cols]
#> head(my_data[bool_cols], 2)
#                   mpg cyl drat
#Mazda RX4         21.0   6 3.90
#Mazda RX4 Wag     21.0   6 3.90

geom_线
是矢量化的(它可以绘制多条线)您应该尝试对它们进行分组或使用
geom\u hline
/
geom\u vline
答案和注释中有一个相当好的讨论,澄清了您现在所做的工作不正确的原因,以及一个可能的解决方法,即操作数据集,而不是在
aes()中更改内容(如果您真的想坚持使用循环)。
my_data[bool_cols] %>%
  rowid_to_column(var = "date_num") %>%
  gather(col, val, -date_num) %>%
  ggplot(aes(date_num, val, color = col)) + 
    geom_line()