2011-07-28 14 views
17

Este es un seguimiento de this question.Trazado de múltiples curvas el mismo gráfico y la misma escala

Quería trazar múltiples curvas en el mismo gráfico, pero para que mis nuevas curvas respeten la misma escala del eje y generada por la primera curva.

Aviso 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 = "") 

Que en realidad traza ambos conjuntos de valores en las mismas coordenadas de la gráfica (porque yo estoy escondiendo el nuevo eje y que se crearía con la segunda parcela) .

Mi pregunta es cómo mantener la misma escala del eje y al trazar el segundo gráfico.

+1

No estoy seguro de lo que quiere. Un gráfico de lo que quiere ayudaría ... –

+0

Solo para agregar al comentario de Manoel, el segundo conjunto de valores y está fuera del rango del primero. ¿Dónde esperas que sean trazados? – joran

+0

@Manoel: eso es lo que estoy buscando en realidad ... – Renan

Respuesta

30

(El método típico sería utilizar plot sólo una vez para establecer los límites, que podría incluir el rango de todas las series se combinan, y luego utilizar points y lines para agregar las series por separado.) Para usar plot varias veces con par(new=TRUE), debe asegurarse de que su primer diagrama tenga un ylim adecuado para aceptar todas las series (y en otra situación, puede necesitar también 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 = "") 

enter image description here

Este siguiente código va a hacer la tarea de forma más compacta, por defecto se obtiene el número de puntos pero el segundo le da típica R-Tipo- "puntos":

matplot(x, cbind(y1,y2)) 
    matplot(x, cbind(y1,y2), pch=1) 
+0

¿No se supone que el segundo conjunto de valores y es 1: 5? – joran

+0

Sí, esto no está funcionando. Puede ver que estos puntos no están representados en la misma escala del eje y, de lo contrario 2 sería mayor que 100 ... :) – Renan

+0

OOOP: editará –

1

No estoy seguro de lo que quiere, 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, justo trazar

xyplot(y ~x|z, df) 
# or maybe 
xyplot(x ~y|z, df) 
+4

O 'xyplot (y ~ x, groups = z, df)'. Y sin crear nuevos 'data.frame':' xyplot (y1 + y2 ~ x) '. – Marek

+0

¡Lo sé, pero nunca lo he usado! Tal vez debería intentarlo. +1 para el puntero. –

5

No está siendo muy claro acerca de lo que quiere aquí, ya que creo que @DWin's es técnicamente correcto, dado su código de ejemplo. Creo que lo que realmente desea es la siguiente:

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) 

solución de Dwin se opera bajo el supuesto implícito (basado en el código de ejemplo) que quería trazar el segundo conjunto de puntos superpuesto en la escala original . Es por eso que su imagen parece que los puntos están trazados en 1, 101, etc. Llamar a plot por segunda vez no es lo que quiere, quiere agregar a la parcela usando points. Por lo que el código anterior en mi máquina produce esto:

enter image description here

Pero el principal punto de Dwin sobre el uso de ylim es correcta.

+0

Puntos para usted. Se corrigió mi problema de y usando el mismo ylim en ambos. Probablemente debería haber usado puntos en retrospectiva. –

+0

No necesita 'c' en el rango. 'range (y1, y2)' es suficiente. – Marek

6

points o lines es muy útil si se genera

  • y2 posterior, o
  • los nuevos datos no tiene la misma x pero aún debe entrar en el mismo sistema de coordenadas.

Como comparten el mismo x su y s, también se puede utilizar matplot:

matplot (x, cbind (y1, y2), pch = 19) 

matplot (x, cbind (y1, y2), pch = 19)

(sin las pchmatplopt trazará los números de las columnas de la matriz y en lugar de puntos)

+0

+1 Veo que te volcaste a la estrategia matplot antes que yo. –

+0

¿cómo puedo anotar los puntos negros y los puntos rojos con y1 e y2, respectivamente? – dacongy

+0

@dacongy: 'pch' acepta símbolos de un carácter (como" A "y" B "o" 1 "y" 2 ") para cada una de las columnas de la matriz y. Si realmente necesitas texto más largo, AFAIK necesitas usar 'text' para cada una de las columnas (o escribir una función de mattext ;-)) – cbeleites

3

Mi solución es usar ggplot2. Se ocupa de este tipo de cosas automáticamente. Lo más importante es organizar los datos de manera apropiada.

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

A continuación, utilice ggplot2 para trazar lo

library(ggplot2) 
ggplot(df, aes(x=x, y=y, color=class)) + geom_point() 

Esto es decir trama de los datos en df, y separar los puntos de class.

La trama generada es enter image description here

Cuestiones relacionadas