R geom_violin + geom_boxplot图例问题

问题描述

我可能遇到了一种罕见的情况,即我具有要使用R的{​​{1}}的{​​{1}} + {{1 }},按组填充和着色小提琴,并按组着色盒子。有时,一个或多个组的值小于三个,例如:

ggplot2

我的geom_violin代码是:

geom_Boxplot

在此示例中给出:

enter image description here

不希望的行为是将图例分成两部分,我想这是因为C和D组由于点数不足而无法用小提琴表示。

将C和D组的点数增加到3可使用相同的代码获得所需的行为:

set.seed(1)

df <- data.frame(group = c(rep("A",100),rep("B",rep("C",2),"D"),value = c(rnorm(100,1,1),rnorm(100,2,rnorm(2,3,rnorm(1,1)))

enter image description here

我的问题是,是否可以强迫我的ggplot2代码始终给出单个图例,如第二个示例中所示,即使组中的点数为一。

我知道我可以通过为这些组添加伪计数来人为地增加这些组的数量,但是在这种情况下,我宁愿忠实于数据。

解决方法

您只需指定limits即可包含所有级别:

library(ggplot2)

ggplot(df,aes(x = group,y = value)) + 
  geom_violin( aes(color = group,fill = group),alpha = 0.3) +
  geom_boxplot(aes(color = group),fill = NA,width = 0.1) +
  scale_fill_manual(limits = c("A","B","C","D"),values = scales::hue_pal()(4),drop   = FALSE) +
  ylab("Value") + 
  theme_minimal() + 
  theme(legend.title = element_blank(),axis.ticks.x = element_blank(),axis.text.x  = element_blank(),axis.title.x = element_blank())

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...