web-dev-qa-db-fra.com

Comment dessiner une belle flèche dans ggplot2

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:

plot1

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:

plot2

Ma question: Existe-t-il un moyen de tracer des "belles" flèches épaisses?

23
Sebastian Kuhn

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")))

 arrow.segment

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".

 svg

8
zyurnaidi

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 .

5
Carl

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.

0
LiKao