代码之家  ›  专栏  ›  技术社区  ›  TheAvenger

r ggplot facet_grid多箱图

  •  0
  • TheAvenger  · 技术社区  · 8 年前

    使用 ggplot 和 facet_grid ,我想通过方框图显示两个并行的值向量。我的可用数据:

    df<-data.frame(“value”=runif(50,0,1),
    “值2”=runif(50,0,1),
    “类型1”=C(rep(“aaaaaaaaaaaaaaaaaaaa”,25),
    rep(“bbbbbbbbbbbbbbbbb”,25)),
    “2类”=rep(c(“c”,“d”),25),
    “数字”=rep(2:6,10)
    < /代码> 
    
    

    目前的代码只允许可视化一个值向量:

    ggplot(df,aes(y=value,x=type1))。+
    几何箱线图(alpha=0.3,aes(fill=type1))。+
    ggtitle(“标题”)。+
    面网格(类型2~编号)+
    scale_x_discrete(name=null,breaks=null)+这些行是可选的
    主题(legend.position=“bottom”)
    < /代码> 
    
    

    这是我目前的计划。

    我想为每个向量(数据帧中的值和值2)可视化一个并行方框图。然后,对于每个彩色箱线图,我希望有两个箱线图,一个用于value另一个用于value2DF <- data.frame("value" = runif(50, 0, 1), "value2" = runif(50,0,1), "type1" = c(rep("AAAAAAAAAAAAAAAAAAAAAA", 25), rep("BBBBBBBBBBBBBBBBB", 25)), "type2" = rep(c("c", "d"), 25), "number" = rep(2:6, 10))

    目前的代码只允许可视化一个值向量:

    ggplot(DF, aes(y=value, x=type1)) + 
      geom_boxplot(alpha=.3, aes(fill = type1)) + 
      ggtitle("TITLE") + 
      facet_grid(type2 ~ number) +
      scale_x_discrete(name = NULL, breaks = NULL) + # these lines are optional
      theme(legend.position = "bottom")
    

    这是我目前的计划。

    enter image description here

    我想为每个向量(数据帧中的值和值2)可视化一个并行方框图。那么对于每个彩色的箱型图,我想要两个箱型图,一个用于价值另一个是为了Value2

    2 回复  |  直到 8 年前
        1
  •  1
  •   camille    8 年前

    我想可能有一个帖子已经提到了它,除了我上面链接的那个。但这有两个问题:1)将数据转换为 ggplot expected,即long shaped so there are values to map to美学,2)Separation of concerns,in that you can use reforme2 or(more up-to-date) tidyr functions to get data in to the proper shape,and ggplot2 fuNCTIONS to plot it.

    您可以使用 tidyr::gathere 获取长数据,并方便地将其直接导入 ggplot 。

    library(tidyverse)
    …
    < /代码> 
    
    

    为了说明,尽管使用了非常通用的列名:

    df%>%
    收集(key,value=val,value,value2)%>%
    头()
    #>类型1类型2编号键VAL
    #>1 aaaaaaaaaaaaaaaaaaaaaa c 2值0.5075600
    #>2 aaaaaaaaaaaaaaaaaaaa d 3值0.6472347
    #>3 aaaaaaaaaaaaaaaaaaaaaa c 4值0.7543778
    #>4 aaaaaaaaaaaaaaaaaaaa d 5值0.7215786
    #>5 aaaaaaaaaaaaaaaaaaaa c 6值0.1529630
    #>6 aaaaaaaaaaaaaaaaaaaa d 2值0.8779413
    < /代码> 
    
    

    直接进入ggplot的管道

    df%>%
    收集(key,value=val,value,value2)%>%
    ggplot(aes(x=键,y=val,fill=type1))。+
    geom_boxplot()图+
    面网格(类型2~编号)+
    主题(legend.position=“bottom”)
    < /代码> 
    
    

    同样,由于一些通用的列名,我不完全确定这是您想要的设置,就像我不知道在value中的区别/value2vsaaaaaaa/bbbbbbb。您可能需要交换aesassignments around correspondly.

    解决它,除了我上面链接的。但这有两个问题:1)将数据转换为ggplot期望,即长形,因此有价值映射到美学上,以及2)分离关注点,因为您可以使用reshape2或(更新)tidyr将数据转换成正确形状的函数,以及ggplot2函数来绘制它。

    你可以使用tidyr::gather用于获取长数据,并方便直接将其传输到格格图.

    library(tidyverse)
    ...
    

    为了说明,尽管使用非常通用的列名:

    DF %>%
      gather(key, value = val, value, value2) %>%
      head()
    #>                    type1 type2 number   key       val
    #> 1 AAAAAAAAAAAAAAAAAAAAAA     c      2 value 0.5075600
    #> 2 AAAAAAAAAAAAAAAAAAAAAA     d      3 value 0.6472347
    #> 3 AAAAAAAAAAAAAAAAAAAAAA     c      4 value 0.7543778
    #> 4 AAAAAAAAAAAAAAAAAAAAAA     d      5 value 0.7215786
    #> 5 AAAAAAAAAAAAAAAAAAAAAA     c      6 value 0.1529630
    #> 6 AAAAAAAAAAAAAAAAAAAAAA     d      2 value 0.8779413
    

    直接输送到格格图:

    DF %>%
      gather(key, value = val, value, value2) %>%
      ggplot(aes(x = key, y = val, fill = type1)) +
        geom_boxplot() +
        facet_grid(type2 ~ number) +
        theme(legend.position = "bottom")
    

    同样,由于一些通用的列名,我不完全确定这是您想要的设置,就像我不知道value/value2VSAAAAAAA/BBBBBBB. 你可能需要交换aes相应的任务。

        2
  •  0
  •   Freakazoid    8 年前

    您必须重新调整数据帧的形状。使用另外一个指示符(列),该指示符定义值的类型(例如“值类型”),并且只定义一个值列。指示器会将该值与相应的值类型匹配。下面的代码将重塑您的示例:

    DF <- data.frame("value" =  c(runif(50, 0, 1), runif(50,0,1)),
                     "value_type" = rep(c("value1","value2"), each=50),
                     "type1" = rep(c(rep("AAAAAAAAAAAAAAAAAAAAAA", 25), 
                                     rep("BBBBBBBBBBBBBBBBB", 25)), 2),
                     "type2" = rep(rep(c("c", "d"), 25), 2), 
                     "number" = rep(rep(2:6, 10),2))
    

    将ggplot additionaly与颜色参数一起使用:

    ggplot(DF, aes(y=value, x=type1, col=value_type)) + 
      geom_boxplot(alpha=.3, aes(fill = type1)) + 
      ggtitle("TITLE") + 
      facet_grid(type2 ~ number) +
      scale_color_manual(values=c("green", "steelblue")) + # set the color of the values manualy
      scale_x_discrete(name = NULL, breaks = NULL) +# these lines are optional
      theme(legend.position = "bottom")