2013-06-13 36 views
11

多くの点が重なると、散布図を解釈するのが難しくなります。そのような重なりは特定の領域のデータ密度を不明瞭にします。 1つの解決策は、プロットされた点に半透明の色を使用することであり、不透明領域は、それらの座標に多くの観測値が存在することを示します。R散布図:シンボルの色は重複する点の数を表します。

以下

はRで私の黒と白のソリューションの一例です:

MyGray <- rgb(t(col2rgb("black")), alpha=50, maxColorValue=255) 
x1 <- rnorm(n=1E3, sd=2) 
x2 <- x1*1.2 + rnorm(n=1E3, sd=2) 
dev.new(width=3.5, height=5) 
par(mfrow=c(2,1), mar=c(2.5,2.5,0.5,0.5), ps=10, cex=1.15) 
plot(x1, x2, ylab="", xlab="", pch=20, col=MyGray) 
plot(x1, x2, ylab="", xlab="", pch=20, col="black") 

The advantages of using opacity to indicate point density

しかし、私は最近、同様のアプローチを取っている、this article in PNAS渡って来たが、ヒートマップの配色を使用しましたオーバーラップしているポイントの数の指標としての不透明度とは対照的である。記事はOpen Accessですので、誰でも.pdfをダウンロードして、図1を見てください。図1に、作成したいグラフの関連例を示します。このペーパーのメソッドセクションは、解析がMatlabで行われたことを示しています。私は色ではなく、不透明度を用いRにおける散布図を作成する方法を

Figure 1 from Flombaum et al. 2013, PNAS

:便宜上

は、ここで上記の記事から、図1の小さい部分でありますポイント密度の指標?

初心者の方は、tim.colors()を使用して、install.packages("fields")ライブラリのMatlab配色にアクセスできます。

上記の図1と同様の図を作成する簡単な方法はありますか?ありがとう!

答えて

26

1つのオプションは、densCols()を使用して各ポイントでカーネル密度を抽出することです。それらの密度を所望の色のランプにマッピングし、局所密度が高い順に点をプロットすることにより、リンクされた記事のようなプロットが得られます。応答のための

## Data in a data.frame 
x1 <- rnorm(n=1E3, sd=2) 
x2 <- x1*1.2 + rnorm(n=1E3, sd=2) 
df <- data.frame(x1,x2) 

## Use densCols() output to get density at each point 
x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white"))) 
df$dens <- col2rgb(x)[1,] + 1L 

## Map densities to colors 
cols <- colorRampPalette(c("#000099", "#00FEFF", "#45FE4F", 
          "#FCFF00", "#FF9400", "#FF3100"))(256) 
df$col <- cols[df$dens] 

## Plot it, reordering rows so that densest points are plotted on top 
plot(x2~x1, data=df[order(df$dens),], pch=20, col=col, cex=2) 

enter image description here

+0

+10もしできればさらに高い投票をするでしょう。 –

+0

これはまさに私が望んでいた答えと思われる...ありがとう! – rbatt

+0

@JoshOBrien:これは素晴らしいです! 2つの質問: 1)答えに画像をどのように追加できましたか? 2)ここに凡例を追加するには? – Shambho

3

これにはsmoothScatterを使用できます。六角形の点の数に基づいて、色各六角形を

colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red')) 
smoothScatter(x1, x2, colramp=colramp) 
+0

おかげ - これはおよそ右のアイデアですが、私はポイントの平滑化を避けるためにしたいと思います。帯域幅などで試してみましたが、この機能が個々のポイントを維持できるようには見えません。 – rbatt

+0

ニースが見つかりました!これについて、または私の答えで今使った関連の 'densCols()'関数については知りませんでした。 –

5

あなたは、六角形のビニングを行うことによって同様の効果を得ることができる六角形に領域を分割します。 hexbinパッケージにはこれを行う関数があり、ggplot2パッケージにも関数があります。

+1

これはggplot2のどの機能ですか? – rbatt

+0

@rbattでは、 'stat_binhex'を見てください。 –

関連する問題