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

В настоящее время мой код выглядит так (упрощенно):

ggplot(data, aes(x = var1, y = var2) +
   geom_point(aes(size = var3)) +
   geom_text(aes(label = var3))

Результатом является это

2

Но я пытаюсь добиться чего-то вроде этого:

1

Есть ли способ добиться этого простым способом?

Спасибо.

РЕДАКТИРОВАТЬ: Я пытаюсь сделать расстояние между границей geom_point и границей меток фиксированным значением.

2
Roan 20 Янв 2021 в 18:54

3 ответа

Лучший ответ

Надеюсь, это достаточно отличается, чтобы заслужить еще один ответ. Признаюсь, я упустил из виду то, что именно вы хотели разместить на этикетках. Так что в основном вы хотите, чтобы это происходило не относительно центра точки, а по радиусу.

Мне очень ностальгически напомнили о моем самом первом вопросе в этом сообществе, о котором я признаю, не понимал его ответа очень давно.

Основная идея состоит в том, чтобы не использовать geom_point , а использовать ggforce :: geom_circle (или: geom_ellipse). Вы можете использовать радиус, который вы используете для создания, для размещения ваших этикеток. Это требует жесткого кодирования, но я уверен, что есть способы программно определить радиус на основе ваших общих координат.

library(ggplot2)
library(ggforce)

foo <- data.frame(var1 = rep(1:3, 2),  var2 =rep(1:2, each = 3),
                   var3 = c(3, 10, 2, 1, 1, 10))
# Create cuts - you can also assign other values of course. factor of 0.01 was chosen randomly. 
foo$rad <- 0.01 * findInterval(foo$var3, 1:5)

ggplot(foo) +
  geom_circle(aes(x0 = var1, y0 = var2, r = rad),
              fill = "Grey50") +
  geom_text(aes(x = var1, y = var2 - rad - 0.03, label = var3)) +
  coord_equal()

Создано 2021-01-20 пакетом REPEX (v0.3.0)

1
tjebo 20 Янв 2021 в 23:09

Используйте nudge

Спасибо Руи за данные. +1

library(ggplot2)
data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3), nudge_y = -0.1 )

Создано 2021-01-20 пакетом REPEX (v0.3.0)

2
tjebo 20 Янв 2021 в 17:08

Проблема может быть решена путем масштабирования size и добавления его к расстоянию vjust до точек.

library(ggplot2)

ggplot(data, aes(x = var1, y = var2)) +
  geom_point(aes(size = var3), show.legend = FALSE) +
  geom_text(aes(label = var3, vjust = 1.5 + 0.1 * var3))

enter image description here

Тестовые данные

data <- data.frame(var1 = factor(rep(1:3, 2)),
                   var2 = factor(rep(1:2, each = 3)),
                   var3 = c(3, 10, 2, 1, 1, 10))
2
Rui Barradas 20 Янв 2021 в 16:11