modificar - superponer graficas en r ggplot
Trazando múltiples curvas, la misma gráfica y la misma escala. (5)
Este es un seguimiento de esta pregunta .
Quería trazar varias curvas en el mismo gráfico, pero para que mis nuevas curvas respeten la misma escala del eje y generada por la primera curva.
Observa el siguiente ejemplo:
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
# first plot
plot(x, y1)
# second plot
par(new = TRUE)
plot(x, y2, axes = FALSE, xlab = "", ylab = "")
Eso en realidad traza ambos conjuntos de valores en las mismas coordenadas de la gráfica (porque estoy ocultando el nuevo eje y que se crearía con la segunda gráfica).
Mi pregunta entonces es cómo mantener la misma escala del eje y al trazar la segunda gráfica.
(El método típico sería usar el plot
solo una vez para configurar los límites, posiblemente para incluir el rango de todas las series combinadas, y luego usar points
y lines
para agregar las series separadas). Para usar el plot
varias veces con par(new=TRUE)
debe asegurarse de que su primer gráfico tenga un ylim
adecuado para aceptar todas las series (y en otra situación, es posible que también necesite usar la misma estrategia para xlim):
# first plot
plot(x, y1, ylim=range(c(y1,y2)))
# second plot EDIT: needs to have same ylim
par(new = TRUE)
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "")
El siguiente código hará la tarea de forma más compacta, de manera predeterminada obtendrás números como puntos, pero el segundo te dará los típicos "puntos" de tipo R:
matplot(x, cbind(y1,y2))
matplot(x, cbind(y1,y2), pch=1)
Mi solución es usar ggplot2
. Se encarga de este tipo de cosas automáticamente. Lo más importante es organizar los datos adecuadamente.
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5)))
Luego usa ggplot2
para ggplot2
library(ggplot2)
ggplot(df, aes(x=x, y=y, color=class)) + geom_point()
Esto quiere decir trazar los datos en df
, y separar los puntos por class
.
La trama generada es.
No está siendo muy claro acerca de lo que quiere aquí, ya que creo que @DWin es técnicamente correcto, dado su código de ejemplo. Creo que lo que realmente quieres es esto:
y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
# first plot
plot(x, y1,ylim = range(c(y1,y2)))
# Add points
points(x, y2)
La solución de DWin estaba operando bajo el supuesto implícito (basado en su código de ejemplo) de que quería trazar el segundo conjunto de puntos superpuestos en la escala original. Es por eso que su imagen parece que los puntos se trazan en 1, 101, etc. Llamar a la plot
por segunda vez no es lo que desea, usted quiere agregar a la trama usando points
. Así que el código anterior en mi máquina produce esto:
Pero el punto principal de DWin sobre el uso de ylim
es correcto.
No estoy seguro de lo que quieres, pero usaré celosía.
x = rep(x,2)
y = c(y1,y2)
fac.data = as.factor(rep(1:2,each=5))
df = data.frame(x=x,y=y,z=fac.data)
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2)
Entonces, sólo trama
xyplot(y ~x|z, df)
# or maybe
xyplot(x ~y|z, df)
points
o lines
son útiles si
-
y2
se genera más tarde, o - Los nuevos datos no tienen la misma
x
pero deberían ir al mismo sistema de coordenadas.
Como tus y
s comparten la misma x
, también puedes usar matplot
:
matplot (x, cbind (y1, y2), pch = 19)
(sin pch
matplopt
se matplopt
los números de columna de la matriz y
lugar de puntos).