trazar dos vectores de datos en un diagrama de dispersión GGPLOT2 usando R
Pregunta
He estado experimentando con ambos ggplot2
y lattice
para graficar paneles de datos.Estoy teniendo algunos problemas para entender ggplot2
modelo.En particular, ¿cómo puedo trazar un diagrama de dispersión con dos conjuntos de datos en cada panel?
en lattice
Yo podría hacer esto:
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
y eso me daría un panel para cada State_CD con cada columna
Puedo hacer una columna con ggplot2
:
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2)
+ facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
Lo que no puedo asimilar es cómo agregar Actual_value al ggplot anterior.
EDITAR Hadley señaló que esto realmente sería más fácil con un ejemplo reproducible.Aquí hay un código que parece funcionar.¿Existe una forma mejor o más concisa de hacer esto con ggplot?¿Por qué la sintaxis para agregar otro conjunto de puntos a ggplot es tan diferente a la de agregar el primer conjunto de datos?
library(lattice)
library(ggplot2)
#make some example data
dd<-data.frame(matrix(rnorm(108),36,3),c(rep("A",24),rep("B",24),rep("C",24)))
colnames(dd) <- c("Predicted_value", "Actual_value", "x_value", "State_CD")
#plot with lattice
xyplot(Predicted_value + Actual_value ~ x_value | State_CD, data=dd)
#plot with ggplot
pg <- ggplot(dd, aes(x_value, Predicted_value)) + geom_point(shape = 2) + facet_wrap(~ State_CD) + opts(aspect.ratio = 1)
print(pg)
pg + geom_point(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
La salida de la red se ve así:
(fuente: cerebralmastication.com)
y ggplot se ve así:
(fuente: cerebralmastication.com)
Solución
Simplemente siguiendo lo que sugirió Ian:para ggplot2 realmente quieres todo el material del eje y en una columna con otra columna como factor que indica cómo quieres decorarlo.Es fácil hacer esto con melt
.Esto es:
qplot(x_value, value,
data = melt(dd, measure.vars=c("Predicted_value", "Actual_value")),
colour=variable) + facet_wrap(~State_CD)
Esto es lo que me parece:
(fuente: princeton.edu)
Para tener una idea de lo que melt
lo que realmente está haciendo, aquí está el encabezado:
> head(melt(dd, measure.vars=c("Predicted_value", "Actual_value")))
x_value State_CD variable value
1 1.2898779 A Predicted_value 1.0913712
2 0.1077710 A Predicted_value -2.2337188
3 -0.9430190 A Predicted_value 1.1409515
4 0.3698614 A Predicted_value -1.8260033
5 -0.3949606 A Predicted_value -0.3102753
6 -0.1275037 A Predicted_value -1.2945864
Verá, "funde" Valor_predicho y Valor_real en una columna llamada value
y agrega otra columna llamada variable
informándole de qué columna proviene originalmente.
Otros consejos
Actualizar : varios años ya, que casi siempre se utiliza el método de Jonathan (a través de la paquete tidyr) con ggplot2. Mi respuesta a continuación las obras en caso de necesidad, pero se hace tediosa rápido cuando se tiene más de 3 variables.
Estoy seguro de Hadley tendrá una mejor respuesta, pero - la sintaxis es diferente porque la sintaxis ggplot(dd,aes())
es (creo) destinado principalmente para el trazado de una sola variable. Para dos, me gustaría utilizar:
ggplot() +
geom_point(data=dd, aes(x_value, Actual_value, group=State_CD), colour="green") +
geom_point(data=dd, aes(x_value, Predicted_value, group=State_CD), shape = 2) +
facet_wrap(~ State_CD) +
theme(aspect.ratio = 1)
Tirando del primer conjunto de puntos de la ggplot () le da la misma sintaxis que la segunda. Me parece más fácil de tratar porque la sintaxis es la misma y se hace hincapié en la "Gramática de gráficos" que está en el centro de ggplot2.
es posible que quieran cambiar la forma de sus datos un poco, para que tenga una variable eje y, con una variable de factor adicional que indica si es una variable previsto o real.
Es esto algo parecido a lo que usted está tratando de hacer?
dd<-data.frame(type=rep(c("Predicted_value","Actual_value"),20),y_value=rnorm(40),
x_value=rnorm(40),State_CD=rnorm(40)>0)
qplot(x_value,y_value,data=dd,colour=type,facets=.~State_CD)
bien después de la publicación de la pregunta que me encontré con este hilo de Ayuda R que pueden me han ayudado. Parece que puedo hacer esto:
pg + geom_line(data=dd,aes(x_value, Actual_value,group=State_CD), colour="green")
es que una buena manera de hacer las cosas? Es extraño para mí, porque la adición del segundo elemento tiene una sintaxis totalmente diferente a la primera.