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