varias superponer modificar lineas graficos graficas ggplot ejes r plot ggplot2 r-faq

superponer - varias graficas en r



Trazar dos gráficas en la misma parcela en R (15)

Al construir parcelas multicapa se debe considerar el paquete ggplot . La idea es crear un objeto gráfico con estética básica y mejorarlo de forma incremental.

ggplot estilo ggplot requiere que los datos se empaqueten en data.frame .

# Data generation x <- seq(-2, 2, 0.05) y1 <- pnorm(x) y2 <- pnorm(x,1,1) df <- data.frame(x,y1,y2)

Solución básica:

require(ggplot2) ggplot(df, aes(x)) + # basic graphical object geom_line(aes(y=y1), colour="red") + # first layer geom_line(aes(y=y2), colour="green") # second layer

Aquí el + operator se usa para agregar capas adicionales al objeto básico.

Con ggplot usted tiene acceso a objetos gráficos en cada etapa del trazado. Por ejemplo, la configuración habitual paso a paso puede verse así:

g <- ggplot(df, aes(x)) g <- g + geom_line(aes(y=y1), colour="red") g <- g + geom_line(aes(y=y2), colour="green") g

g produce el gráfico y puede verlo en cada etapa (bueno, después de la creación de al menos una capa). Otros encantamientos de la trama también se hacen con objeto creado. Por ejemplo, podemos agregar etiquetas para ejes:

g <- g + ylab("Y") + xlab("X") g

Final g ve como:

ACTUALIZACIÓN (2013-11-08):

Como se señaló en los comentarios, la filosofía de ggplot sugiere utilizar datos en formato largo. Puede consultar esta respuesta https://stackoverflow.com/a/19039094/1796914 para ver el código correspondiente.

Me gustaría trazar y1 y y2 en la misma parcela.

x <- seq(-2, 2, 0.05) y1 <- pnorm(x) y2 <- pnorm(x, 1, 1) plot(x, y1, type = "l", col = "red") plot(x, y2, type = "l", col = "green")

Pero cuando lo hago así, no se trazan juntos en la misma trama.

En Matlab se puede hold on , pero ¿alguien sabe cómo hacerlo en R?


Como lo describe @redmode, puede trazar las dos líneas en el mismo dispositivo gráfico usando ggplot . Sin embargo, los datos en esa respuesta estaban en un formato ''ancho'', mientras que en ggplot generalmente es más conveniente mantener los datos en un marco de datos en un formato ''largo''. Luego, al utilizar diferentes ''variables de agrupación'' en los argumentos de aes thetics, las propiedades de la línea, como el tipo de línea o el color, variarán de acuerdo con la variable de agrupación y aparecerán las leyendas correspondientes. En este caso, podemos usar el colour aes sthetics, que combina el color de las líneas con diferentes niveles de una variable en el conjunto de datos (aquí: y1 vs y2). Pero primero tenemos que fundir los datos de formato ancho a largo, utilizando la función ''melt'' del paquete reshape2 .

library(ggplot2) library(reshape2) # original data in a ''wide'' format x <- seq(-2, 2, 0.05) y1 <- pnorm(x) y2 <- pnorm(x, 1, 1) df <- data.frame(x, y1, y2) # melt the data to a long format df2 <- melt(data = df, id.vars = "x") # plot, using the aesthetics argument ''colour'' ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()


Creo que la respuesta que estás buscando es:

plot(first thing to plot) plot(second thing to plot,add=TRUE)


En lugar de mantener los valores a trazar en una matriz, almacénelos en una matriz. Por defecto, toda la matriz se tratará como un conjunto de datos. Sin embargo, si agrega el mismo número de modificadores a la gráfica, por ejemplo, col (), ya que tiene filas en la matriz, R descubrirá que cada fila debe tratarse de forma independiente. Por ejemplo:

x = matrix( c(21,50,80,41), nrow=2 ) y = matrix( c(1,2,1,2), nrow=2 ) plot(x, y, col("red","blue")

Esto debería funcionar a menos que sus conjuntos de datos sean de diferentes tamaños.


La plot(x1,y1,x2,y2) idiomática de Matlab plot(x1,y1,x2,y2) se puede traducir en R con ggplot2 por ejemplo de esta manera:

x1 <- seq(1,10,.2) df1 <- data.frame(x=x1,y=log(x1),type="Log") x2 <- seq(1,10) df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic") df <- rbind(df1,df2) library(ggplot2) ggplot(df)+geom_line(aes(x,y,colour=type))

Inspirado por los trazados de líneas duales de Tingting Zhao con diferentes rangos de eje x Usando ggplot2 .


Podrías usar la API de Plotly R para estilizar esto. A continuación se muestra el código para hacerlo, y la versión en vivo de este gráfico está here .

# call Plotly and enter username and key library(plotly) p <- plotly(username="Username", key="API_KEY") # enter data x <- seq(-2, 2, 0.05) y1 <- pnorm(x) y2 <- pnorm(x,1,1) # format, listing y1 as your y. First <- list( x = x, y = y1, type = ''scatter'', mode = ''lines'', marker = list( color = ''rgb(0, 0, 255)'', opacity = 0.5 ) ) # format again, listing y2 as your y. Second <- list( x = x, y = y2, type = ''scatter'', mode = ''lines'', opacity = 0.8, marker = list( color = ''rgb(255, 0, 0)'' ) ) # style background color plot_bgcolor = ''rgb(245,245,247)'' # and structure the response. Plotly returns a URL when you make the call. response<-p$plotly(list(First,Second), kwargs = list(layout=layout))

Revelación completa: estoy en el equipo de Plotly.


Puedes usar puntos para el sobreplot, eso es.

plot(x1, y1,col=''red'') points(x2,y2,col=''blue'')


Si está utilizando gráficos base (es decir, no gráficos de celosía / cuadrícula), puede imitar la función de retención de MATLAB utilizando las funciones de puntos / líneas / polígonos para agregar detalles adicionales a sus parcelas sin comenzar una nueva gráfica. En el caso de un diseño de puntos múltiples, puede usar par(mfg=...) para elegir a qué parcela agregarle cosas.


Si quieres dividir la pantalla, puedes hacerlo así:

(por ejemplo, para 2 parcelas juntas)

par(mfrow=c(1,2)) plot(x) plot(y)

Link de referencia


También podemos usar la librería de celosía.

library(lattice) x <- seq(-2,2,0.05) y1 <- pnorm(x) y2 <- pnorm(x,1,1) xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

Para colores especificos

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))


También puedes crear tu trama usando ggvis :

library(ggvis) x <- seq(-2, 2, 0.05) y1 <- pnorm(x) y2 <- pnorm(x,1,1) df <- data.frame(x, y1, y2) df %>% ggvis(~x, ~y1, stroke := ''red'') %>% layer_paths() %>% layer_paths(data = df, x = ~x, y = ~y2, stroke := ''blue'')

Esto creará la siguiente trama:


También puedes usar par y plot en el mismo gráfico pero con diferentes ejes. Algo como sigue:

plot( x, y1, type="l", col="red" ) par(new=TRUE) plot( x, y2, type="l", col="green" )

Si lees en detalle sobre par en R , podrás generar gráficos realmente interesantes. Otro libro para mirar es R Graphics de Paul Murrel.


Usa la función matplot :

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

use esto si y1 y y2 se evalúan en los mismos puntos x . Escala el eje Y para adaptarse a lo que sea más grande ( y1 o y2 ), a diferencia de algunas de las otras respuestas aquí que recortarán y2 si se hace más grande que y1 (las soluciones de ggplot generalmente están de acuerdo con esto).

Alternativamente, y si las dos líneas no tienen las mismas coordenadas x, establezca los límites del eje en la primera gráfica y agregue:

x1 <- seq(-2, 2, 0.05) x2 <- seq(-3, 3, 0.05) y1 <- pnorm(x1) y2 <- pnorm(x2,1,1) plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red") lines(x2,y2,col="green")

Estoy sorprendido de que Q tenga 4 años y nadie haya mencionado matplot o x/ylim ...


lines() o points() se agregarán al gráfico existente, pero no crearán una nueva ventana. Así que tendrías que hacer

plot(x,y1,type="l",col="red") lines(x,y2,col="green")


tl; dr: Desea utilizar una curve (con add=TRUE ) o lines .

No estoy de acuerdo con par(new=TRUE) porque eso hará doble impresión de marcas de verificación y etiquetas de eje. P.ej

La salida de la plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) .

¡Mira lo mal que están las etiquetas del eje vertical! Dado que los rangos son diferentes, necesitaría establecer ylim=c(lowest point between the two functions, highest point between the two functions) , que es menos fácil de lo que estoy a punto de mostrarle --- y mucho menos fácil si Usted quiere agregar no solo dos curvas, sino muchas.

Lo que siempre me confundió sobre el trazado es la diferencia entre la curve y las lines . (Si no puedes recordar que estos son los nombres de los dos comandos de trazado importantes, solo sing ).

Aquí está la gran diferencia entre la curve y las lines .

curve dibujará una función, como curve(sin) . lines trazan puntos con valores de x e y, como: lines( x=0:10, y=sin(0:10) ) .

Y aquí hay una diferencia menor: la curve debe llamarse con add=TRUE para lo que estás tratando de hacer, mientras que las lines ya suponen que estás agregando a un trazado existente.

Aquí está el resultado de llamar a la plot(0:2); curve(sin) plot(0:2); curve(sin) .

Detrás de escena, echa un vistazo a los methods(plot) . Y verifique el body( plot.function )[[5]] . Cuando se llama plot(sin) R se da cuenta de que sin es una función (no valores y) y utiliza el método plot.function , que termina por llamar curve . Así que la curve es la herramienta destinada a manejar funciones.