21

我正在尝试在 ggplot 上使用 position_dodge 来获取共享相同类别(cat)的两个不同信号(ind)的箱线图。当有一个类别包含一个信号的数据但另一个信号没有数据时,包含数据的信号的箱线图覆盖所有水平间距,并且不遵守该特定类别的 position_dodge 指令。有没有办法让 ggplot 强制执行躲闪规则?正如您在下面的示例中看到的,信号 x 没有 B 类数据,因此它失去了 position_dodge 保留的空间。我想避免这种情况。

提前致谢。

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
                 values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
                 ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))

print(ggplot() +
        scale_colour_hue(guide='none') +
      geom_boxplot(
           aes(x=as.factor(cat), y=values, 
               fill=ind), 
           position=position_dodge(width=.60), 
           data=data,
           outlier.size = 1.2,
           na.rm=T))

有原始问题的图

进度更新

经过一些解决方法后,我想出了我正在寻找的结果......(有点)

data            <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

p  <- ggplot() +
      scale_colour_hue(guide='none') +
      geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
      position=position_dodge(width=.60), 
      data=data,
      outlier.size = 1.2,
      na.rm=T) +
      geom_line(aes(x=x, y=y), 
                data=data.frame(x=c(0,3),y=rep(0,2)), 
                size = 1, 
                col='white')
print(p)

解决方法

有些人建议使用刻面来获得我想要的效果。刻面并没有给我想要的效果。我正在寻找的最终图表如下所示:

最终图

如果您注意到,y = 10 处的白色主刻度线比其他刻度线厚。这条较粗的线是 size=1 的 geom_line,它隐藏了不需要的箱线图。

我希望我们可以更无缝地组合不同的几何对象。我在 Hadley 的 github 上将此报告为一个错误,但 Hadley 说这是 position_dodge 的设计行为。我想我正在以非标准方式使用 ggplot2,解决方法是解决这类问题的方法。无论如何,我希望这有助于一些 R 人进一步推动 ggplot 强大的功能。

4

3 回答 3

3

经过一些解决方法后,我想出了我正在寻找的结果......(有点)

data            <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

p  <- ggplot() +
      scale_colour_hue(guide='none') +
      geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
      position=position_dodge(width=.60), 
      data=data,
      outlier.size = 1.2,
      na.rm=T) +
      geom_line(aes(x=x, y=y), 
                data=data.frame(x=c(0,3),y=rep(0,2)), 
                size = 1, 
                col='white')
print(p)

解决方法

有些人建议使用刻面来获得我想要的效果。刻面并没有给我想要的效果。我正在寻找的最终图表如下所示:

最终图

如果您注意到,y = 10 处的白色主刻度线比其他刻度线厚。这条较粗的线是 size=1 的 geom_line,它隐藏了不需要的箱线图。

我希望我们可以更无缝地组合不同的几何对象。我在 Hadley 的 github 上将此报告为一个错误,但 Hadley 说这是 position_dodge 的设计行为。我想我正在以非标准方式使用 ggplot2,解决方法是解决这类问题的方法。无论如何,我希望这有助于一些 R 人进一步推动 ggplot 强大的功能。

于 2012-10-15T13:43:00.427 回答
2

B 的 x 没有值,因此您可以添加“B”、0、“x”,这基本上表明 B 的 x 没有“值”分布。中位数和其他百分位数为零。

 data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
             values=c(3,2,1,4,NA,NA,4,5,6,7,8,9,0), 
             ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

此外,您不必在此处添加位置参数,因为当您将 x 视为一个因素时, ggplot -- geom_boxplot 将自动闪避到两侧。

print(ggplot() +
  scale_colour_hue(guide='none') +
  geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
  data=data,
  outlier.size = 1.2,
  na.rm=T))

于 2012-10-10T06:02:05.277 回答
2

我刚刚从 Hadley 在他的 git站点上发布的评论中获得了使用 faceting 的线索,因此归功于 ggplot2 包的维护者 Hadley!

看看这是不是你想要的。要了解有关在此图中设置胡须和其他选项的更多信息,请查看 ggplot2 包中的此帮助页面:

?stat_boxplot

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
             values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
             ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))

p <- ggplot(data = data, aes(factor(cat), values))                     
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) +  facet_grid(.~ind)

在此处输入图像描述

要为您的情节添加颜色,在我看来这是多余的,因为您已经根据“ind”变量来处理情节,试试这个:

p <- ggplot(data, aes(factor(cat), values, fill = ind))                     
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind)

在此处输入图像描述

于 2012-10-12T23:50:28.353 回答