Как нарисовать красивую стрелку в ggplot2

Я создаю диаграмму ggplot, где я хочу иметь несколько стрелок между двумя точками. Основная задача легко выполняется с помощью geom_line(arrow = arrow()). Тем не менее, я хочу иметь несколько "красивых" толстых стрел. Изменение размера стрелки с помощью size= не помогает, так как оно полностью разрушает головку стрелки. Я иллюстрирую свои проблемы:

Создайте образцы данных и график:

 NAME <- c("A", "A", "B", "B", "C", "C")
 YEAR <- c(2016, 2011, 2016, 2011, 2016, 2011)
 YEAR <- as.factor(YEAR)
 VALUE <- c(1, 4, 1, 5, 2, 8)
 DATA <- data.frame(NAME, YEAR, VALUE)

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed"))

Полученный сюжет выглядит следующим образом:

plot1

Теперь я попытался "сгустить" стрелки...

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_line(arrow = arrow(length=unit(0.30,"cm"), ends="first", type = "closed"), size = 3)

Это результат, показанный здесь:

plot2

Мой вопрос: есть ли способ нарисовать какие-то "красивые" толстые стрелки?

Ответы

Ответ 1

Я обычно использую geom_segment для создания стрелки. Но для этого нам нужно изменить данные с "длинного" на "широкий" формат (обычно используя dcast из reshape2 или data.table). Но на этот раз я попытался использовать base reshape функцию.

ggplot(DATA, aes(x=VALUE, y=NAME)) + 
  geom_point(size=5, aes(colour=YEAR)) +
  geom_segment(data = reshape(DATA, v.names="VALUE", idvar = "NAME", timevar = "YEAR", direction = "wide"),
               aes(x=VALUE.2011, xend=VALUE.2016, y=NAME, yend=NAME), size = 2,
               arrow = arrow(length = unit(0.5, "cm")))

arrow.segment

РЕДАКТИРОВАТЬ. Я обнаружил, что тот же самый вопрос относится к стрелкам "закрытого типа". На данный момент попробуйте сохранить график в виде векторного графа (pdf или svg, используя ggsave или меню "Экспорт" на вкладке "Графики" ). Результат не "грязный".

svg

Ответ 2

В последнем (и я имею в виду devtools::install_github("tidyverse/ggplot2") последний, начиная с написания этого ответа - я уверен, что они скоро это подтвердят) версии ggplot2, есть аргумент linejoin для geom_segment, Использование linejoin='mitre' обеспечит четкие края. Подробнее см. ниже.