Traccia una variabile numerica rispetto a n variabili numeriche in n grafici

Ho un enorme data frame e vorrei fare alcune trame per avere un’idea delle associazioni tra variabili diverse. Non posso usare

pairs(data) 

perché mi darebbe più di 400 piazzole. Tuttavia, c’è una variabile di risposta a cui sono particolarmente interessato. Pertanto, mi piacerebbe tracciare y contro tutte le variabili, il che ridurrebbe il numero di grafici da n ^ 2 a n. Puoi mostrarmi come si fa? Grazie

EDIT: aggiungo un esempio per motivi di chiarezza. Diciamo che ho il dataframe

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

e la mia variabile di risposta è x3. Quindi mi piacerebbe generare quattro grafici disposti in fila, rispettivamente x1 vs x3, x2 vs x3, un istogramma di x3 e infine x4 vs x3. So come fare ogni trama

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

Comunque non ho idea di come sistemarli in fila. Inoltre, sarebbe bello se ci fosse un modo per fare automaticamente tutti i grafici, senza dover chiamare la trama del comando (o hist) ogni volta. Quando n = 4, non è un grosso problema, ma di solito mi occupo di n = 20 + variabili, quindi può essere un trascinamento.

Potrebbe fare la combinazione di pacchetti reshape2 / ggplot2 / gridExtra . In questo modo non è necessario specificare il numero di grafici. Questo codice funzionerà su qualsiasi numero di variabili esplicative senza modifiche

 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) 

inserisci la descrizione dell'immagine qui

Il pacchetto tidyr aiuta a farlo in modo efficiente. si prega di fare riferimento qui per ulteriori opzioni

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

avresti qualcosa di simile

inserisci la descrizione dell'immagine qui

Ho affrontato lo stesso problema, e non ho alcuna esperienza di ggplot2 , quindi ho creato una funzione usando la plot che prende il frame dei dati, e le variabili da rappresentare come argomenti e generare grafici.

 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 = "") } } 

Gli appunti:

  1. Puoi fornire l'elenco delle variabili da tracciare come yvars , altrimenti yvars tutte le (o le prime 25, a seconda di quale è minore) le variabili nel frame dati rispetto a xvar .
  2. I margini stavano andando fuori limite se il numero di grafici supera 25, quindi ho mantenuto un limite per tracciare solo 25 grafici. Qualsiasi suggerimento per gestirlo piacevolmente è benvenuto.
  3. Anche le etichette dell'asse y vengono rimosse mentre i titoli dei grafici si occupano di esso. l'etichetta dell'asse x è impostata su xvar .

Se il tuo objective è solo quello di farti un’idea delle associazioni tra variabili diverse, puoi anche usare:

 plot(y~., data = foo) 

Non è bello come usare ggplot e non mette automaticamente tutti i grafici in una finestra (anche se puoi cambiarlo usando par(mfrow = c(a, b)) , ma è un modo rapido per ottenere ciò che volere.

Usando le coppie di funzioni, puoi anche specificare una formula per tracciare le diverse variabili che vuoi vedere, invece di usare l’intero set di dati.

Ho provato a replicare l’esempio nella tua domanda.

Quindi, ecco il mio 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) 

Nella formula, ho specificato che volevo tracciare la risposta (foo $ x3), “contro” le variabili x1, x2 e x4.

E questo è il risultato:

inserisci la descrizione dell'immagine qui

Spero che possa aiutarti.