R ggplot使用匹配前缀但后缀不同的循环图形列

R ggplot使用匹配前缀但后缀不同的循环图形列,r,for-loop,ggplot2,paste,grepl,R,For Loop,Ggplot2,Paste,Grepl,我有一个大数据框,每个列包含一个高、低和高-低。我也有一个基础柱。我想为每一组前缀创建一个图,这样线图就有一个H、L、HL和Base,然后对所有其他匹配的前缀都是一样的 date A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base 2/1/18 6 4 6 4 2 3 5 8 9 2 3 5 3 2/2/18 2 4 7 6 5 8 3

我有一个大数据框,每个列包含一个高、低和高-低。我也有一个基础柱。我想为每一组前缀创建一个图,这样线图就有一个H、L、HL和Base,然后对所有其他匹配的前缀都是一样的

date     A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18    6   4   6   4   2   3   5   8   9    2    3    5    3
2/2/18    2   4   7   6   5   8   3   9   11   12   5    9    5
2/3/18    8   6   8   9   6   9   7   9   13   13   6    7    5
我尝试了多种方法,但都没有奏效

GraphList <- c("A", "B", "C", "D")
for (i in seq_along(GraphList)){
    plot <- ggplot(df, aes(date)) +
        geom_line(aes(y=Base, colour='Base')) +
        geom_line(aes(y=paste0(i,"High"), colour='High')) +
        geom_line(aes(y=paste0(i,"Low"), colour='Low')) +
        geom_line(aes(y=paste0(i,"LS"), colour='LS')) 
    print(plot)

GraphList首先,如果数据被重塑为“长”格式,我们可以让ggplot为我们做很多工作:

或者,我们可以使用循环创建几个单独的打印对象:

plots <- list()
for (i in unique(df.long$variable)) {
  plots[[i]] <- ggplot(data = filter(df.long, variable == i), aes(x = date, y = value, color = measure)) +
    geom_line() +
    geom_line(aes(y = Base), color = 'black')
}

plots[[1]]

plots请包含一个充分代表您实际数据的样本数据集(因为您说它很大),以解决您的问题。我想您应该先将数据从宽格式转换为长格式,然后再将其传递到
ggplot()
。此示例是我实际数据的表示。实际数据只包含更多的日期和更多的字母(即A-CA)。从宽格式到长格式的预处理会做什么?非常感谢!这很有帮助。有没有办法将这些图形导出为pdf格式?请参阅ggsave函数。好的,谢谢。最后一个问题。如果在我的真实数据集中,列的名称中有多个“”,是否有方法指定在“”处出现在“H”、“L”或“LS”之前而不是之前的分隔符?您可能希望搜索StackOverflow以获得有关该问题的答案。
df <- read.table(text = 'date     A_H B_H C_H D_H A_L B_L C_L D_L A_HL B_HL C_HL D_HL Base
2/1/18    6   4   6   4   2   3   5   8   9    2    3    5    3
                 2/2/18    2   4   7   6   5   8   3   9   11   12   5    9    5
                 2/3/18    8   6   8   9   6   9   7   9   13   13   6    7    5', header = T, stringsAsFactors = F)

library(tidyverse)
library(lubridate)

df.long <- df %>% 
  tidyr::gather(variable, value, -date, -Base) %>% 
  separate(variable, into = c('variable', 'measure'), sep = '_') %>% 
  mutate(date = mdy(date))

         date Base variable measure value
1  2018-02-01    3        A       H     6
2  2018-02-02    5        A       H     2
3  2018-02-03    5        A       H     8
4  2018-02-01    3        B       H     4
5  2018-02-02    5        B       H     4
6  2018-02-03    5        B       H     6
7  2018-02-01    3        C       H     6
8  2018-02-02    5        C       H     7
9  2018-02-03    5        C       H     8
10 2018-02-01    3        D       H     4
g <- ggplot(data = df.long, aes(x = date, y = value, color = measure)) +
  geom_line() +
  geom_line(aes(y = Base), color = 'black') +
  facet_grid(facets = ~variable)
print(g)
plots <- list()
for (i in unique(df.long$variable)) {
  plots[[i]] <- ggplot(data = filter(df.long, variable == i), aes(x = date, y = value, color = measure)) +
    geom_line() +
    geom_line(aes(y = Base), color = 'black')
}

plots[[1]]