水平ggplot2 :: geom_violin没有coord_flip

时间:2016-01-06 21:43:59

标签: r ggplot2

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

  • 多个方面(f1),每个方面有多个类别(f2)(所以我想使用aes(x=f2)facet_wrap(~f1)
  • 每个方面有不同的比例(所以我想要scales="free"
  • 我希望通过facet_wrap()安排4个不同的方面(排除一些切面技巧)

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

这个related question的答案表明(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")

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

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin()

enter image description here

(2)coord_flip(),不方便的比例

ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1)+geom_violin()+coord_flip()

enter image description here

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

  

ggplot2目前不支持使用非笛卡尔坐标或coord_flip的免费比例。

其他想法:

  • 某些geoms(geom_errorbarh)有明确的水平版本;我可以破解我自己的geom_violinh ...
  • pull request on ggplot2
  • 中有关于水平geoms的讨论
  • This (rather old) example使用facet + geom_ribbon()来破解小提琴情节,但会耗尽分面,使其与facet_wrap()
  • 不相容

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

enter image description here

2 个答案:

答案 0 :(得分:4)

不确定这是否有帮助,但它是this答案的改编版,我们“砍掉”垂直小提琴。

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

enter image description here

答案 1 :(得分:4)

现在可以使用新的(2016年1月){{3}}来完成,它提供各种geoms的水平版本。

## 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()