Weź bardzo prosty przykład: mfrow=c(1,3)
; każda figura jest innym histogramem; jak narysować linię poziomą (podobną do abline(h=10)
), która przechodziła przez wszystkie liczby? (To znaczy, nawet margines między nimi.) Oczywiście, mogę dodać abline do każdej figury, ale to nie jest to, czego chcę. Mogę wymyślić bardzo skomplikowany sposób zrobienia tego przez naprawdę tylko o 1 figurze i rysowaniu każdej "figury" w niej przy użyciu polygon
itd. To byłoby śmieszne. Czy nie ma łatwego sposobu na zrobienie tego?Jak narysować linię w środowisku wielowymiarowym w R?
Odpowiedz
Jak @joran zauważono, siatki układ graficzny oferuje bardziej elastyczne kontrola nad wieloma działkami na jednym urządzeniu.
Tutaj, po raz pierwszy używam grconvertY()
do sprawdzenia lokalizacji o wysokości 50 na osi Y w jednostkach "znormalizowane współrzędne urządzenia". (tj. w stosunku do całkowitej wysokości urządzenia kreślarskiego, gdzie 0 = dół, a 1 = góra). Następnie używam funkcji grid, aby: (1) wcisnąć viewport
, który zapełnia urządzenie; i (2) wykreślić linię na wysokości zwróconej przez grconvertY()
.
## Create three example plots
par(mfrow=c(1,3))
barplot(VADeaths, border = "dark blue")
barplot(VADeaths, border = "yellow")
barplot(VADeaths, border = "green")
## From third plot, get the "normalized device coordinates" of
## a point at a height of 50 on the y-axis.
(Y <- grconvertY(50, "user", "ndc"))
# [1] 0.314248
## Add the horizontal line using grid
library(grid)
pushViewport(viewport())
grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red"))
popViewport()
EDIT: @joran zapytał, jak wykreślić linię, która rozciąga się od osi y 1. działki do krawędzi ostatniego baru w 3 działki. Oto kilka alternatyw:
library(grid)
library(gridBase)
par(mfrow=c(1,3))
# barplot #1
barplot(VADeaths, border = "dark blue")
X1 <- grconvertX(0, "user", "ndc")
# barplot #2
barplot(VADeaths, border = "yellow")
# barplot #3
m <- barplot(VADeaths, border = "green")
X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1
Y <- grconvertY(50, "user", "ndc")
## Horizontal line
pushViewport(viewport())
grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red"))
popViewport()
Wreszcie, oto prawie odpowiednik, a bardziej ogólnie użyteczne podejście.Zatrudnia ona funkcje grid.move.to()
i grid.line.to()
demo'd Paul Murrell w artykule związanej w odpowiedzi @ mdsumner za:
library(grid)
library(gridBase)
par(mfrow=c(1,3))
barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports())
barplot(VADeaths)
barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports())
pushViewport(vps1)
Y <- convertY(unit(50,"native"), "npc")
popViewport(3)
grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1)
grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3,
gp = gpar(col = "red"))
To jest najlepsze, co mogę zrobić, nie myśląc o tym trudniej:
par(mfrow = c(1,3),xpd = NA)
for (i in 1:3){
x <- rnorm(200,i)
hist(x)
if (i == 1) segments(par("usr")[1],10,30,10)
}
Nie jestem pewien, jak upewnić się, że linia kończy się w odpowiednim miejscu, bez majsterkowania. Wykreślenie segmentu w każdym regionie rozwiązałoby to, ale wprowadziłoby kwestię odpowiedniego wyrównania wysokości. Ale to może być dobry punkt wyjścia.
Domyślam się, że jest to łatwiejsze w grafice siatka, ale musiałbym zrobić kilka badań, aby zweryfikować.
Dzięki za pomoc. – gung
Ten artykuł Paula Murrell pokazuje użycie grid
graficznych do rysowania linii między dwoma różnymi układami współrzędnych, w tym przypadku linii, które mają punkty końcowe określone w rodzimej przestrzeni dwóch oddzielnych sub-działek:
Pawła Murrell . Pakiet grafiki siatki. R Wiadomości, 2 (2): 14-19, czerwiec 2002
Jest na stronie 17 artykułu PDF:
Dzięki, czytam artykuł. – gung
Tak, dziękuję za ten świetny link. Właśnie dodałem trzeci blok kodu do mojej odpowiedzi, który wykorzystuje kilka funkcji ('grid.move.to()' i 'grid.line.to()') zademonstrowanych w artykule Murrell. –
- 1. Jak narysować linię w VIM?
- 2. Jak narysować linię 1px w storyBoard?
- 3. Jak narysować linię w Sprite-kit
- 4. Swift - Jak narysować linię w OpenGL ES?
- 5. Jak narysować pionową linię w gnuplot?
- 6. Jak narysować gładką zakrzywioną linię w WPF?
- 7. Jak narysować linię z animacją w PyQt4
- 8. Jak narysować linię na formularzu?
- 9. jak narysować linię na obrazie?
- 10. Jak narysować „zoom in” efektu w R
- 11. Jak narysować linię siatki na płótnie WPF?
- 12. Jak narysować linię z Cocos2d-iPhone
- 13. Jak narysować linię z reprezentacji elewacji WorldWind
- 14. Jak narysować linię rzadką (z przerwami) z segmentami pokolorowanymi według pewnego współczynnika w R?
- 15. Jak mogę narysować "miękką" linię w WPF (przypuszczalnie używając LinearGradientBrush)?
- 16. Jak narysować pionową linię na wykresie serii czasu w Pandach?
- 17. Jak narysować linię w różnych wzorach, używając płótna?
- 18. jak narysować linię na ImageView wraz z palcem w android
- 19. Jak narysować okrąg i linię w skrzynce obrazkowej?
- 20. Jak narysować pionową linię między dwoma przyciskami w Androidzie
- 21. Jak iterować elementy hash, w środowisku R?
- 22. Dopasuj linię do danych w skali logarytmicznej w R
- 23. Utwórz formułę w środowisku data.table w R
- 24. jak narysować dwa półokręgi w ggplot w r
- 25. Dopasuj linię z wartością LOESS w R
- 26. narysować linię za pomocą dwóch punktów
- 27. Jak narysować parametryczną krzywą 3d z wygładzaniem w R?
- 28. R - Ocena zagnieżdżonej funkcji w środowisku
- 29. HTML5 Canvas - jak narysować linię na tle obrazu?
- 30. Jak narysować linię na MKMapView pokazującą trasę, którą podjął użytkownik?
+1 Nice! Czy znasz sposób masażu jednostek/współrzędnych/przycinania tak, że linia rozciąga się od lewej najbardziej osi y do prawej krawędzi zielonych pasków? – joran
Mam pomysł, a dodam go, jeśli się uda. W tej chwili mam zamiar skoszczyć trawnik przed zachodem słońca ... –
Dzięki, to jest naprawdę pomocne! Doceniam twoją chęć odroczenia koszenia trawnika na moim koncie ;-) – gung