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