【问题标题】:R show legend of data and trendline by groupR按组显示数据图例和趋势线
【发布时间】:2021-10-22 16:42:44
【问题描述】:

我正在尝试根据他们的数据和趋势线随着时间的推移绘制两组。理想情况下,我希望图例将组显示为标题,并在下方显示速率和趋势线。现在,图例只显示该组而不是趋势线。这是我的虚拟代码:

week <- c(1,2,3,4,5,1,2,3,4,5)
hits <- c(262,698,239,195,122,160,746,283,557,239)
rate <- c(116, 134, 154, 185, 167, 216, 178, 242, 267, 234)
lower <- c(94, 111, 123, 145, 138, 196, 147, 204, 216, 176)
upper <- c(126, 167, 176, 225, 191, 245, 199, 287, 292, 267)
group <- c("A","A","A","A","A","B","B","B","B","B")
df <- data.frame(week = week, hits=hits, rate=rate, lower=lower, upper=upper,group=group)


ggplot(df, aes(x = week)) + 
  geom_line(aes(y = rate, color = group)) +
  geom_ribbon(aes(ymin = lower, ymax = upper, fill = group), 
              alpha = 0.2) +
  geom_smooth(aes(y = rate, color = group), method = 'lm',  
              size = 0.5, se = FALSE, linetype = "dashed",
              show.legend = TRUE) +
  scale_color_manual(values = c("red", "black")) +
  scale_fill_manual(values = c("red", "black")) 

编辑 所以理想情况下,传说应该是这样的:

【问题讨论】:

  • 你能多说一下“组作为标题,下面是速率和趋势线”是什么意思,也许画个图?
  • 是的,我刚刚添加了一个编辑来显示我正在寻找的图例。

标签: r ggplot2


【解决方案1】:

不幸的是,我只找到了使用库 ggnewscale 手动执行此操作的解决方案:

手动方法

df %>%
  ggplot(aes(x = week)) + 
  geom_line(data = . %>% filter(group == 'A'), 
            aes(y = rate, color = 'Rate', linetype = 'Rate')) +
  geom_ribbon(data = . %>% filter(group == 'A'), 
              aes(ymin = lower, ymax = upper, fill = 'Rate'),
              alpha = 0.2) +
  geom_smooth(data = . %>% filter(group == 'A'), 
              aes(y = rate, color = 'Rate', linetype = 'Linear Trend'), method = 'lm',  
              size = 0.5, se = FALSE) +
  scale_linetype_manual(values = c(Rate = 'solid', 'Linear Trend' = 'dashed'), name ='Group A', guide = guide_legend(order = 1)) +
  scale_color_manual(values = c(Rate = 'red', 'Linear Trend' = 'red'), name = 'Group A', guide = guide_legend(order = 1)) +
  scale_fill_manual(values = c(Rate = 'red', 'Linear Trend' = 'white'), name = 'Group A', guide = guide_legend(order = 1)) +
  new_scale('linetype') +
  new_scale_color() +
  new_scale_fill() +
  geom_line(data = . %>% filter(group == 'B'), 
            aes(y = rate, color = 'Rate', linetype = 'Rate')) +
  geom_ribbon(data = . %>% filter(group == 'B'), 
              aes(ymin = lower, ymax = upper, fill = 'Rate'),
              alpha = 0.2) +
  geom_smooth(data = . %>% filter(group == 'B'), 
              aes(y = rate, color = 'Rate', linetype = 'Linear Trend'), method = 'lm',  
              size = 0.5, se = FALSE) +
  scale_linetype_manual(values = c(Rate = 'solid', 'Linear Trend' = 'dashed'), name ='Group B') +
  scale_color_manual(values = c(Rate = 'black', 'Linear Trend' = 'black'), name = 'Group B') +
  scale_fill_manual(values = c(Rate = 'black', 'Linear Trend' = 'white'), name = 'Group B') +
  theme_classic() +
  theme(legend.title = element_text(face="bold"))

首先,这会绘制 A 组的数据并手动设置图例条目。然后,使用来自ggnewscale 的new_scale('linetype')、new_scale_color() 和new_scale_fill() 创建新的比例。之后,为 B 组创建图,然后再次手动设置图例条目。

我认为必须有更好的解决方案,与此同时,我希望这对您有所帮助!

结果图

【讨论】:

    【解决方案2】:

    相信你想拥有multiple legends for the same aesthetic

    链接博客中的说明有些过时(它们指的是show.guide 而不是show.legend),但按照那里的想法,您可以执行以下操作:

    ggplot(df, aes(x = week)) + 
      geom_line(aes(y = rate, color = group), show.legend=TRUE) + 
      geom_ribbon(aes(ymin = lower, ymax = upper, fill = group), 
                  alpha = 0.2 ) + 
      geom_smooth(mapping=aes(y = rate, color = group), method = 'lm',  
                  size = 0.5, se = FALSE, linetype = "dashed", show.legend=FALSE) +
     
      scale_fill_manual(values = c("red", "black"),  name='Group',
      guide=guide_legend(override.aes = list(colour=c("red", "black")))) +
     
      scale_color_manual(values = c("red", "black"),  name='Trend',
      guide=guide_legend(override.aes = list(colour=c("red", "black"), linetype='dashed')))  
      
    

    最后两行是关键;基本上你需要手动创建你想要的图例。结果:

    This question 也是相关的。

    【讨论】:

    • 非常感谢您的回答!理想情况下,我想要两者,并按组和行类型划分,但我不确定我的数据结构是否允许这样做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多