ggplot2 - 按颜色分隔框图标签

时间:2018-05-31 12:09:43

标签: r ggplot2 ggrepel

我正在尝试使用某些单个数据的标签创建一个箱形图。箱形图由两个变量分隔,映射到x和颜色。然而,当我使用ggrepel包中的geom_text_repel添加标签时(真实数据是必需的),它们用x而不是颜色分开。请参阅此可重复性最小的示例:

library(ggplot2)
library(ggrepel)

## create dummy data frame
rep_id <- c("a", "a", "b", "b", "c", "c", "d", "d", "e", "e")
dil <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
bleach_time <- c(0, 24, 0, 24, 0, 24, 0, 24, 0, 24)
a_i <- c(0.1, 0.2, 0.35, 0.2, 0.01, 0.4, 0.23, 0.1, 0.2, 0.5)
iex <- data_frame(rep_id, dil, bleach_time, a_i)
rm(rep_id, dil, bleach_time, a_i)

## Plot bar chart of a_i separated by bleach_time and dil
p <- ggplot(iex, aes(x = as.character(bleach_time), y = a_i, fill = as.factor(dil))) +
geom_boxplot() +
geom_text_repel(aes(label = rep_id, colour = as.factor(dil)), na.rm = TRUE, segment.alpha = 0)

p

enter image description here

正如您所看到的那样,标签是彩色编码的,但它们都围绕着每对图的中心排列,而不是用图分隔。我尝试过nudge_x,但是将所有标签组合在一起。有没有办法可以单独移动每组标签?

为了比较,这里是我的完整数据集与标记的异常值的关系图 - 你可以看到每组标签不是以它标记的点为中心,使解释复杂化:

enter image description here

1 个答案:

答案 0 :(得分:1)

看起来geom_text_repel需要position = position_dodge(width = __),而不仅仅是我建议的position = "dodge"简写,因此错误。您可以设置宽度; 0.7看起来对我好。

library(tidyverse)
library(ggrepel)

ggplot(iex, aes(x = as.character(bleach_time), y = a_i, fill = as.factor(dil))) +
  geom_boxplot() +
  geom_text_repel(aes(label = rep_id, colour = as.factor(dil)), na.rm = TRUE, 
    segment.alpha = 0, position = position_dodge(width = 0.7))

由于您正在绘制分布,因此沿y轴保持位置相同可能很重要,并且只允许geom_text_repel沿x轴抖动,所以我用{{重复绘图。 1}},这让我发现了一些有趣的东西......

direction = "x"

有几个文字因为它们与箱形图的填充颜色相同而被遮盖了!您可以使用更好的颜色+填充调色板组合来解决此问题。我做的快速修复就是调低颜色的亮度,调高ggplot(iex, aes(x = as.character(bleach_time), y = a_i, fill = as.factor(dil))) + geom_boxplot() + geom_text_repel(aes(label = rep_id, colour = as.factor(dil)), na.rm = TRUE, segment.alpha = 0, position = position_dodge(width = 0.7), direction = "x") 调用中填充的亮度,使它们区别(但也非常难看)。

scale_*_discrete

请注意,你也可以调整击退时使用的力,所以如果你需要标签不重叠但是也要靠近箱形图的中间位置,那么你也可以使用该设置。