Scatterplot con istogrammi marginali in ggplot2


Answers

Questa non è una risposta completamente reattiva, ma è molto semplice. Illustra un metodo alternativo per visualizzare le densità marginali e anche come utilizzare i livelli alfa per l'output grafico che supporta la trasparenza:

scatter <- qplot(x,y, data=xy)  + 
         scale_x_continuous(limits=c(min(x),max(x))) + 
         scale_y_continuous(limits=c(min(y),max(y))) + 
         geom_rug(col=rgb(.5,0,0,alpha=.2))
scatter

Question

C'è un modo per creare grafici a dispersione con istogrammi marginali proprio come nell'esempio qui sotto in ggplot2 ? In Matlab è la funzione scatterhist() e esistono anche equivalenti per R. Tuttavia, non l'ho visto per ggplot2.

Ho iniziato un tentativo creando i singoli grafici ma non so come sistemarli correttamente.

 require(ggplot2)
 x<-rnorm(300)
 y<-rt(300,df=2)
 xy<-data.frame(x,y)
     xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
     yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")

     yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )


     scatter <- qplot(x,y, data=xy)  + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()

e disponendoli con la funzione pubblicata here . Ma per farla breve: esiste un modo per creare questi grafici?




Un'aggiunta, giusto per risparmiare un po 'di tempo in cerca di persone che fanno questo dopo di noi.

Leggende, etichette degli assi, testi degli assi, zecche fanno sì che le trame si allontanino l'una dall'altra, quindi la trama sembrerà brutta e incoerente.

Puoi correggere questo usando alcune di queste impostazioni del tema,

+theme(legend.position = "none",          
       axis.title.x = element_blank(),
       axis.title.y = element_blank(),
       axis.text.x = element_blank(),
       axis.text.y = element_blank(), 
       plot.margin = unit(c(3,-5.5,4,3), "mm"))

e allineare le scale,

+scale_x_continuous(breaks = 0:6,
                    limits = c(0,6),
                    expand = c(.05,.05))

quindi i risultati sembreranno OK:




Poiché non c'era alcuna soluzione soddisfacente per questo tipo di trama quando si confrontano gruppi diversi, ho scritto una function per farlo.

Funziona sia per i dati raggruppati che per quelli non raggruppati e accetta parametri grafici aggiuntivi:

marginal_plot(x = iris$Sepal.Width, y = iris$Sepal.Length)

marginal_plot(x = Sepal.Width, y = Sepal.Length, group = Species, data = iris, bw = "nrd", lm_formula = NULL, xlab = "Sepal width", ylab = "Sepal length", pch = 15, cex = 0.5)




Links