Подтвердить что ты не робот

Ggrepel: отталкивание текста только в одном направлении и возврат значений отталкиваемого текста

У меня есть набор данных, где каждая точка данных имеет значение x, которое ограничено (представляет собой фактический экземпляр количественной переменной), y-значение, которое является произвольным (существует просто, чтобы обеспечить измерение для распространения текста) и ярлык. Мои наборы данных могут быть очень большими, и часто бывает перекрытие текста, даже когда я стараюсь как можно больше распространять данные по оси y.

Следовательно, я пытаюсь использовать новый ggrepel. Тем не менее, я стараюсь, чтобы текстовые метки были ограничены в их позиции x-значения, но только позволяли им отталкиваться друг от друга в направлении y.

В качестве примера приведенный ниже код создает график для 32 точек данных, где x-значения показывают количество цилиндров в автомобиле, а значения y определяются случайным образом (не имеют смысла, но для обеспечения второго измерения для целей построения текста). Без использования ggrepel в тексте есть значительное совпадение:

library(ggrepel)
library(ggplot2)
set.seed(1)
data = data.frame(x=runif(100, 1, 10),y=runif(100, 1, 10),label=paste0("label",seq(1:100)))
origPlot <- ggplot(data) +
  geom_point(aes(x, y), color = 'red') +
  geom_text(aes(x, y, label = label)) +
  theme_classic(base_size = 16)

Оригинальный сюжет

Я могу исправить перекрытие текста с помощью ggrepel, как показано ниже. Однако это изменяет не только значения у, но и значения х. Я стараюсь избегать изменения значений х, поскольку они представляют фактический физический смысл (количество цилиндров):

repelPlot <- ggplot(data) +
  geom_point(aes(x, y), color = 'red') +
  geom_text_repel(aes(x, y, label = label)) +
  theme_classic(base_size = 16)

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

В качестве примечания, причина, по которой я не могу позволить изменить значение x текста, заключается в том, что я только рисую текст (а не точки). В то время как кажется, что большинство примеров в ggrepel сохраняют положение точек (так что их значения остаются верными) и только отталкивают значения x и y меток. Затем точки и связаны с метками с сегментами (вы можете видеть это в моем примере второго примера).

Я сохранил точки в двух примерах выше для демонстрационных целей. Тем не менее, я сохраняю только текст (и, следовательно, удаляю точки и сегменты), оставляя мне что-то вроде этого:

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0) + theme_classic(base_size = 16)

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

Мой вопрос в два раза:

1) Можно ли отталкивать текстовые метки только в направлении y?

2) Возможно ли получить структуру, содержащую новые (отталкиваемые) y-значения текста?

Спасибо за любой совет!

4b9b3361

Ответ 1

ggrepel version 0.6.8 (Установить с GitHub с помощью devtools:: github_install) теперь поддерживает аргумент "direction", который позволяет отталкивать метки только в направлении "x" или "y".

repelPlot2 <- ggplot(data) + geom_text_repel(aes(x, y, label = label), segment.size = 0, direction = "y") + theme_classic(base_size = 16)

Получение значений y сложнее - одним из подходов может быть использование функции repel_boxes от ggrepel для получения отталкиваемых значений, а затем ввода их в ggplot с помощью geom_text. Для обсуждения и примера кода этого подхода см. https://github.com/slowkow/ggrepel/issues/24. Обратите внимание, что при использовании последней версии функция repel_boxes теперь также имеет аргумент "direction", который принимает значения "both", "x" или "y".

Ответ 2

Я не думаю, что можно отталкивать текстовые метки только в одном направлении с помощью ggrepel.

Я бы применил эту проблему по-другому, вместо этого создавая произвольные позиции оси y вручную. Например, для набора данных в вашем примере вы можете сделать это, используя следующий код.

Я использовал пакет dplyr для группировки данных, установленных значениями x, а затем создал новый столбец данных y, содержащий номера строк в каждой группе. Номера строк затем используются как значения для оси y.

library(ggplot2)
library(dplyr)

data <- data.frame(x = mtcars$cyl, label = paste0("label", seq(1:32)))

data <- data %>% 
  group_by(x) %>% 
  mutate(y = row_number())

ggplot(data, aes(x = x, y = y, label = label)) + 
  geom_text(size = 2) + 
  xlim(3.5, 8.5) + 
  theme_classic(base_size = 8)

ggsave("filename.png", width = 4, height = 2)

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