2011-03-29 9 views
22

Tengo 4 conjuntos de valores: y1, y2, y3, y4 y un conjunto x. Los valores y son de diferentes rangos, y debo trazarlos como curvas separadas con conjuntos separados de valores en el eje y.Trace 4 curvas en una sola parcela con 3 ejes y

Para ponerlo simple, necesito 3 ejes y con diferentes valores (escalas) para trazar en la misma figura.

+0

No tengo claro lo que quieres exactamente. Tal vez sería útil incluir una maqueta de arte (o imagen) ASCII de lo que debería ser. Además, puede echar un vistazo a la galería de gráficos R (http://addictedtor.free.fr/graphiques/RGraphGallery.php) para ver cuál es la más cercana. – phooji

Respuesta

21

Trate de hacer esto ....

# The data have a common independent variable (x) 
x <- 1:10 

# Generate 4 different sets of outputs 
y1 <- runif(10, 0, 1) 
y2 <- runif(10, 100, 150) 
y3 <- runif(10, 1000, 2000) 
y4 <- runif(10, 40000, 50000) 
y <- list(y1, y2, y3, y4) 

# Colors for y[[2]], y[[3]], y[[4]] points and axes 
colors = c("red", "blue", "green") 

# Set the margins of the plot wider 
par(oma = c(0, 2, 2, 3)) 

plot(x, y[[1]], yaxt = "n", xlab = "Common x-axis", main = "A bunch of plots on the same graph", 
    ylab = "") 
lines(x, y[[1]]) 

# We use the "pretty" function go generate nice axes 
axis(at = pretty(y[[1]]), side = 2) 

# The side for the axes. The next one will go on 
# the left, the following two on the right side 
sides <- list(2, 4, 4) 

# The number of "lines" into the margin the axes will be 
lines <- list(2, NA, 2) 

for(i in 2:4) { 
    par(new = TRUE) 
    plot(x, y[[i]], axes = FALSE, col = colors[i - 1], xlab = "", ylab = "") 
    axis(at = pretty(y[[i]]), side = sides[[i-1]], line = lines[[i-1]], 
     col = colors[i - 1]) 
    lines(x, y[[i]], col = colors[i - 1]) 
} 

# Profit. 

Plot Output

+1

Estoy impresionado por el R-fu que se muestra aquí, pero personalmente no puedo sacar cara o cruz del producto resultante. Tal vez sería más claro si se usan símbolos diferentes además de/reemplazar los colores. O tal vez es solo un producto de los datos aleatorios que se muestran ... a pesar de todo, ¡buen trabajo! (+1) – Chase

+1

@Chase Recibí esta idea del blog de alguien hace un tiempo, pero me gustaría haber guardado el enlace. Agregué líneas a la trama que conecta los puntos (justo ahora). En realidad, tendría que decir que las líneas dejan perfectamente en claro por qué las otras respuestas son mejores en la mayoría de los casos. Trazar múltiples gráficos en la misma parcela puede ser engañoso, y esto sería solo un buen método si tuviéramos conjuntos de productos que aumentaran/disminuyesen más o menos de la misma manera (es decir, el gas metano y el CO2 en el medioambiente es lo que he usado tipo de trama para). – Rguy

14

intente lo siguiente. No es tan complicado como parece. Una vez que vea el primer gráfico que se está construyendo, verá que los otros son muy similares. Y, dado que hay cuatro gráficos similares, puede reconfigurar fácilmente el código en una función que se usa una y otra vez para dibujar cada gráfico. Sin embargo, dado que comúnmente dibujo todo tipo de gráficos con el mismo eje x, necesito MUCHA flexibilidad. Por lo tanto, he decidido que es más fácil simplemente copiar/pegar/modificar el código de cada gráfico.

#Generate the data for the four graphs 
x <- seq(1, 50, 1) 
y1 <- 10*rnorm(50) 
y2 <- 100*rnorm(50) 
y3 <- 1000*rnorm(50) 
y4 <- 10000*rnorm(50) 

#Set up the plot area so that multiple graphs can be crammed together 
par(pty="m", plt=c(0.1, 1, 0, 1), omd=c(0.1,0.9,0.1,0.9)) 

#Set the area up for 4 plots 
par(mfrow = c(4, 1)) 

#Plot the top graph with nothing in it ========================= 
plot(x, y1, xlim=range(x), type="n", xaxt="n", yaxt="n", main="", xlab="", ylab="") 
mtext("Four Y Plots With the Same X", 3, line=1, cex=1.5) 

#Store the x-axis data of the top plot so it can be used on the other graphs 
pardat<-par() 
xaxisdat<-seq(pardat$xaxp[1],pardat$xaxp[2],(pardat$xaxp[2]-pardat$xaxp[1])/pardat$xaxp[3]) 

#Get the y-axis data and add the lines and label 
yaxisdat<-seq(pardat$yaxp[1],pardat$yaxp[2],(pardat$yaxp[2]-pardat$yaxp[1])/pardat$yaxp[3]) 
axis(2, at=yaxisdat, las=2, padj=0.5, cex.axis=0.8, hadj=0.5, tcl=-0.3) 
abline(v=xaxisdat, col="lightgray") 
abline(h=yaxisdat, col="lightgray") 
mtext("y1", 2, line=2.3) 
lines(x, y1, col="red") 

#Plot the 2nd graph with nothing ================================ 
plot(x, y2, xlim=range(x), type="n", xaxt="n", yaxt="n", main="", xlab="", ylab="") 

#Get the y-axis data and add the lines and label 
pardat<-par() 
yaxisdat<-seq(pardat$yaxp[1],pardat$yaxp[2],(pardat$yaxp[2]-pardat$yaxp[1])/pardat$yaxp[3]) 
axis(2, at=yaxisdat, las=2, padj=0.5, cex.axis=0.8, hadj=0.5, tcl=-0.3) 
abline(v=xaxisdat, col="lightgray") 
abline(h=yaxisdat, col="lightgray") 
mtext("y2", 2, line=2.3) 
lines(x, y2, col="blue") 

#Plot the 3rd graph with nothing ================================= 
plot(x, y3, xlim=range(x), type="n", xaxt="n", yaxt="n", main="", xlab="", ylab="") 

#Get the y-axis data and add the lines and label 
pardat<-par() 
yaxisdat<-seq(pardat$yaxp[1],pardat$yaxp[2],(pardat$yaxp[2]-pardat$yaxp[1])/pardat$yaxp[3]) 
axis(2, at=yaxisdat, las=2, padj=0.5, cex.axis=0.8, hadj=0.5, tcl=-0.3) 
abline(v=xaxisdat, col="lightgray") 
abline(h=yaxisdat, col="lightgray") 
mtext("y3", 2, line=2.3) 
lines(x, y3, col="green") 

#Plot the 4th graph with nothing ================================= 
plot(x, y4, xlim=range(x), type="n", xaxt="n", yaxt="n", main="", xlab="", ylab="") 

#Get the y-axis data and add the lines and label 
pardat<-par() 
yaxisdat<-seq(pardat$yaxp[1],pardat$yaxp[2],(pardat$yaxp[2]-pardat$yaxp[1])/pardat$yaxp[3]) 
axis(2, at=yaxisdat, las=2, padj=0.5, cex.axis=0.8, hadj=0.5, tcl=-0.3) 
abline(v=xaxisdat, col="lightgray") 
abline(h=yaxisdat, col="lightgray") 
mtext("y4", 2, line=2.3) 
lines(x, y4, col="darkgray") 

#Plot the X axis ================================================= 
axis(1, at=xaxisdat, padj=-1.4, cex.axis=0.9, hadj=0.5, tcl=-0.3) 
mtext("X Variable", 1, line=1.5) 

A continuación se muestra la gráfica de los cuatro gráficos.

enter image description here

+2

+ 1 Esta es una gran solución también. Podría usar esto alguna vez. Es menos engañoso que poner todos los puntos exactamente en el mismo gráfico. – Rguy

19

Si quieres ir por el camino del aprendizaje de un paquete de trazado más allá de los gráficos de base, he aquí una solución con ggplot2 utilizando las variables de @ respuesta de Rguy:

library(ggplot2) 
dat <- data.frame(x, y1, y2, y3, y4) 

dat.m <- melt(dat, "x") 

ggplot(dat.m, aes(x, value, colour = variable)) + geom_line() + 
facet_wrap(~ variable, ncol = 1, scales = "free_y") + 
scale_colour_discrete(legend = FALSE) 

enter image description here

+0

Este es un diseño mucho más lógico que la respuesta aceptada para este tipo de datos, pero realmente depende del problema específico que tiene el OP. – naught101

Cuestiones relacionadas