Meu objetivo é construir um gráfico de barras com flechas no final das barras. Eu fui geom_segment
com arrow
definido. Quero mapear uma coluna para a transparência, mas a estética alfa não parece funcionar bem com o objeto de seta. Aqui está o trecho de código:
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))
Pode-se observar facilmente que o arrow
objeto não parece bem com valores mais baixos de alpha
, mostrando seu esqueleto em vez de uma forma simples e transparente. Existe uma maneira de evitá-lo?
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))
Respostas:
Podemos criar um novo geom,
geom_arrowbar
que podemos usar como qualquer outro geom; portanto, no seu caso, ele forneceria o gráfico desejado apenas fazendo:E contém 3 parâmetros,
column_width
,head_width
ehead_length
que lhe permitem alterar a forma da seta se você não faz como os padrões. Também podemos especificar a cor do preenchimento e outras estéticas, conforme necessário:O único problema é que temos que escrevê-lo primeiro!
Seguindo os exemplos da vinheta ggplot2 , podemos definir nossa
geom_arrowbar
da mesma maneira que outros geoms são definidos, exceto que queremos poder passar nossos três parâmetros que controlam a forma da seta. Eles são adicionados àparams
lista dolayer
objeto resultante , que será usado para criar nossa camada de setas:Agora, "tudo" que resta é definir o que
GeomArrowBar
é. Esta é efetivamente umaggproto
definição de classe. A parte mais importante é adraw_panel
função de membro, que pega cada linha do nosso quadro de dados e a converte em formas de seta. Após algumas matemáticas básicas para trabalhar a partir das coordenadas xey, bem como nossos vários parâmetros de forma, qual deve ser a forma da seta, ela produz umagrid::polygonGrob
para cada linha de nossos dados e a armazena em agTree
. Isso forma o componente gráfico da camada.Esta implementação está longe de ser perfeita. Faltam algumas funcionalidades importantes, como limites de eixo padrão sensíveis e a capacidade de
coord_flip
, e produzirá resultados não estéticos se as pontas das setas forem mais longas que a coluna inteira (embora você não queira usar esse gráfico nessa situação) . No entanto, sensivelmente, a seta estará apontando para a esquerda se você tiver um valor negativo. Uma implementação melhor também pode adicionar uma opção para pontas de setas vazias.Em resumo, seriam necessários muitos ajustes para resolver esses (e outros) bugs e torná-los prontos para produção, mas é bom o suficiente para produzir alguns gráficos agradáveis sem muito esforço nesse meio tempo.
Criado em 2020-03-08 pelo pacote reprex (v0.3.0)
fonte
Você poderia usar
geom_gene_arrow
delibrary(gggenes)
fonte