我想绘制水平小提琴图(因为我的标签很长)。我的设计限制是:
f1
),每个方面有多个类别(f2
)(所以我想使用aes(x=f2)
和facet_wrap(~f1)
scales="free"
)facet_wrap()
安排4个不同的方面(排除一些切面技巧)不幸的是,scales="free"
和coord_flip()
目前(并且在可预见的将来)不兼容。
这个related question的答案表明(1)黑客攻击了一个新的水平地貌; (2)交换x
和y
(正如所指出的那样,它只适用于散点图等对称的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()
(2)coord_flip()
,不方便的比例
ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1)+geom_violin()+coord_flip()
尝试两者(ggplot(dd2,aes(x=f2,y=y))+facet_wrap(~f1,scale="free")+geom_violin()+coord_flip()
)给出
ggplot2目前不支持使用非笛卡尔坐标或coord_flip的免费比例。
其他想法:
geom_errorbarh
)有明确的水平版本;我可以破解我自己的geom_violinh
... geom_ribbon()
来破解小提琴情节,但会耗尽分面,使其与facet_wrap()
对于它的价值,这就是我的真实情节(目前):
答案 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))
答案 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()