【问题标题】:ggplot: Generate facet grid plot with multiple seriesggplot:生成具有多个系列的平面网格图
【发布时间】:2016-08-29 17:15:59
【问题描述】:

我有以下数据框:

  Quarter        x        y         p         q
1  2001   8.714392 8.714621 3.3648435 3.3140090
2  2002   8.671171 8.671064 0.9282508 0.9034387
3  2003   8.688478 8.697413 6.2295996 8.4379698
4  2004   8.685339 8.686349 3.7520135 3.5278024

我的目标是生成一个刻面图,其中 x 和 y 列在刻面的一个图中,p,q 一起在另一个图中,而不是 4 个刻面。

如果我执行以下操作:

x.df.melt <- melt(x.df[,c('Quarter','x','y','p','q')],id.vars=1)
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=1)) + geom_line()+
  facet_grid(variable~., scale='free_y') +
  scale_color_discrete(breaks=c('x','y','p','q'))

我在 4 个不同方面的所有四个系列,但是我如何将 x,y 组合成一个,而 p,q 组合在一起成为另一个。最好不要传说。

【问题讨论】:

    标签: r ggplot2 facet-grid


    【解决方案1】:

    我认为上面的甜菜根的答案更优雅,但我正在解决同样的问题并以不同的方式到达同一个地方。我认为这很有趣,因为我使用了“双重融化”(嗯!)来排列 x,y/p,q 对。另外,它演示了tidyr::gather 而不是melt。

    library(tidyr)
    x.df<- data.frame(Year=2001:2004,
                       x=runif(4,8,9),y=runif(4,8,9),
                       p=runif(4,3,9),q=runif(4,3,9))
    
    
    x.df.melt<-gather(x.df,"item","item_val",-Year,-p,-q) %>% 
      group_by(item,Year) %>% 
      gather("comparison","comp_val",-Year,-item,-item_val) %>% 
      filter((item=="x" & comparison=="p")|(item=="y" & comparison=="q"))
    
    > x.df.melt
    # A tibble: 8 x 5
    # Groups:   item, Year [8]
       Year  item item_val comparison comp_val
      <int> <chr>    <dbl>      <chr>    <dbl>
    1  2001     x 8.400538          p 5.540549
    2  2002     x 8.169680          p 5.750010
    3  2003     x 8.065042          p 8.821890
    4  2004     x 8.311194          p 7.714197
    5  2001     y 8.449290          q 5.471225
    6  2002     y 8.266304          q 7.014389
    7  2003     y 8.146879          q 7.298253
    8  2004     y 8.960238          q 5.342702
    

    绘图语句见下文。

    这种方法的一个缺点(以及甜菜根使用ifelse)是filter 语句很快就会变得笨拙,如果你有很多对要比较。在我的用例中,我将共同基金的表现与一些基准指数进行了比较。每个基金都有不同的基准。我通过一个元数据表解决了这个问题,该表将基金代码与其各自的基准配对,然后使用left/right_join。在这种情况下:

    #create meta data
    pair_data<-data.frame(item=c("x","y"),comparison=c("p","q"))
    
    #create comparison name for each item name
    x.df.melt2<-x.df %>% gather("item","item_val",-Year) %>% 
      left_join(pair_data)
    
    #join comparison data alongside item data
    x.df.melt2<-x.df.melt2 %>% 
      select(Year,item,item_val) %>% 
      rename(comparison=item,comp_val=item_val) %>%
      right_join(x.df.melt2,by=c("Year","comparison")) %>% 
      na.omit() %>% 
      group_by(item,Year)
    
    ggplot(x.df.melt2,aes(Year,item_val,color="item"))+geom_line()+
      geom_line(aes(y=comp_val,color="comp"))+
      guides(col = guide_legend(title = NULL))+
      ylab("Value")+
      facet_grid(~item)
    

    由于不需要新的分组变量,我们保留引用 items 的名称作为分面图的标签。

    【讨论】:

      【解决方案2】:

      一个想法是创建一个新的分组变量:

      x.df.melt$var <- ifelse(x.df.melt$variable == "x" | x.df.melt$variable == "y", "A", "B")
      

      您可以在使用variable 进行分组时使用它进行分面:

      ggplot(x.df.melt, aes(Quarter, value, col=variable, group=variable)) + geom_line()+
        facet_grid(var~., scale='free_y') +
        scale_color_discrete(breaks=c('x','y','p','q'), guide = F)
      

      【讨论】:

      • 新变量被添加到融化的 data.frame 中正确吗?
      猜你喜欢
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2021-10-12
      相关资源
      最近更新 更多