将R中的小提琴图和箱线图结合在一起,使填充仅对箱线图有所不同。

7

好的,我想要将小提琴图和白盒图一起绘制,但我的数据有点棘手。我从一个具有多列的数据框中融合了数据,每个列都有对应于两个水平因子的值,以下是我的数据近似值:

library(ggplot2)
library(reshape2)

dat <- list(
  A = rbind(
    data.frame(group = "1",
               vals = rnorm(500)),
    data.frame(group = "2",
               vals = rnorm(100))
  ),
  B = rbind(
    data.frame(group = "1",
               vals = rnorm(500)),
    data.frame(group = "2",
               vals = rnorm(100))
  ),
  C = rbind(
    data.frame(group = "1",
               vals = rnorm(500)),
    data.frame(group = "2",
               vals = rnorm(100))
  )
)

dat.melt <- melt(dat)

我能找到的最好的方法是手动设置填充,但它会影响小提琴图和箱线图的填充:
dodge <- position_dodge(width = 1)

p <- ggplot(dat.melt, aes(x = L1, y = value, fill = group))+
  geom_violin(position = dodge)+
  geom_boxplot(width = 0.3,
                 position = dodge,
                 outlier.shape = NA)+
  scale_fill_manual(values=c("white", "white"))

图示

我能否只将箱线图设为白色而不是小提琴图?

附:如何只为小提琴图添加图例而不显示箱线图的图例?

2个回答

8

试试这个:

p <- ggplot(dat.melt, aes(x = L1, y = value)) +
  geom_violin(aes(fill = group), position = dodge) +
  geom_boxplot(aes(group=interaction(group,L1)), 
            width=0.3, fill="white", position=dodge,
            outlier.shape=NA)
print(p)

enter image description here


你使用的ggplot版本是哪个?我在ggplot2_2.2.1中遇到了以下错误:Error in layer(data = data, mapping = mapping, stat = stat, geom = GeomViolin, : object 'dodge' not found - Roman
我已经尝试过了。但是图形看起来并不像预期的那样。使用 position = position_dodge(width = 1) 取得了成功...很奇怪。 - Roman
2
@Jimbou,你之所以出现这个错误是因为你没有设置 dodge <- position_dodge(width = 1) - Poiu Rewq

2
您也可以尝试这个方法:
ggplot(dat.melt, aes(x = L1, y = value, fill=group))+
  geom_violin(position = position_dodge(width = 1)) +
  geom_boxplot(data = dat.melt, 
               aes(x = L1, y = value, col=group), fill="white", 
               position = position_dodge(width = 1), width=0.3,outlier.shape=NA)+
  geom_boxplot(position = position_dodge(width = 1), alpha=0, width=0.3)

enter image description here


这恰好是我想要的相反情况。Marco提供了最合适的答案。请注意interaction()的使用。 - Poiu Rewq
@PoiuRewq 我试图避免交互。请看我的编辑。使用这种方法也可以得到白框。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接