我想要将三列数据绘制为2D色彩图。第一列表示x轴,第二列表示y轴。然而,这些中的值不是规则间隔网格的形式,第三列的数据在2D空间中的相当随机的点处可用。我在下面给出了一个示例数据集。实际的数据集长达数千行。
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和theta。第一列是r,第二列是theta,第三列是栅格像素的强度。我希望能够在网格位置(在线性轴上)绘制第三列的值,由第一列和第二列的相应值定义。因此,例如,取第二行,在(1,0)位置的色标上表示1536的值
我看了很多选项,比如热图,并找到了一些matlab或python的帮助,但我希望能够在R中做到这一点。有什么办法可以实现这个目的吗?如果我能够调整色阶等,可以获得奖励
为了澄清,第一列和第二列必须表示为线性轴本身(我解释了关于r和theta的部分来解释数据的来源)。我希望最终的结果是这样的:
希望它有所帮助!
答案 0 :(得分: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)