2017-03-07 4 views
1

私は2Dカラーマップとしてプロットしたい3列のデータを持っています。最初の列はx軸を表し、2番目の列はy軸を表します。しかし、これらの値は規則的な間隔のグリッドの形ではなく、第3列のデータは2D空間内のむしろランダムな点で利用可能である。私は以下のサンプルデータセットを与えました。実際のデータセットは数千行にもおよぶ。マトリックスまたはデータフレームのデータを3つの列にプロットする方法を教えてください。

 X1  X2  X3 
1 0.000000 NaN 1760 
2 1.000000 0.0000000 1536 
3 2.000000 0.0000000 1744 
4 3.000000 0.0000000 1632 
5 1.000000 1.5707963 1616 
6 1.414214 0.7853982 1632 
7 2.236068 0.4636476 1712 
8 3.162278 0.3217506 1616 
9 2.000000 1.5707963 1616 
10 2.236068 1.1071487 1568 
11 2.828427 0.7853982 1712 
12 3.605551 0.5880026 1600 
13 3.000000 1.5707963 1536 
14 3.162278 1.2490458 1536 
15 3.605551 0.9827937 1568 
16 4.242641 0.7853982 1536 

このデータは、実際に(ライブラリ変形)値(ラスタ)を有するデカルトグリッドを「融解」し、次にRとシータをプロットする目的で、極座標に変換することにより得ました。第1の列はrであり、第2の列はテータであり、第3の列はラスタピクセルの強度である。私は、第1列と第2列の対応する値によって定義されるグリッド位置(線形軸上)の第3列の値をプロットできるようにしたい。たとえば、2番目の行を取ると、(1,0)

の位置にあるカラースケールで表された1536の値は、私はヒートマップなどの多くのオプションを見て、MATLABまたは私はRでこれを行うことができるようにしたいと思います。これを達成する方法はありますか?私が色の目盛りなどを調整できる場合のボーナス

明確にするために、第1列と第2列を線形軸として表現する必要があります(データの原点を説明するためにrとthetaの部分について説明しました) 。私は最終結果がこのようなものになることを願っています: Raster plot

希望します!

+0

15ポイントはかなりまばらである...あなたはggplot2' 'で' geom_tile'を使用することができます。 '?geom_raster'と'?geom_contour'には例がありますが、あなたのデータは自動メソッドにとってあまりにも希薄です。 – Gregor

+0

この回答は興味があるかもしれません:http://stackoverflow.com/questions/19339296/plotting-contours-on-an-irregular-grid – bdemarest

+0

@Gregor、私はより具体的だったはずです。これは代表的なデータです。実際のデータセットには、このように数千の行が含まれています。私はこれを反映するために質問を編集しました。 – Pradical2190

答えて

0

以下の解決方法は、@Henrikによって提供されたこの素晴らしい回答Plotting contours on an irregular gridから直接取得されています。 akimaパッケージを使用して、2D空間上で不規則に測定されたz値を補間します。次に、geom_raster()を使用してヒートマップを描画します。

dat = read.table(header=TRUE, 
text="  X1  X2  X3 
1 0.000000 NaN 1760 
2 1.000000 0.0000000 1536 
3 2.000000 0.0000000 1744 
4 3.000000 0.0000000 1632 
5 1.000000 1.5707963 1616 
6 1.414214 0.7853982 1632 
7 2.236068 0.4636476 1712 
8 3.162278 0.3217506 1616 
9 2.000000 1.5707963 1616 
10 2.236068 1.1071487 1568 
11 2.828427 0.7853982 1712 
12 3.605551 0.5880026 1600 
13 3.000000 1.5707963 1536 
14 3.162278 1.2490458 1536 
15 3.605551 0.9827937 1568 
16 4.242641 0.7853982 1536") 

library(akima) 
library(reshape2) 
library(ggplot2) 

dat = dat[-1, ] # Remove row with NaN so `interp` will work properly. 

# Interpolate 500 x 500 values, using spline interpolation. 
res = interp(x=dat$X1, y=dat$X2, z=dat$X3, nx=500, ny=500, linear=FALSE) 

# Reformat `interp` results into a long-format data.frame. 
idat = melt(res$z, na.rm=TRUE) 
names(idat) = c("x", "y", "X3") 
idat$X1 = res$x[idat$x] 
idat$X2 = res$y[idat$y] 

p1 = ggplot(idat, aes(x=X1, y=X2, fill=X3)) + 
    geom_raster() + 
    scale_fill_gradientn(colours = terrain.colors(10)) 

ggsave("interpolated_heatmap.png", p1, height=4, width=6, dpi=150) 

enter image description here

+0

ありがとう、@bdemarest。この回答は正しく機能しました... – Pradical2190

関連する問題