2012-04-18 17 views
10

Obecnie pracuję nad projektem, który polega na tworzeniu działek bardzo podobnych do przykładów na stronie gldplot2 0.9.0 Hadleya dotyczącej stat_density2d().ggplot2: Ustaw alfa = 0 dla pewnych punktów w zależności od wartości wypełnienia

library(ggplot2) 
dsmall <- diamonds[sample(nrow(diamonds), 1000), ] 
d <- ggplot(dsmall, aes(carat, price)) + xlim(1,3) 
d + stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) 
last_plot() + scale_fill_gradient(limits=c(1e-5,8e-4)) 

enter image description here

Teraz, co walczę o to sposób na zasadzie włącz alfa off (alfa = 0) dla wszystkich płytek nie w wypełnieniu zasięgu. Tak więc każda szara płytka widoczna na obrazie powinna być ustawiona na 0. To sprawi, że obraz będzie dużo ładniejszy, szczególnie gdy na przykład nakładasz się na mapę.

Jeśli ktoś ma jakieś sugestie, byłoby to bardzo cenne.

+3

Szary obszar kontrolowany przez na.value argumentu scale_fill_gradient, ale nawet wtedy, gdy określenie przezroczystego koloru (jak na.value = RGB (1,1,1,0)) jest nieprzejrzysty, więc musi być coś jeszcze. – Fojtasek

+0

W porządku, więc być może, jeśli możemy ustawić granice scale_alpha_continuous, aby były zależne od wartości wypełnienia (gęstości), a następnie ustaw alfa na.value = 0 ... –

+0

bez powodzenia, chociaż ustawienie "gray90" sprawia, że wygląda * prawie * OK, ponieważ jest to kolor siatki tła ... Podejrzewam, że jest to problem "ggplot" (buglet/wishlist?) ... prawdopodobnie powiązany z adresem https://github.com/hadley/ggplot2/issues/475? –

Odpowiedz

9

To wydaje się działać:

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., 
    alpha=cut(..density..,breaks=c(0,1e-5,Inf))), 
    contour = FALSE)+ 
scale_alpha_manual(values=c(0,1),guide="none") 

enter image description here

+0

Idealny! Dziękuję za pomoc, Ben. –

+0

To jest niesamowite, bardzo mi pomogło. Dałbym 3 przegrane, gdybym mógł. – cengel

11

Inną możliwością, tylko przy użyciu ifelse zamiast cut.

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., alpha = ifelse(..density.. < 1e-5, 0, 1)), 
    contour = FALSE) + 
scale_alpha_continuous(range = c(0, 1), guide = "none") 

enter image description here

+0

To również działa świetnie. Czy możesz wyjaśnić, dlaczego nie wystarczy ustawić 'alpha' tylko w opcjach' aes (..) ', ale dlaczego przezroczystość obszaru wypełnienia może być kontrolowana tylko przez ustawienie zakresu za pomocą' scale_alpha_continuous'? Na przykład użyłem 'alpha = ifelse (.. density .. <1e-5, 0, 0.7)' i 'scale_alpha_continuous (range = c (0, 0.7))', aby obszar wypełnienia był nieco przezroczysty. – cengel

Powiązane problemy