2010-06-30 17 views
9

Si creo una ventana de múltiples parcelas con par(mfrow=...), ¿es posible enviar datos a un gráfico específico (es decir, "el de la esquina inferior izquierda") o el trazado siempre es necesariamente secuencial? ¿Hay algún paquete para R que haga algo como esto?¿Parcela en una parcela específica en la ventana de varios planos?

Para aquellos que estén interesados, este problema surge del hecho de que R es una aplicación de subproceso único y no es ideal para la visualización en tiempo real. Tengo múltiples flujos de datos en tiempo real que entran en R desde una fuente externa que produce los datos de forma asincrónica (y por lo tanto, las secuencias de datos no siempre vienen en el mismo orden). Esto da como resultado que R pase el orden de los gráficos de visualización de datos cada vez que se actualiza.

Respuesta

11

Usted podría utilizar split.screen():

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

Aviso la importancia de utilizar: par (bg = "blanco") –

+0

Mucho obligado. :) – Jake

3

Eche un vistazo a help(layout). Esto le permite especificar qué, dónde y en qué tamaños.

Una vez trazado, no creo que vuelva a trazar solo parcialmente. Pero usted puede usar dev.set() y otros para cambiar entre diferentes 'dispositivos de trazado' (es decir, ventanas); ver help(dev.list).

0

Otra opción es la de aplicar un poco de interfaz gráfica de usuario, por ejemplo, con RGtk2 o RTclTk.

Generalmente hago esto para los gráficos que quiero cambiar en tiempo real y funciona muy bien.

Por ejemplo, con RGtk2 y cairoDevice que sólo podría hacer algo como (I suponga que tiene un interfaz de Glade)

# 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(....) 

Esto tiene muchas otras ventajas, como la de ser capaz de posiciones de los gráficos fácilmente dónde que desee (utilizando Glade Interface Designer) y teniendo la posibilidad de interacción del usuario a través de botones específicos (por ejemplo, puede tener un botón de "pausa de adquisición").

2

Tenga en cuenta que la respuesta sugerida aquí es utilizar split.screen(). Puede funcionar, pero de acuerdo con el archivo de ayuda split.screen: "La forma recomendada de usar estas funciones es dibujar completamente un gráfico y todas las adiciones (es decir, puntos y líneas) al gráfico base, antes de seleccionar y trazar en otra pantalla . El comportamiento asociado con volver a una pantalla para agregar a un gráfico existente es impredecible y puede dar lugar a problemas que no son fácilmente visibles ".

En una respuesta a mi pregunta, no es una solución más útil, utilizando el par opción (MFG):

Change plot panel in multipanel plot in R

Cuestiones relacionadas