点が多すぎる散布図


126

N = 700Kの2つの変数をプロットしようとしています。問題は、オーバーラップが多すぎるため、プロットがほとんど黒のベタブロックになることです。プロットの暗さが領域内の点の数の関数であるグレースケール「クラウド」を使用する方法はありますか?言い換えると、個々のポイントを表示する代わりに、プロットを「雲」にして、領域内のポイント数が多いほど、その領域を暗くします。


4
:あなたがヒートマップを探しているように聞こえる flowingdata.com/2010/01/21/...

回答:


145

これに対処する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()

1
どうすれば色を変更できますか?青から黒のスケールになりましたが、緑の青のスケールを取得したいと思います。
user1007742 14

@ user1007742 scale_fill_gradient()独自の低色と高色を使用して指定するかscale_fill_brewer()、連続パレットの1つを使用して選択します。
joran

@joranありがとう、それは現在機能しています。ポイントのタイプ/形状を変更してみませんか?六角形または正方形のいずれかが表示されます。シンプルなドットが欲しいだけです。geom_point()を使用すると、エラーが発生します。
user1007742 2014

1
@ user1007742まあ、それは理由のために「六角ビニング」と呼ばれています!;)「ポイント」をプロットするのではなく、領域全体を六角形(または長方形)のビンに分割し、そのビンにあるポイントの数に基づいてビンに色を付けるだけです。つまり、簡単な答えは「できない」です。異なる形状が必要な場合は、geom_point()個々の点を使用してプロットする必要があります。
joran 2014

3Dデータがある場合はどうなりますか?
スカン

60

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])

ここに画像の説明を入力してください


3
その2番目のプロットは素晴らしいです!
Ricardo Saporta 2013年

3Dデータがある場合はどうなりますか?
skan

2
@ skan:そのための新しい質問を開くことができます。
majom 2016

残念ながら、パッケージggsubplotはもはやメンテナンスされておらず、クランレポから削除されています...上記の最初の2つのようなプロットを生成するために使用できる代替パッケージをご存知ですか?
dieHellste

古いバージョンのR&ggplot2を使用している場合、それを機能させることができるはずです
majom

59

のいくつかの優れたオプションの概要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 = stat(level)), geom = 'polygon') +
  scale_fill_viridis_c(name = "density") +
  geom_point(shape = '.')

オプションD:密度ヒートマップ

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')

オプション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)

1つの図にまとめます。

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

ここに画像の説明を入力してください


1
これは非常にうまくレイアウトされた答えで、もう少し投票するに値すると思います。
Lalochezia 2018年

「scale_fill_viridis_c()でエラーが発生しました:関数「scale_fill_viridis_c」が見つかりませんでした
JustGettinStarted

ggplot2を更新し、ggplot2を再インストールし、ggplot2をリロードしました。エラーを修正しませんでした。個別にインストールされた「viridis」パッケージを使用すると、「scale_fill_viridis」関数は使用できますが、「scale_fill_viridis_c」関数は使用できません。同じエラーが発生します
JustGettinStarted

ああ、私はあなたを信じています。そこに問題はありません。エラーの一番下に到達しようとしています。
JustGettinStarted

51

アルファブレンディングは、ベースグラフィックでも簡単に実行できます。

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

後の最初の6つの数字#はRGBの16進数の色で、最後の2つは不透明度で、これも16進数なので、33〜3/16番目の不透明度です。

ここに画像の説明を入力してください


20
コンテキストを少し追加すると、 "#000000"は黒で、色の最後に追加された "33"は不透明度-ここでは33%です。
チャーリー

追加の説明をありがとう。
アーロンがスタックオーバーフローを去った

完全に理にかなっています。ありがとう、アーロンとチャーリーの両方。
user702432 2011年

12
マイナーなメモ。数値は16進数なので、33は実際には3/16番目の不透明です。
アーロンがスタックオーバーフローを去った

45

密度等高線(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")

ここに画像の説明を入力してください


29

あなたは便利な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)

ヘクスビンプロット


+1のhexbinが私の推奨するソリューションです-多数のポイントを取り、安全にプロットを作成できます。他の人が陰謀を企てようとせず、単に事後的に異なるものに陰影を付けることになるかどうかはわかりません。
イテレータ

3Dデータ用のhexbinのようなものはありますか?
skan

8

geom_pointdenistyggpointdensityパッケージから(最近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()


2

このタイプのデータをプロットするための私のお気に入りの方法は、この質問で説明されている方法です - 散乱密度プロット。アイデアは、散布図を作成することですが、密度に基づいてポイントに色を付けることです(大まかに言えば、その領域のオーバーラップの量)。

同時に:

  • 外れ値の場所を明確に示す
  • プロットの密な領域の構造を明らかにします。

リンクされた質問に対するトップアンサーの結果は次のとおりです。

散乱密度プロット


1
これも私のお気に入りの方法です。これをで実現する方法については、私の回答を参照しくださいR
jan-glx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.