N = 700Kの2つの変数をプロットしようとしています。問題は、オーバーラップが多すぎるため、プロットがほとんど黒のベタブロックになることです。プロットの暗さが領域内の点の数の関数であるグレースケール「クラウド」を使用する方法はありますか?言い換えると、個々のポイントを表示する代わりに、プロットを「雲」にして、領域内のポイント数が多いほど、その領域を暗くします。
N = 700Kの2つの変数をプロットしようとしています。問題は、オーバーラップが多すぎるため、プロットがほとんど黒のベタブロックになることです。プロットの暗さが領域内の点の数の関数であるグレースケール「クラウド」を使用する方法はありますか?言い換えると、個々のポイントを表示する代わりに、プロットを「雲」にして、領域内のポイント数が多いほど、その領域を暗くします。
回答:
これに対処する1つの方法は、各ポイントをわずかに透明にするアルファブレンディングです。そのため、より多くの点がプロットされている領域はより暗く表示されます。
これは簡単に実行できますggplot2
。
df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)
これに対処するもう1つの便利な方法は、六角形のビニングです(おそらく、ポイントの数に適しています)。
ggplot(df,aes(x=x,y=y)) + stat_binhex()
また、通常の古い長方形のビニング(画像は省略)もあります。これは、従来のヒートマップに似ています。
ggplot(df,aes(x=x,y=y)) + geom_bin2d()
scale_fill_gradient()
独自の低色と高色を使用して指定するかscale_fill_brewer()
、連続パレットの1つを使用して選択します。
geom_point()
個々の点を使用してプロットする必要があります。
ggsubplot
パッケージもご覧いただけます。このパッケージは、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)
ただし、制御する第3の変数がある場合、これはすばらしい機能です。
# 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])
のいくつかの優れたオプションの概要ggplot2
:
library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)
o1 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.05)
o2 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.05) +
geom_density_2d()
o3 <- ggplot(df, aes(x, y)) +
stat_density_2d(aes(fill = stat(level)), geom = 'polygon') +
scale_fill_viridis_c(name = "density") +
geom_point(shape = '.')
o4 <- ggplot(df, aes(x, y)) +
stat_density_2d(aes(fill = stat(density)), geom = 'raster', contour = FALSE) +
scale_fill_viridis_c() +
coord_cartesian(expand = FALSE) +
geom_point(shape = '.', col = 'white')
o5 <- ggplot(df, aes(x, y)) +
geom_hex() +
scale_fill_viridis_c() +
geom_point(shape = '.', col = 'white')
o6 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.1) +
geom_rug(alpha = 0.01)
1つの図にまとめます。
cowplot::plot_grid(
o1, o2, o3, o4, o5, o6,
ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr'
)
アルファブレンディングは、ベースグラフィックでも簡単に実行できます。
df <- data.frame(x = rnorm(5000),y=rnorm(5000))
with(df, plot(x, y, col="#00000033"))
後の最初の6つの数字#
はRGBの16進数の色で、最後の2つは不透明度で、これも16進数なので、33〜3/16番目の不透明度です。
あなたは便利な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)
geom_pointdenisty
ggpointdensity
パッケージから(最近Lukas KremerとSimon Anders(2019)が開発)、密度と個々のデータポイントを同時に視覚化できます。
library(ggplot2)
# install.packages("ggpointdensity")
library(ggpointdensity)
df <- data.frame(x = rnorm(5000), y = rnorm(5000))
ggplot(df, aes(x=x, y=y)) + geom_pointdensity() + scale_color_viridis_c()