Scatterplot ze zbyt dużą liczbą punktów

Staram się wykreślić dwie zmienne, gdzie N=700K. problem polega na tym, że jest zbyt dużo nakładania się, tak, że wykres staje się głównie solidny blok czarny. Czy istnieje możliwość posiadania "chmury" w skali szarości, w której ciemność wykresu jest funkcją liczby punktów w regionie? Innymi słowy, zamiast pokazywać poszczególne punkty, chcę, aby fabuła była "chmura", z większą liczbą punktów w regionie, tym ciemniejszy region.

Author: Ben Bolker, 2011-10-10

6 answers

Jednym ze sposobów radzenia sobie z tym jest mieszanie alfa, które sprawia, że każdy punkt jest lekko przezroczysty. Więc regiony wydają się ciemniejsze, które mają więcej punktów wykreślonych na nich.

To jest Å‚atwe do zrobienia w ggplot2:

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)

Tutaj wpisz opis obrazka

Innym wygodnym sposobem radzenia sobie z tym jest (i prawdopodobnie bardziej odpowiednie dla liczby punktów, które masz) sześciokątne binning:

ggplot(df,aes(x=x,y=y)) + stat_binhex()

Tutaj wpisz opis obrazka

I jest też regularne stare prostokątne binning( obraz pominięty), który jest bardziej jak Twój tradycyjna heatmap:

ggplot(df,aes(x=x,y=y)) + geom_bin2d()
 136
Author: joran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-10 15:13:44

Możesz również rzucić okiem na ggsubplot Pakiet. Pakiet ten implementuje funkcje, które zostały zaprezentowane przez Hadley Wickham w 2011 roku ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html).

(poniżej zamieszczam warstwę "punktów" dla celów ilustracyjnych.)

library(ggplot2)
library(ggsubplot)

# Make up some data
set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each=5000),
                  xvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)),
                  yvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)))


# Scatterplot with subplots (simple)
ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(rep("dummy", length(xvar)), ..count..))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)

Tutaj wpisz opis obrazka

Jest to jednak cecha rocks, jeśli masz trzecią zmienną do kontrolowania.

# Scatterplot with subplots (including a third variable) 

ggplot(dat, aes(x=xvar, y=yvar)) +
  geom_point(shape=1, aes(color = factor(cond))) +
  geom_subplot2d(aes(xvar, yvar,
                     subplot = geom_bar(aes(cond, ..count.., fill = cond))),
                 bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)  

Tutaj wpisz opis obrazka

Lub innym podejściem byłoby użycie smoothScatter():

smoothScatter(dat[2:3])

Tutaj wpisz opis obrazka

 55
Author: majom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-20 15:35:04

Mieszanie Alfa jest łatwe do wykonania również z Grafiką bazową.

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
with(df, plot(x, y, col="#00000033"))

Pierwsze sześć liczb po # to kolor w hex RGB, a dwie ostatnie to nieprzezroczystość, ponownie w hex, więc 33 ~ 3/16 nieprzezroczystość.

Tutaj wpisz opis obrazka

 50
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 20:40:17

Można również użyć linii konturu gęstości (ggplot2):

df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()

Tutaj wpisz opis obrazka

Lub połączyć kontury gęstości z mieszaniem alfa:

ggplot(df,aes(x=x,y=y)) + 
    geom_point(colour="blue", alpha=0.2) + 
    geom_density2d(colour="black")

Tutaj wpisz opis obrazka

 44
Author: ROLO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 10:01:55

Może okazać się przydatny pakiet hexbin. Ze strony pomocy hexbinplot:

library(hexbin)
mixdata <- data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)),
                      y = c(rnorm(5000),rnorm(5000,2,3)),
                      a = gl(2, 5000))
hexbinplot(y ~ x | a, mixdata)

hexbinplot

 28
Author: Oscar Perpiñán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 13:32:22

PrzeglÄ…d kilku dobrych opcji w ggplot2:

library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

Opcja a: przezroczyste punkty

o1 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05)

Opcja B: dodaj kontury gęstości

o2 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05) +
  geom_density_2d()

Opcja C: dodaj wypełnione kontury gęstości

o3 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = ..level..), geom = 'polygon') +
  scale_fill_viridis_c(name = "density") +
  geom_point(shape = '.')

Opcja D: gęstość heatmap

o4 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = ..density..), geom = 'raster', contour = FALSE) +       
  scale_fill_viridis_c() +
  coord_cartesian(expand = FALSE) +
  geom_point(shape = '.', col = 'white')

Opcja E: hexbins

o5 <- ggplot(df, aes(x, y)) +
  geom_hex() +
  scale_fill_viridis_c() +
  geom_point(shape = '.', col = 'white')

Opcja F: dywany

o6 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.1) +
  geom_rug(alpha = 0.01)

Połącz w jedną figurę:

cowplot::plot_grid(o1, o2, o3, o4, o5, o6,
                   ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr')

Tutaj wpisz opis obrazka

 25
Author: Axeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 09:33:08