varias superponer modificar lineas graficos grafico graficas ggplot ejes dispersion barras r plot

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