水平ggplot2 :: geom_violin没有coord_flip

Ben*_*ker 9 r ggplot2

我想绘制水平小提琴图(因为我的标签很长).我的设计限制是:

  • 多个facets(f1),每个facet(f2)的多个类别(所以我想使用aes(x=f2)facet_wrap(~f1)
  • 每个方面不同的尺度(所以我想scales="free")
  • 我想安排的4个不同方面facet_wrap()(排除一些切面技巧)

不幸的是scales="free",coord_flip()目前(并且在可预见的未来)不兼容.

这个相关问题的答案表明(1)黑客攻击一个新的水平地貌; (2)交换xy(正如所指出的那样,它只适用于散点图等对称的geoms); (3)放弃和继续传统的布局.

想法?

set.seed(101)
library("plyr")
dd <- expand.grid(f1=factor(1:2),
     f2=paste("inconveniently long label",1:2))
dd2 <- ddply(dd,c("f1","f2"),
             function(x)
                 data.frame(y=rnorm(100,
                         mean=10*(as.numeric(x$f2)), 
                         sd=10^(as.numeric(x$f1)))))
library("ggplot2")
Run Code Online (Sandbox Code Playgroud)

我的选择似乎是(1)带有scale="free"不方便的(横向)标签:

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

(2)有coord_flip(),不方便的尺度

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1)+geom_violin()+coord_flip()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

尝试两个(ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin()+coord_flip())给出

ggplot2目前不支持使用非笛卡尔坐标或coord_flip的自由音阶.

其他想法:

  • 某些geoms(geom_errorbarh)有明确的水平版本; 我可以自己破解geom_violinh......
  • 在ggplot2的pull请求中有一些关于水平geoms的讨论
  • 这个(相当古老的)示例使用facet + geom_ribbon()来破解小提琴情节,但是它使用了分面,使其与facet_wrap()

对于它的价值,这就是我的真实情节(目前):

在此输入图像描述

Ben*_*ker 5

这现在可以通过新的(2016 年 1 月)ggstance 包来完成,它提供了各种几何体的水平版本。

## if necessary
devtools::install_github("lionel-/ggstance")
## ... data generation stuff from above
require("ggplot2")
require("ggstance")
ggplot(dd2,aes(y=f2,x=y))+facet_wrap(~f1,scale="free")+
    geom_violinh()
Run Code Online (Sandbox Code Playgroud)


Her*_*oka 4

不确定这是否有帮助,但这是我们“破解”垂直小提琴的答案的改编。

dd2_violin <- ddply(dd2,.(f1,f2),function(chunk){
  d_y <- density(chunk$y)
  top_part <- data.frame(x=d_y$x, y=d_y$y)
  bottom_part <- top_part[nrow(top_part):1,]
  bottom_part$y <- 0 - bottom_part$y
  return(rbind(top_part,bottom_part))
})
#weird trick to get spacing right
dd2_violin$y2 <- as.numeric(dd2_violin$f2)*(2*max(dd2_violin$y))+dd2_violin$y

p1 <- ggplot(dd2_violin, aes(x=x,y=y2,group=interaction(f1,f2))) + geom_path()
#apply same weird trick to get labels

p1 + facet_grid(~f1,scales="free")+labs(x="y")+
scale_y_continuous(breaks=unique(as.numeric(dd2_violin$f2)*(2*max(dd2_violin$y))),labels=unique(dd2_violin$f2))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述