R ggplot facet_grid多箱线图

时间:2018-10-02 14:51:16

标签: r ggplot2 facet-grid

使用ggplotfacet_grid,我想通过箱形图可视化两个平行的值向量。我的可用数据:

DF <- 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

我想为每个向量(数据帧中的value和value2)绘制一个并行的箱形图。然后,对于每个彩色箱线图,我想有两个箱线图,一个用于 value ,另一个用于 value2

2 个答案:

答案 0 :(得分:1)

除了上面我链接到的那篇文章,我认为可能已经有一篇文章解决了。但这是两件事的问题:1)将数据转换为ggplot期望的格式,即长形,因此存在可以映射到美学的值,以及2)关注点分离,因为您可以使用{ {1}}或(最新的)reshape2函数可将数据获取为适当的形状,而tidyr函数可将其绘制出来。

您可以使用ggplot2获取较长的数据,并方便地将其直接传输到tidyr::gather中。

ggplot

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

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

ggplot

同样,由于某些通用列名,我不确定是否要使用所需的设置-就像我不知道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与{{ 1}} / value2。您可能需要相应地交换AAAAAAA分配。

答案 1 :(得分:0)

您必须重塑数据框。使用附加的指示符(列)来定义值的类型(例如“ value_type”),并且仅定义一个值列。然后,指标将值匹配到相应的值类型。以下代码将重塑您的示例:

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:

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")