it-swarm.com.de

Wie zeichnet man einen schönen Pfeil in ggplot2

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:

plot1

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:

plot2

Meine Frage: Gibt es eine Möglichkeit, "schöne" dicke Pfeile zu zeichnen?

23
Sebastian Kuhn

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

 arrow.segment

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

 svg

8
zyurnaidi

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 .

5
Carl

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.

0
LiKao