Jak mogę uzyskać współrzędne x , y punktu geom w ggplocie , gdzie ramką odniesienia jest cały wykreślony obraz?
Mogę utworzyć ggplot z niektórymi punktami geom za pomocą:
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")
To daje:
Konwertując to na grob , mogę wyciągnąć dodatkowe informacje o tym ggplocie , takie jak współrzędne w odniesieniu do panelu wykresu, oznaczone fioletową strzałką. Ignoruje to jednak przestrzeń zajmowaną przez osie.
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
Jak mogę uzyskać wartości współrzędnych x , y, kiedy zacznę mierzyć od lewego dolnego rogu całego obrazu, oznaczonego zieloną strzałką?
Jeśli to możliwe, chciałbym roztwór do uwzględnienia motyw z ggplot . Dodanie motywu podobnego + theme_void()
wpływa na osie, a także przesuwa położenie punktów w stosunku do całego drukowanego obrazu.
Aktualizacja : Zrozumiałem, że rozmiar czcionki osi zmienia się w zależności od szerokości i wysokości wykresu, wpływając na względny rozmiar panelu wykresu . Dlatego podanie lokalizacji w jednostkach NPC nie będzie trywialne bez zdefiniowania szerokości i wysokości wykresu . Jeśli to możliwe, podaj położenie punktów geom w zależności od szerokości i wysokości wykresu .
Odpowiedzi:
Kiedy zmieniasz rozmiar ggplot, pozycje elementów w panelu nie znajdują się w ustalonych pozycjach w przestrzeni NPC. Wynika to z faktu, że niektóre elementy działki mają ustalone rozmiary, a niektóre z nich (na przykład panel) zmieniają wymiary zgodnie z rozmiarem urządzenia.
Oznacza to, że każde rozwiązanie musi uwzględniać rozmiar urządzenia, a jeśli chcesz zmienić rozmiar działki, musisz ponownie uruchomić obliczenia. To powiedziawszy, dla większości aplikacji (w tym twojej, odgłosów rzeczy), to nie jest problem.
Inną trudnością jest upewnienie się, że identyfikujesz poprawne wyniki w panelu, i trudno jest zrozumieć, jak można to łatwo uogólnić. Korzystanie z listy funkcji podzbioru
[[6]]
i[[3]]
w przykładzie nie jest uogólnić na inne działki.W każdym razie to rozwiązanie działa poprzez pomiar rozmiaru i położenia panelu w gtable oraz przekształcenie wszystkich rozmiarów na milimetry przed podzieleniem przez wymiary wykresu w milimetrach w celu konwersji na przestrzeń npc. Próbowałem uczynić to nieco bardziej ogólnym, wyodrębniając panel i punkty według nazwy, a nie indeksu numerycznego.
Teraz możemy przetestować to na twoim przykładzie:
I możemy potwierdzić, że te wartości są poprawne, wykreślając niektóre punkty grobu nad twoimi czerwonymi punktami, używając naszych wartości jako współrzędnych npc:
Utworzono 2020-03-25 przez pakiet reprezentx (v0.3.0)
źródło
sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
część jest najdziwniejsza. Czy możesz wyjaśnić, co tutaj podsumowujesz?panel_pos$t
podaje rząd siatki, w której znajduje się (elastyczny) panel, podobnie jakseq(panel_pos$t -1)
wszystkie numery rzędów powyżej, a zatemsum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
suma wysokości tych rzędów.