Je vise à construire un graphique à barres avec des flèches à la fin des barres. Je suis allé geom_segment
avec arrow
défini. Je veux mapper une colonne sur la transparence, mais l'esthétique alpha ne semble pas fonctionner correctement avec l'objet flèche. Voici l'extrait de code:
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))
Il peut être facilement observé que l' arrow
objet ne semble pas bien avec des valeurs inférieures de alpha
, montrant son squelette au lieu d'une forme simple et transparente. Existe-t-il un moyen de l'empêcher?
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))
Réponses:
Nous pouvons créer un nouveau géom,
geom_arrowbar
que nous pouvons utiliser comme n'importe quel autre géom, donc dans votre cas, cela donnerait l'intrigue souhaitée en faisant simplement:Et il contient 3 paramètres
column_width
,head_width
ethead_length
qui vous permettent de modifier la forme de la flèche si vous ne le faites pas comme les valeurs par défaut. Nous pouvons également spécifier la couleur de remplissage et d'autres esthétiques selon les besoins:Le seul hic, c'est qu'il faut d'abord l'écrire!
En suivant les exemples de la vignette ggplot2 étendue , nous pouvons définir notre
geom_arrowbar
de la même manière que les autres geoms sont définis, sauf que nous voulons pouvoir passer dans nos 3 paramètres qui contrôlent la forme de la flèche. Ceux-ci sont ajoutés à laparams
liste de l'layer
objet résultant , qui sera utilisé pour créer notre couche de flèches:Il ne reste plus qu'à "définir" ce qu'est un
GeomArrowBar
. Il s'agit en fait d'uneggproto
définition de classe. La partie la plus importante est ladraw_panel
fonction membre, qui prend chaque ligne de notre trame de données et la convertit en forme de flèche. Après quelques calculs de base à partir des coordonnées x et y ainsi que de nos différents paramètres de forme quelle devrait être la forme de la flèche, il en produit ungrid::polygonGrob
pour chaque ligne de nos données et le stocke dans agTree
. Cela forme le composant graphique de la couche.Cette implémentation est loin d'être parfaite. Il manque certaines fonctionnalités importantes, telles que des limites d'axe par défaut raisonnables et la possibilité de le faire
coord_flip
, et cela produira des résultats inesthétiques si les têtes de flèche sont plus longues que toute la colonne (bien que vous ne souhaitiez peut-être pas utiliser un tel tracé dans cette situation de toute façon) . Cependant, il y aura sensiblement la flèche pointant vers la gauche si vous avez une valeur négative. Une meilleure mise en œuvre pourrait également ajouter une option pour les têtes de flèche vides.En bref, il faudrait beaucoup de réglages pour aplanir ces bogues (et d'autres) et le rendre prêt pour la production, mais c'est assez bon pour produire de beaux graphiques sans trop d'effort entre-temps.
Créé le 2020-03-08 par le package reprex (v0.3.0)
la source
Vous pouvez utiliser à
geom_gene_arrow
partir delibrary(gggenes)
la source