【发布时间】:2020-12-22 00:07:59
【问题描述】:
我可能遇到了一种罕见的情况,我想使用R's ggplot2's geom_violin + geom_boxplot 绘制几个组的值,填充和着色小提琴按组,并按组着色框。有时,一个或多个组的值少于三个,例如:
set.seed(1)
df <- data.frame(group = c(rep("A",100),rep("B",100),rep("C",2),"D"),
value = c(rnorm(100,1,1), rnorm(100,2,1), rnorm(2,3,1), rnorm(1,1,1)))
我的ggplot2 代码是:
library(ggplot2)
ggplot(df,aes(x=group,y=value)) +
geom_violin(aes(fill=group,color=group),alpha=0.3) +
geom_boxplot(width=0.1,aes(color=group),fill=NA) +
theme_minimal() + ylab("Value") + theme(legend.title=element_blank(),axis.ticks.x=element_blank(),axis.text.x=element_blank(),axis.title.x=element_blank())
不受欢迎的行为是图例被分成两部分,我想这是因为 C 组和 D 组由于分数不足而不能用小提琴表示。
将组 C 和 D 的点数增加到 3 可以使用相同的代码提供所需的行为:
set.seed(1)
df <- data.frame(group = c(rep("A",100),rep("B",100),rep("C",3),rep("D",3)),
value = c(rnorm(100,1,1), rnorm(100,2,1), rnorm(3,3,1), rnorm(3,1,1)))
df$group <- factor(df$group, levels = c("A","B","C","D"))
我的问题是是否可以强制我的 ggplot2 代码始终给出一个图例,就像在第二个示例中一样,即使组的点数是一个。
我知道我可以通过为这些组添加伪计数来人为地夸大这些组,但在这种情况下我宁愿忠实于数据。
【问题讨论】:
-
添加自定义比例填充,然后隐藏小提琴的图例。
-
一个选项是设置填充的限制,例如
scale_fill_discrete(limits = unique(df$group) )。我一直认为这类问题是drop = FALSE可以解决的问题,但它似乎不在这里。
标签: r ggplot2 violin-plot