ggplot2 - разделение рамок меток по цветам - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать коробочную диаграмму с метками для некоторых индивидуальных данных.График блока разделен двумя переменными, сопоставленными с 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

enter image description here

Как вы можете видеть, этикетки имеют цветовую кодировку, но все они выстроены вокруг центракаждая пара участков, а не разделены участками.Я пробовал nudge_x, но это объединяет все метки.Можно ли как-нибудь переместить каждый набор меток по отдельности?

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

enter image description here

1 Ответ

0 голосов
/ 31 мая 2018

Похоже, 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)

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

...