web-dev-qa-db-ja.com

R散布図:シンボルの色は重なり合う点の数を表します

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

以下は、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

しかし、最近私は PNASのこの記事 に出くわしました。これは同様のアプローチを取りましたが、重複するポイントの数の指標として不透明度ではなくヒートマップの色付けを使用しました。記事はオープンアクセスなので、誰でも.pdfをダウンロードして、作成したいグラフの関連例が含まれている図1を見ることができます。このペーパーのメソッドセクションは、分析がMatlabで行われたことを示しています。

便宜上、上記の記事の図1の一部を次に示します。

Figure 1 from Flombaum et al. 2013, PNAS

ポイント密度の指標として不透明度ではなく色を使用するRで散布図を作成するにはどうすればよいですか?

手始めに、Rユーザーは関数install.packages("fields")を使用して、tim.colors()ライブラリでこのMatlabカラースキームにアクセスできます。

上記の記事の図1に似ているが、Rで図を作成する簡単な方法はありますか?ありがとう!

17
rbatt

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

33
Josh O'Brien

六角形のビニングを実行し、領域を六角形に分割し、六角形のポイントの数に基づいて各六角形に色を付けることで、同様の効果を得ることができます。 hexbinパッケージにはこれを行うための関数があり、ggplot2パッケージにも関数があります。

5
Greg Snow

これにはsmoothScatterを使用できます。

colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red'))
smoothScatter(x1, x2, colramp=colramp)
3
Matthew Plourde