我在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>
您将如何处理?
答案 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()