2010-06-30 12 views
9

Wenn ich ein Multi-Plot-Fenster mit par(mfrow=...) erstelle, ist es möglich, Daten an ein bestimmtes Diagramm zu senden (d. H. "Das in der unteren linken Ecke") oder ist das Plotten immer unbedingt sequentiell? Gibt es ein Paket für R, das so etwas macht?Plot auf bestimmte Plot in mehreren Plot-Fenster?

Für diejenigen, die interessiert sind, ergibt sich dieses Problem aus der Tatsache, dass R eine single-threaded-Anwendung ist und nicht ideal für die Echtzeit-Visualisierung ist. Ich habe mehrere Echtzeit-Datenströme, die von einer externen Quelle in R kommen, die die Daten asynchron erzeugt (und daher die Datenströme nicht immer in der gleichen Reihenfolge kommen). Dies führt dazu, dass R bei jeder Aktualisierung um die Reihenfolge der Datenvisualisierungsdiagramme herumfliegt.

Antwort

11

könnten Sie split.screen() verwenden:

par(bg = "white") # erase.screen() will appear not to work 
        # if the background color is transparent 
        # (as it is by default on most devices). 
split.screen(c(2,1)) # split display into two screens 
split.screen(c(1,3), screen = 2) # now split the bottom half into 3 
screen(1) # prepare screen 1 for output 
plot(10:1) 
screen(4) # prepare screen 4 for output 
plot(10:1) 
+0

Beachten Sie die Bedeutung der Verwendung von: par (bg = "white") –

+0

Much verpflichtet. :) – Jake

3

Werfen Sie einen Blick auf help(layout). Damit können Sie festlegen, was, wo und in welchen Größen.

Sobald geplottet, glaube ich nicht, dass Sie nur teilweise neu plotten. Aber Sie können dev.set() et al. Verwenden, um zwischen verschiedenen 'plot devices' (dh Fenstern) zu wechseln; siehe help(dev.list).

0

Eine weitere Möglichkeit ist, dass ein kleines GUI der Umsetzung z.B. mit RGtk2 oder RTclTk.

Ich mache das im Allgemeinen für Graphen, die ich in Echtzeit ändern möchte und es funktioniert gut.

Zum Beispiel mit RGtk2 und cairoDevice Sie wie etwas tun könnte (ich nehme an, Sie eine Glade-Schnittstelle)

# Helper function to get a widget from the Glade interface 
getWidget <- function(name) 
{ 
return (interface$getWidget(name)) 
} 

interface <- gladeXMLNew("interface.glade", root="mainWindow") 
# Our cairo devices (to draw graphics). 
# plot1, plot2, and plot3 are GtkDrawingArea widgets 
asCairoDevice(getWidget("plot1")) 
# dev.cur() will give the device number of the last device we created 
# You'll use this to switch device when you draw in different plots 
# Storing the device number is important because you may have other 
# devices open from other unrelated plots 
# (so never assume they'll just start from 1 and be sequential!!!) 
plot1.dev <- as.integer(dev.cur()) 
asCairoDevice(getWidget("plot2")) 
plot2.dev <- as.integer(dev.cur()) 
asCairoDevice(getWidget("plot3")) 
plot3.dev <- as.integer(dev.cur()) 

# To draw in a specific plot you just do 
dev.set(plot2.dev) 
plot(....) 

Diese viele andere Vorteile, wie die die Graphen leicht zu Positionen der Lage zu sein, wo Sie möchten (mit Glade Interface Designer) und haben die Möglichkeit der Benutzerinteraktion durch bestimmte Schaltflächen (zB können Sie eine Schaltfläche "Pause Erfassung") haben.

2

Beachten Sie, dass die hier vorgeschlagene Antwort die Verwendung von split.screen() ist. Es funktioniert vielleicht, aber entsprechend der Hilfe-Datei von split.screen: "Die empfohlene Art, diese Funktionen zu verwenden, besteht darin, ein Plot und alle Zusätze (dh Punkte und Linien) vollständig auf das Grundplot zu zeichnen, bevor es auf einem anderen Bildschirm ausgewählt und gezeichnet wird Das Verhalten, das mit dem Zurückkehren zu einem Bildschirm zum Hinzufügen zu einer vorhandenen Zeichnung verbunden ist, ist unvorhersehbar und kann zu Problemen führen, die nicht sofort sichtbar sind. "

In einer Antwort auf meine Frage, gibt es eine sinnvollere Lösung, die Par mit (mfg) Option:

Change plot panel in multipanel plot in R