2013-06-28 12 views
18

Jak można rozłożyć wykresy z przezroczystymi literami alfa, bez skalowania w R, jak na tej figurze?wykres rozrzutu z przezroczystymi alfa histogramami w R

Wygląda na to, że nie został wykonany w ggplot2. enter image description here

czy ktoś wie, jakie polecenie jest używane?

+0

Wątek pobiera zamknięciu, ale może nie do końca tam, gdzie chcesz być: http://stackoverflow.com/questions/8545035/scatterplot-with-marginal-histograms-in- ggplot2 –

+1

Zobacz także http://blog.mckuhn.de/2009/09/learning-ggplot2-2d-plot-with.html –

Odpowiedz

33
library(ggplot2) 
library(gridExtra) 

set.seed(42) 
DF <- data.frame(x=rnorm(100,mean=c(1,5)),y=rlnorm(100,meanlog=c(8,6)),group=1:2) 

p1 <- ggplot(DF,aes(x=x,y=y,colour=factor(group))) + geom_point() + 
    scale_x_continuous(expand=c(0.02,0)) + 
    scale_y_continuous(expand=c(0.02,0)) + 
    theme_bw() + 
    theme(legend.position="none",plot.margin=unit(c(0,0,0,0),"points")) 

theme0 <- function(...) theme(legend.position = "none", 
           panel.background = element_blank(), 
           panel.grid.major = element_blank(), 
           panel.grid.minor = element_blank(), 
           panel.margin = unit(0,"null"), 
           axis.ticks = element_blank(), 
           axis.text.x = element_blank(), 
           axis.text.y = element_blank(), 
           axis.title.x = element_blank(), 
           axis.title.y = element_blank(), 
           axis.ticks.length = unit(0,"null"), 
           axis.ticks.margin = unit(0,"null"), 
           panel.border=element_rect(color=NA),...) 

p2 <- ggplot(DF,aes(x=x,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    scale_x_continuous(breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(breaks=NULL,expand=c(0.02,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(1,0,0,2.2),"lines")) 

p3 <- ggplot(DF,aes(x=y,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    coord_flip() + 
    scale_x_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(0,1,1.2,0),"lines")) 

grid.arrange(arrangeGrob(p2,ncol=2,widths=c(3,1)), 
      arrangeGrob(p1,p3,ncol=2,widths=c(3,1)), 
      heights=c(1,3)) 

enter image description here

Edit:

Nie mogłem dowiedzieć się, co powoduje, że przestrzeń poniżej gęstości geoms. Możesz manipulować marginesami, aby tego uniknąć, ale tak naprawdę nie lubię.

p2 <- ggplot(DF,aes(x=x,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    scale_x_continuous(breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(breaks=NULL,expand=c(0.00,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(1,0,-0.48,2.2),"lines")) 

p3 <- ggplot(DF,aes(x=y,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    coord_flip() + 
    scale_x_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(labels = NULL,breaks=NULL,expand=c(0.00,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(0,1,1.2,-0.48),"lines")) 

enter image description here

+0

bardzo ładne! jak jednak można zagęścić wykresy gęstości do osi, tak aby dotykały obwiedni działek jak na oryginalnym rysunku? – user248237dfsf

0

Nie mam pojęcia, czy istnieje pakiet, który robi to bezpośrednio, ale jestem pewien, że to może zrobić w R. Przejrzystość jest łatwa: dodajesz kolejne dwie cyfry do specyfikacji RGB koloru dla podana przezroczystość:

#FF0000 # red 
#FF0000FF # full opacity 
#FF000000 # full transparency 

Łączenie różnych działek jest również łatwe dzięki funkcji layout. Jeśli chodzi o wykres gęstości pionowej, jest on taki sam jak wykres poziomy z przełączonymi x i y. Przykład podany here można łatwo rozszerzyć, aby uwzględnić kolory, mniejsze marginesy itp. Mogę spróbować wymyślić bardziej złożony przykład, jeśli ten opis nie jest wystarczający.

Powiązane problemy