Je crée un graphique ggplot
où je veux avoir des flèches entre deux points. La tâche principale est facilement réalisée avec geom_line(arrow = arrow())
. Cependant, je veux avoir de "belles" flèches épaisses. Redimensionner la flèche avec size=
n’aide en rien car il gâche complètement la tête de la flèche. J'illustre mes problèmes:
Créez des exemples de données et un tracé:
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"))
L'intrigue résultante ressemble à ça:
Maintenant, j'ai essayé "d'épaissir" les flèches ...
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)
C'est le résultat montré ici:
Ma question: Existe-t-il un moyen de tracer des "belles" flèches épaisses?
J'utilise habituellement geom_segment
pour créer une flèche. Mais pour cela, nous devons modifier les données du format "long" au format "large" (en utilisant généralement le paquet dcast
de reshape2
ou data.table
). Mais cette fois, j’ai essayé d’utiliser la fonction base
de 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")))
EDIT: Je viens de constater que le même problème concerne les flèches de type "fermé". Pour l'instant, essayez de sauvegarder le tracé sous forme de graphique vectoriel (pdf ou svg, à l'aide de ggsave
ou du menu Exporter de l'onglet Plots). Le résultat n'est pas "salissant".
Dans la version la plus récente de ggplot2
(et je veux dire devtools::install_github("tidyverse/ggplot2")
dernier, au moment de la rédaction de cette réponse - je suis sûr qu'ils la reprendront assez tôt), il existe un argument linejoin
à geom_segment
. Utiliser linejoin='mitre'
fournira des bords nets. Voir le suivant pour plus de détails .
Il existe une solution très simple, mais un peu "hacky" à cela.
L'idée est de tracer d'abord les lignes (à l'épaisseur souhaitée, mais pas de pointes de flèche), mais un peu plus courtes (calculables dans certains cas). Ensuite, tracez une seconde ligne sans changer la taille avec les pointes de flèche. La superposition résultante aura l'apparence que vous souhaitez.