Создайте стрелку северо-запада с помощью ggplot - PullRequest
0 голосов
/ 06 февраля 2020

Я использую annotation_custom, чтобы создать собственную легенду со стрелками.

К сожалению, все стрелки имеют наклон вниз (в направлении юго-запада или северо-востока), и я стремлюсь к сделайте стрелку вверх (в направлении на северо-запад).

Вот воспроизводимый пример:

library(ggplot2)
library(grid)
x=ggplot() +
  geom_blank() +
  geom_rect(aes(xmin=1, xmax=2,
                ymin=1, ymax=2)) +
  coord_fixed(clip="off") #a plain old nice grey rectangle

my_arrow = linesGrob(arrow=arrow(type="open", ends="first", length=unit(4,"mm")))
x + annotation_custom(my_arrow, xmin=1.5,xmax=2.2, ymin=1.5,ymax=1.25) #South-West :-)
x + annotation_custom(my_arrow, xmin=1.5,xmax=2.2, ymin=1.25,ymax=1.5) #Also South-West :-(

Как я могу построить такую ​​стрелу?

1 Ответ

0 голосов
/ 07 февраля 2020

annotation_custom кажется привязанным к минимальным и максимальным координатам, как если бы вы получали прямоугольники или изображения. Чтобы стрелка имела смысл, ей нужно что-то интерпретировать как направление. Я переключаюсь на annotate с сегментом geom и сохраняю стрелку для повторного использования.

my_arrow <- arrow(type = "open", ends = "first", length = unit(4, "mm"))

x +
  annotate("segment", x = 1.5, xend = 2.2, y = 1.5, yend = 1.25, arrow = my_arrow) +
  annotate("segment", x = 1.5, xend = 2.2, y = 1.25, yend = 1.5, arrow = my_arrow)

Поскольку annotate не имеет data аргумент, вы не можете (AFAIK) отображать переменные фрейма данных с помощью aes, но вы можете дать ему векторы, чтобы сжать их в один вызов.

x +
  annotate("segment", x = 1.5, xend = 2.2, y = c(1.5, 1.25), yend = c(1.25, 1.5), arrow = my_arrow)
# same output

Изменить, чтобы добавить: на основе комментария, возможно, имеет смысл поместить координаты сегмента во фрейм данных, чтобы вы также могли обращаться к ним для размещения меток.

coords <- tibble::tribble(
  ~x,  ~xend, ~y,   ~yend, ~lbl,
  1.5, 2.2,   1.5,  1.25,  "Still a square",
  1.5, 2.2,   1.25, 1.5,   "This is a square"
)

x +
  annotate("segment", x = coords$x, xend = coords$xend, y = coords$y, yend = coords$yend, arrow = my_arrow) +
  geom_text(aes(label = lbl, x = xend, y = yend), data = coords, hjust = 0)

...