ggplot2 - разделение меток коробчатой ​​диаграммы по цвету

Я пытаюсь создать диаграмму с метками для некоторых отдельных данных. Блочная диаграмма разделена двумя переменными, сопоставленными с x и цветом. Однако, когда я добавляю метки с помощью geom_text_repel из пакета ggrepel (необходимого для реальных данных), они разделяются по 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

введите здесь описание изображения

Как видите, метки имеют цветовую кодировку, но все они выстроены вокруг центра каждой пары графиков, а не разделены графиками. Я пробовал nudge_x, но он перемещает все метки вместе. Есть ли способ перемещать каждый набор меток по отдельности?

Для сравнения вот график моего полного набора данных с помеченными выбросами - вы можете видеть, что каждый набор меток не сосредоточен вокруг точек, которые он помечает, что усложняет интерпретацию:

введите здесь описание изображения


person Lucy Wheeler    schedule 31.05.2018    source источник
comment
Вы назначили цвет вне aes в geom_text_repel; он должен войти внутрь, чтобы быть сопоставленным с эстетическим   -  person camille    schedule 31.05.2018
comment
У вас также отсутствует запятая в этой строке   -  person camille    schedule 31.05.2018
comment
Спасибо, что заметили опечатку @camille - сейчас я ее исправил.   -  person Lucy Wheeler    schedule 31.05.2018
comment
Круто, а теперь попробуйте присвоить тексту position = "dodge". Блочные диаграммы уклоняются автоматически — в противном случае они просто находились бы друг над другом — но текст не обязательно   -  person camille    schedule 31.05.2018
comment
Это вызвало ошибку, но мне удалось заставить ее работать с position = position_dodge(width = 0.9). Спасибо за помощь! Если вы хотите представить это как ответ, я могу принять его и дать вам репутацию.   -  person Lucy Wheeler    schedule 31.05.2018


Ответы (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, поэтому я повторил график с 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, чтобы сделать их отчетливыми (но также довольно уродливыми).

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_color_discrete(l = 30) +
  scale_fill_discrete(l = 100)

Обратите внимание, что вы также можете настроить силу, используемую при отталкивании, поэтому, если вам нужно, чтобы метки не перекрывались, а также прижимались ближе к середине коробчатых диаграмм, вы также можете поиграть с этой настройкой.

person camille    schedule 31.05.2018