Ich möchte ein Bar-Grundstück mit Pfeilen am Ende der Bars bauen. Ich ging geom_segment
mit arrow
definiert. Ich möchte eine Spalte auf Transparenz abbilden, aber die Alpha-Ästhetik scheint mit Pfeilobjekten nicht gut zu funktionieren. Hier ist das Code-Snippet:
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))
Es kann leicht beobachtet werden, dass ein arrow
Objekt mit niedrigeren Werten von nicht gut aussieht alpha
und sein Skelett anstelle einer einfachen, transparenten Form zeigt. Gibt es eine Möglichkeit, dies zu verhindern?
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))
Antworten:
Wir können ein neues Geom erstellen
geom_arrowbar
, das wir wie jedes andere Geom verwenden können. In Ihrem Fall würde es also den gewünschten Plot ergeben, indem Sie einfach Folgendes tun:Und es enthält drei Parameter
column_width
,head_width
undhead_length
dass können Sie die Form des Pfeils ändern , wenn Sie nicht wie die Standardwerte. Bei Bedarf können wir auch die Füllfarbe und andere Ästhetik festlegen:Der einzige Haken ist, dass wir es zuerst schreiben müssen!
Anhand der Beispiele in der erweiterten ggplot2-Vignette können wir unsere
geom_arrowbar
auf dieselbe Weise definieren wie andere Geome, außer dass wir unsere 3 Parameter übergeben möchten, die die Form des Pfeils steuern. Diese werden derparams
Liste des resultierendenlayer
Objekts hinzugefügt, das zum Erstellen unserer Pfeilebene verwendet wird:Jetzt bleibt nur noch zu definieren, was a
GeomArrowBar
ist. Dies ist effektiv eineggproto
Klassendefinition. Der wichtigste Teil davon ist diedraw_panel
Elementfunktion, die jede Zeile unseres Datenrahmens in Pfeilformen konvertiert. Nach einigen grundlegenden Berechnungen aus den x- und y-Koordinaten sowie unseren verschiedenen Formparametern, wie die Form des Pfeils aussehen soll, wirdgrid::polygonGrob
für jede Zeile unserer Daten eine erstellt und in a gespeichertgTree
. Dies bildet die grafische Komponente der Ebene.Diese Implementierung ist alles andere als perfekt. Es fehlen einige wichtige Funktionen, wie z. B. sinnvolle Standardachsenbeschränkungen und die Fähigkeit dazu
coord_flip
, und es werden unästhetische Ergebnisse erzielt, wenn die Pfeilspitzen länger als die gesamte Spalte sind (obwohl Sie in dieser Situation möglicherweise ohnehin kein solches Diagramm verwenden möchten). . Es wird jedoch sinnvoll sein, dass der Pfeil nach links zeigt, wenn Sie einen negativen Wert haben. Eine bessere Implementierung könnte auch eine Option für leere Pfeilspitzen hinzufügen.Kurz gesagt, es würde eine Menge Verbesserungen erfordern, um diese (und andere) Fehler auszubügeln und produktionsbereit zu machen, aber es ist gut genug, um in der Zwischenzeit ohne allzu großen Aufwand einige schöne Charts zu erstellen.
Erstellt am 08.03.2020 durch das reprex-Paket (v0.3.0)
quelle
Sie könnten
geom_gene_arrow
von verwendenlibrary(gggenes)
quelle