Scatterplot with marginal histograms in ggplot2 Scatterplot with marginal histograms in ggplot2 r r

Scatterplot with marginal histograms in ggplot2


This is not a completely responsive answer but it is very simple. It illustrates an alternate method to display marginal densities and also how to use alpha levels for graphical output that supports transparency:

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

enter image description here


This might be a bit late, but I decided to make a package (ggExtra) for this since it involved a bit of code and can be tedious to write. The package also tries to address some common issue such as ensuring that even if there is a title or the text is enlarged, the plots will still be inline with one another.

The basic idea is similar to what the answers here gave, but it goes a bit beyond that. Here is an example of how to add marginal histograms to a random set of 1000 points. Hopefully this makes it easier to add histograms/density plots in the future.

Link to ggExtra package

library(ggplot2)df <- data.frame(x = rnorm(1000, 50, 10), y = rnorm(1000, 50, 10))p <- ggplot(df, aes(x, y)) + geom_point() + theme_classic()ggExtra::ggMarginal(p, type = "histogram")

enter image description here


The gridExtra package should work here. Start by making each of the ggplot objects:

hist_top <- ggplot()+geom_histogram(aes(rnorm(100)))empty <- ggplot()+geom_point(aes(1,1), colour="white")+         theme(axis.ticks=element_blank(),                panel.background=element_blank(),                axis.text.x=element_blank(), axis.text.y=element_blank(),                          axis.title.x=element_blank(), axis.title.y=element_blank())scatter <- ggplot()+geom_point(aes(rnorm(100), rnorm(100)))hist_right <- ggplot()+geom_histogram(aes(rnorm(100)))+coord_flip()

Then use the grid.arrange function:

grid.arrange(hist_top, empty, scatter, hist_right, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))

plot