varias tutorial qplot propiedades graficas ggplot español cheatsheet r ggplot2

tutorial - Abordar x e y en aes por número de variable



qplot (4)

Su problema es que aes no conoce el entorno de su función y solo se ve dentro global environment . Entonces, la variable dat declarada dentro de la función no es visible para la función aes ggplot2 a menos que la pase explícitamente como sigue :

showplot1<-function(indata, inx, iny) { dat <- indata p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]), environment = environment()) p <- p + geom_point(size=4, alpha = 0.5) print(p) }

Tenga en cuenta el argumento environment = environment() dentro del ggplot() . Debería funcionar ahora.

Necesito dibujar un diagrama de dispersión con las variables de direccionamiento por sus números de columna en lugar de nombres, es decir, en lugar de ggplot(dat, aes(x=Var1, y=Var2)) Necesito algo como ggplot(dat, aes(x=dat[,1], y=dat[,2])) . (Digo ''algo'' porque este último no funciona).

Aquí está mi código:

showplot1<-function(indata, inx, iny){ dat<-indata print(nrow(dat)); # this is just to show that object ''dat'' is defined p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny])) p + geom_point(size=4, alpha = 0.5) } testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) showplot1(indata=testdata, inx=2, iny=3)

# Error in eval(expr, envir, enclos) : object ''dat'' not found


Sugiero usar aes_q lugar de pasar vectores a aes (respuesta de @ Arun). Puede parecer un poco más complicado, pero es más flexible, por ejemplo, al actualizar los datos.

showplot1 <- function(indata, inx, iny){ p <- ggplot(indata, aes_q(x = as.name(names(indata)[inx]), y = as.name(names(indata)[iny]))) p + geom_point(size=4, alpha = 0.5) }

Y esta es la razón por la cual es preferible:

# test data (using non-standard names) testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata) <- c("a-b", "c-d", "e-f", "g-h", "i-j") testdata2 <- data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata2) <- c("a-b", "c-d", "e-f", "g-h", "i-j") # works showplot1(indata=testdata, inx=2, iny=3) # this update works in the aes_q version showplot1(indata=testdata, inx=2, iny=3) %+% testdata2

Nota: A partir de ggplot2 v2.0.0 aes_q() se ha reemplazado por aes_() para que sea coherente con las versiones SE de las funciones de NSE en otros paquetes.


Tratar:

showplot1 <- function(indata, inx, iny) { x <- names(indata)[inx] y <- names(indata)[iny] p <- ggplot(indata, aes_string(x = x, y = y)) p + geom_point(size=4, alpha = 0.5) }

Editado para mostrar lo que está sucediendo - aes_string usa argumentos entrecomillados, los nombres los obtiene usando tus números.


solución provisional que encontré por el momento:

showplot1<-function(indata, inx, iny){ dat<-data.frame(myX=indata[,inx], myY=indata[,iny]) print(nrow(dat)); # this is just to show that object ''dat'' is defined p <- ggplot(dat, aes(x=myX, y=myY)) p + geom_point(size=4, alpha = 0.5) }

Pero realmente no me gusta porque en mi código real, necesito otras columnas de indata y aquí tendré que definirlas todas explícitamente en dat<- ...