R 对gpplot2使用loop会导致显示图例时出现问题

R 对gpplot2使用loop会导致显示图例时出现问题,r,for-loop,ggplot2,R,For Loop,Ggplot2,我有一个R代码,可以创建一个线性回归。我对图表中的图例有一些问题。我想使用trendDateRange中指定的日期作为不同颜色的图例。因为这些日期是YYYY-MM-DD格式。我只需要YYYY-MM。例如,trendDateRage1=c(“2015-01-01”,“2015-12-31”)我想将“2015-01-2015-12”显示为带有任意颜色的图例。当我在for循环中运行此命令时,它只显示1个使用最后一个trendDateRange的图例,即trendDateRange3,显示“2013-0

我有一个R代码,可以创建一个线性回归。我对图表中的图例有一些问题。我想使用
trendDateRange
中指定的日期作为不同颜色的图例。因为这些日期是YYYY-MM-DD格式。我只需要YYYY-MM。例如,trendDateRage1=c(“2015-01-01”,“2015-12-31”)我想将
“2015-01-2015-12”
显示为带有任意颜色的图例。当我在for循环中运行此命令时,它只显示1个使用最后一个
trendDateRange
的图例,即
trendDateRange3
,显示
“2013-01-2013-12”
。它不显示其他两个日期的图例。我对图形没有任何问题,尽管它们使用相同的颜色。我想看到每个传奇不同的颜色,即使他们有不同的线型

如果我运行下面显示单个图形的代码,它将使用正确的图例。我得到每个图表的图例

Month_Names <- c("2010-11","2010-12",
     "2011-01","2011-02","2011-03","2011-04","2011-05","2011-06","2011-07","2011-08","2011-09","2011-10","2011-11","2011-12",
     "2012-01","2012-02","2012-03","2012-04","2012-05","2012-06","2012-07","2012-08","2012-09","2012-10","2012-11","2012-12",
     "2013-01","2013-02","2013-03","2013-04","2013-05","2013-06","2013-07","2013-08","2013-09","2013-10","2013-11","2013-12",
     "2014-01","2014-02","2014-03","2014-04","2014-05","2014-06","2014-07","2014-08","2014-09","2014-10","2014-11","2014-12",
     "2015-01","2015-02","2015-03","2015-04","2015-05","2015-06","2015-07","2015-08","2015-09","2015-10","2015-11","2015-12",
     "2016-01","2016-02","2016-03","2016-04","2016-05","2016-06","2016-07","2016-08","2016-09","2016-10","2016-11","2016-12",
     "2017-01")
Actual_volume <- c(54447,57156,
   52033,49547,58718,53109,56488,60095,54683,60863,56692,55283,55504,56633,
   53267,52587,54680,55569,60013,56985,59709,61281,54188,59832,56489,55819,
   59295,52692,56663,59698,61232,57694,63111,60473,58984,64050,54957,63238,
   59460,54430,58901,61088,60496,62984,66895,62720,65591,67815,58289,72002,
   61054,60329,69283,68002,63196,72267,71058,69539,71379,70925,68704,76956,
   65863,70494,77348,70214,74770,77480,69721,83034,76761,77927,79768,81836,
   75381)

df_data <- data.frame(Month_Names, Actual_volume) 

trendDateRange1 <- c("2010-11-01", "2017-01-31")
trendDateRange2 <- c("2012-01-01", "2012-12-31")
trendDateRange3 <- c("2013-01-01", "2013-12-31")
numoftrends <- 3

list_of_df <- list()

list_of_df<- lapply(1:numoftrends, function(j) {
           trend.period <- get(paste0("trendDateRange", j))
           trend1 <- substr(trend.period[1], 1, 7)
           trend2 <- substr(trend.period[2], 1, 7)

          TRx <- subset(df_data, as.character(Month_Names) >= trend1 & 
                      as.character(Month_Names) <= trend2)

})

i = 1
trend.period <- get(paste0("trendDateRange", i))
trend1 <- substr(trend.period[1], 1, 7)
trend2 <- substr(trend.period[2], 1, 7)
Trend.dates <- paste0(trend1, '-' ,trend2)
plot = ggplot() + 
    geom_line(data = list_of_df[[i]], 
              aes(x = Month_Names, y = Actual_volume, group = 1 , colour = Trend.dates), 
              lty = i + 1)
print(ggplotly(plot)) 

i = 2
trend.period <- get(paste0("trendDateRange", i))
trend1 <- substr(trend.period[1], 1, 7)
trend2 <- substr(trend.period[2], 1, 7)
Trend.dates <- paste0(trend1, '-' ,trend2)
plot = ggplot() + 
    geom_line(data = list_of_df[[i]], 
              aes(x=Month_Names, y = Actual_volume, group = 1 , colour = Trend.dates), 
              lty = i + 1)
print(ggplotly(plot)) 

i = 3
trend.period <- get(paste0("trendDateRange", i))
trend1 <- substr(trend.period[1], 1, 7)
trend2 <- substr(trend.period[2], 1, 7)
Trend.dates <- paste0(trend1, '-' ,trend2)
plot = ggplot() + 
    geom_line(data = list_of_df[[i]], 
              aes(x = Month_Names, y = Actual_volume, group = 1 , colour = Trend.dates), 
              lty = i+1)
print(ggplotly(plot)) 
如果将这三个数据集合并为一个数据集,并将它们分开,而不是将它们添加到for循环中,那么使用ggplot2会容易得多

有很多方法可以做到这一点,但这里有一个使用dplyr和tidyr包的示例。它将替换
df_数据%
过滤器(月份名称>=开始,

月份名称这里有一个使用
ggplotly
的解决方案

nrows <- unlist(lapply(list_of_df,nrow))
df <- data.frame(do.call(rbind,list_of_df), Grp = factor(rep(1:3, nrows)))

plot <- ggplot(aes(x=Month_Names, y=Actual_volume, group = Grp, 
        colour=Grp), data=df) + geom_line()
print(ggplotly(plot))

nrows如果您将列表合并到一个data.frame中,其中的ID表示观察来自哪个元素并解析日期,那么获得一个像样的图非常简单:

library(dplyr)
library(ggplot2)

list_of_df %>% 
    bind_rows(.id = 'id') %>% 
    mutate(date = as.Date(paste0(Month_Names, '-01'))) %>% 
    ggplot(aes(date, Actual_volume, color = id)) + 
    geom_line()

或者没有dplyr

df <- do.call(rbind, 
              Map(function(df, i){df$id <- i; df}, 
                  df = list_of_df, 
                  i = as.character(seq_along(list_of_df))))

df$date <- as.Date(paste0(df$Month_Names, '-01'))

ggplot(df, aes(date, Actual_volume, color = id)) + geom_line()

df您之前问过这个问题,但删除了它吗?看起来非常熟悉。您好,守护神-这就是我要找的。有什么方法可以为每个TrendName使用不同的线型。非常感谢您的帮助。@aotearoa是的-您可以将
lty=TrendName
添加到
aes()中
再次感谢您的时间。如果我可以问另一个问题,是否有任何方法可以指定我应该在哪个TrendName上使用实线而不是系统来选择它。谢谢,祝您度过愉快的一天!@aotearoa您可以添加
比例\线型\手册(值=c(2,3,1))
,其中2、3、1或3、1、2,或您想要的三种类型的实线、虚线和虚线的顺序。谢谢您的惠顾。祝您度过愉快的一天!
df <- do.call(rbind, 
              Map(function(df, i){df$id <- i; df}, 
                  df = list_of_df, 
                  i = as.character(seq_along(list_of_df))))

df$date <- as.Date(paste0(df$Month_Names, '-01'))

ggplot(df, aes(date, Actual_volume, color = id)) + geom_line()