Я стремлюсь построить барный участок со стрелками в конце столбцов. Я пошел geom_segment
с arrow
определением. Я хочу отобразить один столбец на прозрачность, но эстетика альфа-канала не совсем подходит для объекта со стрелкой. Вот фрагмент кода:
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>%
ggplot() + geom_segment(aes(x = 0, xend = n, y = y, yend = y, alpha = transparency),
colour = 'red', size = 10, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) +
scale_y_continuous(limits = c(5, 35))
Легко заметить, что arrow
объект не выглядит хорошо с более низкими значениями alpha
, показывая его скелет вместо простой, прозрачной формы. Есть ли способ предотвратить это?
tibble(y = c(10, 20, 30), n = c(300, 100, 200), transparency = c(10, 2, 4)) %>% ggplot() + geom_segment(aes(x = 0, xend = n-10, y = y, yend = y, alpha = transparency), colour = 'red', size = 10) + geom_segment(aes(x = n-0.1, xend = n, y = y, yend = y, alpha = transparency), colour = 'red', size = 1, arrow = arrow(length = unit(1.5, 'cm'), type = 'closed')) + scale_y_continuous(limits = c(5, 35))
Ответы:
Мы можем создать новый geom,
geom_arrowbar
который мы можем использовать как любой другой geom, так что в вашем случае он даст желаемый график, просто выполнив:И она содержит 3 параметра,
column_width
,head_width
иhead_length
которые позволяют изменить форму стрелки , если вам не нравится по умолчанию. Мы также можем указать цвет заливки и другую эстетику:Единственная загвоздка в том, что мы должны написать это первыми!
Следуя примерам в расширяющейся виньетке ggplot2 , мы можем определить наши так
geom_arrowbar
же, как и другие геомы, за исключением того, что мы хотим иметь возможность передавать наши 3 параметра, которые управляют формой стрелки. Они добавляются вparams
список результирующегоlayer
объекта, который будет использоваться для создания слоя со стрелками:Теперь «все», что остается, это определить, что
GeomArrowBar
есть. Это фактическиggproto
определение класса. Самая важная часть этого -draw_panel
функция-член, которая берет каждую строку нашего информационного кадра и преобразовывает ее в формы стрелок. После выполнения некоторых базовых математических операций из координат x и y, а также наших различных параметров формы, какой должна быть форма стрелки, она создает по одномуgrid::polygonGrob
для каждой строки наших данных и сохраняет ее в agTree
. Это формирует графическую составляющую слоя.Эта реализация далека от совершенства. В нем отсутствуют некоторые важные функции, такие как разумные ограничения по умолчанию для осей и возможность
coord_flip
, и он даст неэстетичные результаты, если наконечники стрелок длиннее всего столбца (хотя вы, возможно, не захотите использовать такой график в такой ситуации) , Однако стрелка, указывающая налево, будет иметь смысл, если у вас отрицательное значение. Лучшая реализация может также добавить опцию для пустых наконечников стрелок.Короче говоря, потребовалось бы множество настроек, чтобы сгладить эти (и другие) ошибки и сделать их готовыми к работе, но этого достаточно, чтобы создавать хорошие графики без особых усилий.
Создано в 2020-03-08 пакетом представлением (v0.3.0)
источник
Вы можете использовать
geom_gene_arrow
изlibrary(gggenes)
источник