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