Диаграмма рассеяния со слишком большим количеством точек
Я пытаюсь построить две переменные, где N=700K. проблема в том, что слишком много перекрытий, так что сюжет становится в основном сплошным блоком черного цвета. Есть ли способ иметь "облако" оттенков серого, где темнота графика является функцией количества точек в регионе? Другими словами, вместо того, чтобы показывать отдельные точки, я хочу, чтобы график был "облаком", причем чем больше количество точек в регионе, тем темнее этот регион.
6 ответов:
один из способов справиться с этим-это альфа-смешивание, которое делает каждую точку слегка прозрачной. Таким образом, области кажутся темнее, что на них нанесено больше точек.
это легко сделать в
ggplot2
:df <- data.frame(x = rnorm(5000),y=rnorm(5000)) ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)
еще один удобный способ справиться с этим (и, вероятно, более подходящий для количества очков, которые у вас есть) - это шестиугольное биннинг:
ggplot(df,aes(x=x,y=y)) + stat_binhex()
и есть также регулярные старые прямоугольные биннинг (изображение опущено), который больше похож на вашу традиционную тепловую карту:
ggplot(df,aes(x=x,y=y)) + geom_bin2d()
вы также можете посмотреть . Этот пакет реализует функции, которые были представлены Hadley Wickham еще в 2011 году (http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html).
(в следующем разделе я включаю слой"точки" для иллюстрации.)
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)
однако, это особенности пород, если у вас есть третья переменная для управления для.
# 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)
или другой подход будет использовать
smoothScatter()
:smoothScatter(dat[2:3])
Альфа-смешивание легко сделать с базовой графикой, а также.
df <- data.frame(x = rnorm(5000),y=rnorm(5000)) with(df, plot(x, y, col="#00000033"))
первые шесть чисел после
#
цвет в RGB hex, а последние два-непрозрачность, опять же в hex, поэтому 33 ~ 3/16 непрозрачны.
вы также можете использовать изолинии плотности (
ggplot2
):df <- data.frame(x = rnorm(15000),y=rnorm(15000)) ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()
или объединить контуры плотности с Альфа-смешивание:
ggplot(df,aes(x=x,y=y)) + geom_point(colour="blue", alpha=0.2) + geom_density2d(colour="black")
вы можете найти полезным
hexbin
пакета. Со страницы справки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)
обзор нескольких хороших вариантов в
ggplot2
:library(ggplot2) x <- rnorm(n = 10000) y <- rnorm(n = 10000, sd=2) + x df <- data.frame(x, y)
вариант A: прозрачные точки
o1 <- ggplot(df, aes(x, y)) + geom_point(alpha = 0.05)
вариант B: добавить контуры плотности
o2 <- ggplot(df, aes(x, y)) + geom_point(alpha = 0.05) + geom_density_2d()
опция C: добавить заполненные контуры плотности
o3 <- ggplot(df, aes(x, y)) + stat_density_2d(aes(fill = ..level..), geom = 'polygon') + scale_fill_viridis_c(name = "density") + geom_point(shape = '.')
вариант D: тепловая карта плотности
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')
вариант E: hexbins
o5 <- ggplot(df, aes(x, y)) + geom_hex() + scale_fill_viridis_c() + geom_point(shape = '.', col = 'white')
вариант F: ковры
o6 <- ggplot(df, aes(x, y)) + geom_point(alpha = 0.1) + geom_rug(alpha = 0.01)
объединить в один рисунок:
cowplot::plot_grid(o1, o2, o3, o4, o5, o6, ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr')