2016-06-24 2 views
15

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

Создать некоторые образцы данных и сюжет:

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

Мой вопрос: Есть ли способ построить некоторые «красивые» толстые стрелки?

+0

Изменить угол и увеличить длину стрелки? –

+0

Попробуйте сыграть с различными аргументами: 'linetype' (может сделать строку пунктирной пунктирной и т. Д.),' Длина стрелки' и т. Д. – rar

+0

Связанный: http://stackoverflow.com/questions/20658071/specifying-gpar-settings-for- grid-arrows-in-r - к сожалению, ответ - это небольшая охота за мусорщиком (я не знаю, почему он не опубликовал полностью измененные функции). Кроме того, я не знаю, относится ли это также к новым версиям ggplot. – lukeA

ответ

7

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

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

EDIT: Я только что узнал, что то же вопрос относится к "закрытой" стрелке типа. На данный момент попробуйте сохранить график в виде векторного графа (pdf или svg, используя ggsave или меню «Экспорт» на вкладке «Графики»). Результат не «грязный».

svg

+0

спасибо - хорошая точка. однако, это работает только при использовании «открытых» стрелок - использование «закрытых» тоже приводит к беспорядку ... 'ggplot (DATA, aes (x = VALUE, y = NAME)) + geom_point (размер = 5, aes (color = 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, стрелка = стрелка (длина = единица (0,5, "см"), тип = "закрыто")) ' –

+2

@Seba, беспорядок, вы имеете в виду, что вам не нравится закругленная стрелка? Если это так, после построения графика вы можете сделать сетку grid.force().gedit («сегменты», gp = gpar (linejoin = 'miter')) '(из [здесь] (http://stackoverflow.com/questions/29468437/look-of-arrows-in-ggplot2-geom-segment/ 29654023 # 29654023)) – user20650

+0

@ user20650: «В беспорядке» я имею в виду, что стрелка (по крайней мере, закрытая) просто перепуталась (и потеряла его форму), если размер вызывается в 'geom_segment' (а также в блок «geom_line»). 'grid.gedit' ничего не делал с первой попытки - но это может быть моей ошибкой. Собираюсь инвестировать некоторое время сегодня. –

3

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

+0

отлично! спасибо, Карл! –

Смежные вопросы