Wie kann ich die x , y- Koordinaten eines geom_point in einem ggplot erhalten , wobei der Referenzrahmen das gesamte geplottete Bild ist?
Ich kann ein ggplot mit einigen geom_point s erstellen mit:
library(ggplot2)
my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
geom_point(aes(x, y), color = "red")
Das gibt:
Indem ich dies in einen Grob konvertiere , kann ich einige zusätzliche Informationen zu diesem ggplot extrahieren , wie z . B. die Koordinaten in Bezug auf das Plotfeld , die durch den violetten Pfeil markiert sind. Dies ignoriert jedoch den von den Achsen eingenommenen Raum.
my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native
Wie kann ich die Werte der x , y- Koordinaten abrufen , wenn ich mit der Messung in der unteren linken Ecke des gesamten Bildes beginne, die durch den grünen Pfeil markiert ist?
Wenn es möglich ist, möchte ich, dass die Lösung das Thema des ggplot berücksichtigt . Das Hinzufügen eines Themas wie + theme_void()
wirkt sich auf die Achsen aus und verschiebt auch die Position der Punkte in Bezug auf das gesamte geplottete Bild.
Update : Ich habe festgestellt, dass sich die Schriftgröße der Achsen abhängig von der Breite und Höhe des Plots ändert, was sich auf die relative Größe des Plotfelds auswirkt . So ist es nicht trivial sein wird , die Lage in bereitzustellen npc die Einheiten ohne zu definieren , Grundstück Breite und Grundstück Höhe . Wenn möglich, gibt die Lage der geom_points in Abhängigkeit von der Handlung Breite und Grundstück Höhe .
Antworten:
Wenn Sie die Größe eines ggplot ändern, befindet sich die Position der Elemente innerhalb des Bedienfelds nicht an festen Positionen im NPC-Raum. Dies liegt daran, dass einige der Komponenten des Diagramms feste Größen haben und einige von ihnen (z. B. das Bedienfeld) die Abmessungen entsprechend der Größe des Geräts ändern.
Dies bedeutet, dass jede Lösung die Gerätegröße berücksichtigen muss. Wenn Sie die Größe des Diagramms ändern möchten, müssen Sie die Berechnung erneut ausführen. Allerdings ist dies für die meisten Anwendungen (einschließlich Ihrer, nach den Geräuschen der Dinge) kein Problem.
Eine weitere Schwierigkeit besteht darin, sicherzustellen, dass Sie die richtigen Grobs innerhalb des Panel-Grobs identifizieren, und es ist schwierig zu erkennen, wie dies leicht verallgemeinert werden kann. Die Verwendung der Listenuntermengenfunktionen
[[6]]
und[[3]]
in Ihrem Beispiel ist nicht auf andere Diagramme verallgemeinerbar.Wie auch immer, diese Lösung misst die Panelgröße und -position innerhalb der gtable und konvertiert alle Größen in Millimeter, bevor sie durch die Plotabmessungen in Millimetern dividiert wird, um sie in den NPC-Raum zu konvertieren. Ich habe versucht, es etwas allgemeiner zu gestalten, indem ich das Panel und die Punkte eher nach Namen als nach numerischem Index extrahierte.
Jetzt können wir es mit Ihrem Beispiel testen:
Und wir können bestätigen, dass diese Werte korrekt sind, indem wir einige Punktkanten über Ihre roten Punkte zeichnen und unsere Werte als NPC-Koordinaten verwenden:
Erstellt am 25.03.2020 durch das reprex-Paket (v0.3.0)
quelle
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
Teil ist der seltsamste. Können Sie erklären, was Sie hier zusammenfassen?panel_pos$t
gibt die Zeile des Rasters an, in der sich das (flexible) Bedienfeld befindet, alsoseq(panel_pos$t -1)
alle darüber liegenden Zeilennummern und dahersum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
die Summe der Höhen dieser Zeilen.