Trace una variable numérica contra n variables numéricas en n gráficos

Tengo un gran dataframe y me gustaría hacer algunas ttwigs para tener una idea de las asociaciones entre las diferentes variables. No puedo usar

pairs(data) 

, porque eso me daría más de 400 plots. Sin embargo, hay una variable de respuesta y en la que estoy particularmente interesado. Por lo tanto, me gustaría trazar y contra todas las variables, lo que reduciría el número de trazados de n ^ 2 a n. ¿Puedes mostrarme cómo hacerlo? Gracias

EDITAR: agrego un ejemplo por el bien de la claridad. Digamos que tengo el dataframe

 foo=data.frame(x1=1:10,x2=seq(0.1,1,0.1),x3=-7:2,x4=runif(10,0,1)) 

y mi variable de respuesta es x3. Entonces me gustaría generar cuatro gráficos ordenados en una fila, respectivamente x1 vs x3, x2 vs x3, un histogtwig de x3 y finalmente x4 vs x3. Sé cómo hacer cada ttwig

 plot(foo$x1,foo$x3) plot(foo$x2,foo$x3) hist(foo$x3) plot(foo$x4,foo$x3) 

Sin embargo, no tengo idea de cómo organizarlos en una fila. Además, sería genial si hubiera una forma de hacer automáticamente todas las n plots, sin tener que llamar al comando plot (o hist) cada vez. Cuando n = 4, no es un problema tan grave, pero normalmente trato con n = 20 + variables, por lo que puede ser un obstáculo.

Podría hacer la combinación de paquetes reshape2 / ggplot2 / gridExtra . De esta forma, no es necesario especificar el número de plots. Este código funcionará en cualquier cantidad de variables explicativas sin modificaciones

 foo <- data.frame(x1=1:10,x2=seq(0.1,1,0.1),x3=-7:2,x4=runif(10,0,1)) library(reshape2) foo2 <- melt(foo, "x3") library(ggplot2) p1 <- ggplot(foo2, aes(value, x3)) + geom_point() + facet_grid(.~variable) p2 <- ggplot(foo, aes(x = x3)) + geom_histogram() library(gridExtra) grid.arrange(p1, p2, ncol=2) 

enter image description here

El paquete tidyr ayuda a hacer esto de manera eficiente. por favor, consulte aquí para más opciones

 data %>% gather(-y_value, key = "some_var_name", value = "some_value_name") %>% ggplot(aes(x = some_value_name, y = y_value)) + geom_point() + facet_wrap(~ some_var_name, scales = "free") 

obtendrías algo como esto

enter image description here

ggplot2 el mismo problema, y ​​no tengo ninguna experiencia de ggplot2 , así que creé una función usando un plot que toma el dataframe y las variables que se trazarán como argumentos y generar gráficos.

 dfplot <- function(data.frame, xvar, yvars=NULL) { df <- data.frame if (is.null(yvars)) { yvars = names(data.frame[which(names(data.frame)!=xvar)]) } if (length(yvars) > 25) { print("Warning: number of variables to be plotted exceeds 25, only first 25 will be plotted") yvars = yvars[1:25] } #choose a format to display charts ncharts <- length(yvars) nrows = ceiling(sqrt(ncharts)) ncols = ceiling(ncharts/nrows) par(mfrow = c(nrows,ncols)) for(i in 1:ncharts){ plot(df[,xvar],df[,yvars[i]],main=yvars[i], xlab = xvar, ylab = "") } } 

Notas:

  1. Puede proporcionar la lista de variables que se yvars como yvars ; de lo contrario, yvars todas (o las primeras 25, lo que sea menor) las variables en el dataframe contra xvar .
  2. Los márgenes se salían de los límites si el número de plots excedía los 25, por lo que mantuve un límite para trazar solo 25 gráficos. Cualquier sugerencia para manejar esto bien es bienvenida.
  3. Además, las tags del eje y se eliminan a medida que los títulos de los gráficos se encargan de ello. La etiqueta del eje x se establece en xvar .

Si su objective es solo tener una idea de las asociaciones entre las diferentes variables, también puede usar:

 plot(y~., data = foo) 

No es tan agradable como usar ggplot y no coloca automáticamente todos los gráficos en una ventana (aunque puedes cambiar eso usando par(mfrow = c(a, b)) , pero es una manera rápida de obtener lo que querer.

Usando los pares de funciones, también puede especificar una fórmula para graficar las diferentes variables que desea ver, en lugar de usar todo el conjunto de datos.

Traté de replicar el ejemplo en tu pregunta.

Entonces, aquí está mi MWE:

 foo=data.frame(x1=1:10,x2=seq(0.1,1,0.1),x3=-7:2,x4=runif(10,0,1)) pairs(foo$x3 ~ foo$x1 + foo$x2 + foo$x4) 

En la fórmula, especifiqué que quería trazar la respuesta (foo $ x3), “contra” las variables x1, x2 y x4.

Y aqui esta el resultado:

enter image description here

Espero que pueda ayudarte.