Ich erstelle ein ggplot
-Diagramm, in dem ich Pfeile zwischen zwei Punkten haben möchte. Die Hauptaufgabe ist mit geom_line(arrow = arrow())
einfach zu erledigen. Ich möchte jedoch einige "schöne" dicke Pfeile haben. Die Größenänderung des Pfeils über size=
ist nicht hilfreich, da der Pfeil vollständig durcheinander gebracht wird. Ich illustriere meine Probleme:
Erstellen Sie einige Beispieldaten und ein Diagramm:
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"))
Das resultierende Diagramm sieht so aus:
Jetzt habe ich versucht, die Pfeile zu "verdicken" ...
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)
Das ist das Ergebnis, das hier gezeigt wird:
Meine Frage: Gibt es eine Möglichkeit, "schöne" dicke Pfeile zu zeichnen?
Normalerweise verwende ich geom_segment
, um einen Pfeil zu erstellen. Dazu müssen wir die Daten jedoch vom Format "long" in das Format "wide" ändern (in der Regel verwenden Sie dcast
vom reshape2
- oder data.table
-Paket). Diesmal habe ich versucht, die base
-Funktion von reshape
zu verwenden.
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: Ich habe gerade festgestellt, dass das gleiche Problem für "geschlossene" Pfeile gilt. Versuchen Sie zunächst, den Plot als Vektordiagramm zu speichern (pdf oder svg, verwenden Sie ggsave
oder Exportmenü auf der Registerkarte Plots). Das Ergebnis ist nicht "chaotisch".
In der neuesten Version von ggplot2
(und ich meine devtools::install_github("tidyverse/ggplot2")
latest, als ich diese Antwort geschrieben habe - ich bin sicher, dass sie es bald genug in den Vordergrund stellen wird), gibt es ein linejoin
-Argument für geom_segment
. Die Verwendung von linejoin='mitre'
liefert scharfe Kanten. Siehe für Details .
Dafür gibt es eine sehr einfache, aber etwas "hackige" Lösung.
Die Idee ist, die Linien zuerst zu zeichnen (in der gewünschten Dicke, aber keine Pfeilspitzen), aber etwas kürzer (kann in einigen Fällen berechnet werden). Dann zeichnen Sie einfach eine zweite Linie, ohne die Größe mit Pfeilspitzen zu ändern. Die resultierende Überlagerung wird so aussehen, wie Sie möchten.