“interp”表示离散点得到热图/轮廓R.

时间:2016-09-02 14:22:03

标签: r interpolation heatmap contour lattice

我有一个参考,我从模拟生成数据,然后想绘图(热图/轮廓/ 3d图等);但是,对于这些,需要使用interp等函数对数据进行插值。以下是示例dataset

这是我试过的代码片段......

library(akima)
library(GA) # for persp3D; there exists another package for same function "fields"

data <- read.table(commandArgs()[3], header=T,sep="\t")
data <- na.omit(data)

qmax = max(data$q)
kmax = max(data$k)

x <- data$k_bike/kmax
y <- data$k_car/kmax
z <- data$q/qmax

matrix = interp(x,y,z)

persp3D(matrix ,nlevels=30, asp=1, xlim=c(0,1), ylim=c(0,1), color.palette=colorRampPalette(c("green3","yellow", "red"),space = "rgb") )

所以结果是 - enter image description here

现在,由于插值,有许多点,有红色/橙色而不是绿色。例如,如果我使用levelplot

lattice
levelplot(z~x*y, xlim=c(0,1), ylim=c(0,1), col.regions=colorRampPalette(c("green3","yellow", "red"),space = "rgb") )

结果是 -

enter image description here

现在,可以清楚地看到,很少有数据点具有零(或几乎为零)z值。现在,问题是,使用levelplot,我得到了人工制品(缺少数据点的白色),我希望有一个更好的插值。还有其他功能可以执行此操作吗?

我也尝试了等高线图如下:

  scale <- (qmax+10) / qmax * c(0.000, 0.01, 0.05, 0.10, 0.25, 0.5, 0.75, 1.0)
filled.contour(matrix, nlevels=30, asp=1, xlim=c(0,1), ylim=c(0,1), levels=scale,color.palette=colorRampPalette(c("green3","yellow", "red"),space = "rgb") )

并且结果再次出现(错误的颜色指示)。

enter image description here

  

简而言之 - 我想有等高线图或3d图,但有一个   明确(或更正)零(约零)z值数据的颜色指示   与水平图类似的点。

1 个答案:

答案 0 :(得分:1)

我使用deldirrgl包来解决您的问题(它们允许绘制由不规则的点集合定义的曲面)。

library(deldir); library(rgl)

# Below two lines require time depending on the machine power, be careful
dxyz <- deldir(x, y, z = z)      # do Delaunay triangulation
mxyz <- as.mesh3d(dxyz)          # convert it to triangle.mesh3d.obj

bgyr <- colorRampPalette(c("blue", "green", "yellow", "red"))    # colour func

# use z values for colouring
plot3d(mxyz, col=bgyr(256)[cut(mxyz$vb[3,], 256)][mxyz$it], type="shade")
light3d()          # if you want vivit colours

enter image description here

# another approach
# you can solve it by just increasing interp()'s arguments, nx and ny.

library(akima); library(lattice); library(dplyr)

df <- interp(x,y,z, nx=150, ny=150) %>% interp2xyz() %>% data.frame()
levelplot(z ~ x * y, df, xlim=c(0,1), ylim=c(0,1), 
          col.regions = colorRampPalette(c("green3", "yellow",  "red"), space = "rgb"))