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

时间:2019-07-03 14:50:51

标签: r ggplot2

我在R中有一个数据框,我想编写一个辅助函数,使我能够轻松地在彼​​此上方显示多行。

我想用一个布尔值列表来调用该方法,该值指示要可视化数据框的哪些列。由于多种原因,我想按顺序命名它们,即“ Element1”,“ Element2”等。

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

  • 使用适当的名称将线添加到绘图中
  • 将名称添加到名称列表中

由于这是一个相对较长的字符串(理想情况下,我想以尽可能少的代码自动完成所有这些操作),我想使用一个变量,在该变量中存储该字符串,并在每次需要时更新新队。但是,每次更新此字符串时,该行也会更新。这意味着,每当我更改用于设置生产线特征的变量时,生产线都会相应地更改。

因此,当我在字符串变量中添加带有名称的行,并且每次添加新行时都更新此变量时,由于只有相同的行,所以最终图中只有一行名称。如果我尝试使用每个循环都会递增的整数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"))
}

我希望ggplot2为对geom_line的每次调用绘制一条线,但是,由于任何时候用于设置该线属性的变量发生更改,该行也会被更新,所以这似乎不起作用。 / p>

您将如何处理?

1 个答案:

答案 0 :(得分:0)

我认为先重塑数据会更简单,以便在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

最后,我们可以在收集之后将其输入到ggplot中:

my_data[bool_cols] %>%
  rowid_to_column(var = "date_num") %>%
  gather(col, val, -date_num) %>%
  ggplot(aes(date_num, val, color = col)) + 
    geom_line()

enter image description here