【问题标题】:R geom_violin + geom_boxplot legend issuesR geom_violin + geom_boxplot 图例问题
【发布时间】: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


【解决方案1】:

您只需指定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())

【讨论】:

  • 非常感谢@Allan Cameron。添加:scale_fill_manual(limits = c("A", "B", "C", "D"), values = scales::hue_pal()(4), drop = FALSE) 不是更安全吗?
  • @dan 不是它已经拥有的吗?你的意思是scale_color_manual
  • 是的,很抱歉这个错误,感谢您的纠正
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2019-02-08
  • 2019-09-15
  • 2020-07-15
相关资源
最近更新 更多