Nehmen Sie ein sehr einfaches Beispiel, mfrow=c(1,3)
; jede Figur ist ein anderes Histogramm; Wie würde ich eine horizontale Linie zeichnen (ähnlich abline(h=10)
), die über alle 3 Zahlen ging? (Das heißt, sogar die Ränder zwischen ihnen.) Natürlich könnte ich jeder Figur eine Abline hinzufügen, aber das ist nicht was ich will. Ich kann an eine sehr komplizierte Möglichkeit denken, dies zu tun wirklich nur mit 1 Figur, und zeichnen jede 'Figur' innerhalb es mit polygon
usw. Das wäre lächerlich. Gibt es nicht einen einfachen Weg, dies zu tun?Wie zeichnen Sie eine Linie über eine mehrfigurige Umgebung in R?
Antwort
Wie @joran erwähnt, das Gitter Graphical System bietet flexibleren Kontrolle über die Anordnung mehrerer Plots auf einem einzelnen Gerät.
hier verwende ich grconvertY()
zuerst die Lage von einer Höhe von 50 auf der y-Achse in Einheiten von „normalisieren Vorrichtungskoordinaten“ abzufragen. (d. h. als ein Anteil der Gesamthöhe der Zeichenvorrichtung mit 0 = unten und 1 = oben). Ich verwende dann Gitter Funktionen zu: (1) drücken Sie eine viewport
, die das Gerät füllt; und (2) zeichne eine Linie auf der Höhe auf, die von grconvertY()
zurückgegeben wird.
## 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 gefragt, wie eine Linie zu zeichnen, die von der y-Achse der ersten Parzelle zum Rande des letzten Balkens in der 3. Parzelle erstreckt. Hier sind ein paar Alternativen:
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()
Schließlich ist hier ein fast Äquivalent und allgemeiner nützlicher Ansatz.Es beschäftigt die Funktionen grid.move.to()
und grid.line.to()
demo'd von Paul Murrell in dem Artikel verknüpft in @ mdsumner Antwort:
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"))
Dies ist das Beste, was ich härter, ohne darüber nachzudenken, es zu tun:
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)
}
Ich bin nicht sicher, wie die Linie endet an der richtigen Stelle, um sicherzustellen, ohne Bastelei. Das Aufzeichnen eines Segments in jeder Region würde das lösen, aber das Problem einführen, dass die Höhen richtig ausgerichtet sind. Aber das könnte zumindest ein guter Ausgangspunkt sein.
Ich denke, das ist einfacher in Raster Grafiken, aber ich müsste einige Nachforschungen zu verifizieren.
Vielen Dank für Ihre Hilfe. – gung
Dieser Artikel von Paul Murrell zeigt die Verwendung von grid
Grafiklinien zwischen zwei verschiedenen Koordinatensystemen, in diesem Fall Linien, die in der nativen Raum von zwei separaten Teil Plots definiert Endpunkte zu zeichnen:
Paul Murrell . Das Grid-Grafikpaket. R News, 2 (2): 14-19, Juni 2002
Es auf Seite ist 17 des PDF Artikel:
Danke, ich lese den Artikel. – gung
Ja, danke für diesen tollen Link. Ich habe gerade einen dritten Code-Block zu meiner Antwort hinzugefügt, der einige der Funktionen ('grid.move.to()' und 'grid.line.to()') benutzt, die in Murrells Artikel demonstriert wurden. –
- 1. Zeichnen Sie eine Linie über Balkendiagramm
- 2. Zeichnen Sie eine parallele Linie
- 3. Zeichnen Sie eine glatte Linie
- 4. Zeichnen Sie eine Linie nach Persp mit rsm in R
- 5. Zeichnen Sie eine Linie in UIImageView Problem
- 6. Zeichnen Sie eine Linie in MATLAB
- 7. Verzerren Sie eine gerade Linie über Fischaugenverzerrungsfunktion und zeichnen Sie sie korrekt in das Bild
- 8. Box2dweb Eine statische Linie zeichnen
- 9. Zeichnen Sie eine Lorenz-Kurve in R
- 10. Zeichnen Sie eine Antialiased Linie auf eine schnelle Weise
- 11. Zeichnen Sie eine Linie in einem bestimmten Winkel in Java
- 12. Zeichnen Sie die Linie von Label zu Punkt in R
- 13. R: Wie viele Rechtecke eine Linie kreuzt
- 14. Zeichnen Sie eine vertikale Linie in der Tabellenansicht
- 15. Zeichnen Sie eine Linie in der Fußzeile mit mdpf
- 16. Wie können Sie in WPF eine Linie über einen WindowsFormsHost zeichnen?
- 17. Kann ich mit jQuery eine Linie zeichnen?
- 18. Zeichnen Sie eine Linie in einem bestimmten Winkel (dynamisch)
- 19. Zeichnen Sie eine Linie zwischen .png Bild in Latex
- 20. zeichnen Linie über in einem ggplot2
- 21. Python: Wie in verschiedenen Farben eine Linie zeichnen
- 22. Passen Sie eine Linie mit LOESS in R
- 23. Erstellen Sie eine Formel in einer data.table-Umgebung in R
- 24. Wie kann ich eine gerade Linie in jfreechart zeichnen?
- 25. So erstellen Sie eine Linie in StarUML
- 26. R - zeichne eine Linie in scatterd3 plot
- 27. zeichnen Sie eine vertikale Linie zwischen vertrauenswürdigen Intervallen
- 28. Zeichnen Sie eine Linie auf Leinwand mit benutzerdefiniertem Stil (delphi)
- 29. Wie würde ich am Ende einer UINavigationBar eine Linie zeichnen?
- 30. Wie eine Standardnormalverteilung in R
+1 Schön! Kennen Sie die Masseinheiten/Koordinaten/Clipping so, dass die Linie von der linken y-Achse bis zur rechten Kante der grünen Balken reicht? – joran
Ich habe eine Idee, und ich werde es hinzufügen, wenn es klappt. Gerade jetzt, ich bin dran, den Rasen zu mähen, bevor die Sonne untergeht ... –
Danke, das ist wirklich hilfreich! Ich schätze Ihre Bereitschaft, Rasen mähen auf meinem Konto zu verschieben ;-) – gung