Как нарисовать красивую стрелку в 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'
обеспечит четкие края. Подробнее см. ниже.