Создайте стрелку на северо-запад с помощью ggplot

Я использую 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 :-(

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


person Dan Chaltiel    schedule 06.02.2020    source источник
comment
Вы устанавливаете ends = "first", поэтому начальная точка имеет стрелку. Разве это не то, что вы хотели?   -  person camille    schedule 06.02.2020
comment
@camille да, это то, что я хотел. Установка последнего значения сделает стрелку на северо-восток, что не является моей целью.   -  person Dan Chaltiel    schedule 06.02.2020
comment
Кажется, что annotation_custom не очень хорошо подходит к ситуации, поскольку вы привязаны к xmin и xmax, которые не будут учитывать желаемое направление. annotate("segment") может работать лучше, так как x и xend подразумевают направление. С двумя наборами координат, которые у вас есть, первый указывает на юго-запад, а второй указывает на северо-запад, верно?   -  person camille    schedule 06.02.2020
comment
@camille отлично, это творит чудеса! Не могли бы вы скопировать это в ответ, чтобы я мог закрыть этот вопрос как принятый?   -  person Dan Chaltiel    schedule 07.02.2020


Ответы (1)


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

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)

person camille    schedule 07.02.2020
comment
Цель состояла в том, чтобы поместить аннотацию в виде серого квадрата на другом конце стрелки. Очень красиво смотрится на моем участке! - person Dan Chaltiel; 07.02.2020
comment
Хорошо, теперь это имеет смысл. Если вам нужно сделать что-то еще с координатами стрелок, может быть полезно поместить их во фрейм данных. - person camille; 07.02.2020