我有(x,y,z)形式的数据,其中x和y不在常规网格上.我希望显示这些数据的2D色彩图,其中强度(例如,灰度)映射到z变量.一个明显的解决方案是在常规网格上插值(见下文),
d <- data.frame(x=runif(1e3, 0, 30), y=runif(1e3, 0, 30))
d$z = (d$x - 15)^2 + (d$y - 15)^2
library(akima)
d2 <- with(d, interp(x, y, z, xo=seq(0, 30, length = 30),
yo=seq(0, 30, length = 50), duplicate="mean"))
pal1 <- grey(seq(0,1,leng=500))
with(d2, image(sort(x), sort(y), z, useRaster=TRUE, col = pal1))
points(d$x, d$y, col="white", bg=grey(d$z/max(d$z)), pch=21, cex=1,lwd=0.1)
Run Code Online (Sandbox Code Playgroud)
然而,这会丢失初始网格的信息(点与实际数据的位置),这些信息在某些位置可能非常精细或非常粗糙.我倾向于使用三角形进行delaunay平铺,这准确地表示原始数据点的实际位置和密度.
理想情况下,解决方案会
计算镶嵌绘图功能的外部,使得所得到的多边形可以与任一被绘制ggplot2,lattice或碱图形
快点 在我的实际例子中(~1e5分),tesselation via的计算deldir可能非常慢.
通过"tesselation"我的意思是Delaunay三角形或Voronoi图,虽然我的偏好是前者.然而,它带来了基于原始数据点插入每个三角形的颜色的额外复杂性.
我正在尝试绘制一堆薄板样条响应曲面,用于与两个连续变量加一个离散变量相关的测量。到目前为止,我一直在基于离散变量对数据进行子集化以生成成对的图,但在我看来应该有一种方法来创建一些光滑的网格图。似乎这可以通过在 和 中分面热图来完成ggplot2,geom_tile但geom_contour我坚持
(1) 如何重新组织数据(或解释预测的表面数据)以使用 进行绘图ggplot2?
(2) 使用基本图形创建网格热图的语法?或者
(3)使用图形来rsm完成此任务的方法(rsm可以处理高阶曲面,因此我可以在某种程度上强制执行某些操作,但绘图并未完全网格化)。
这是我迄今为止一直在使用的示例:
library(fields)
library(ggplot2)
sumframe<-structure(list(Morph = c("LW", "LW", "LW", "LW", "LW", "LW",
"LW", "LW", "LW", "LW", "LW", "LW", "LW", "SW", "SW", "SW", "SW",
"SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW", "SW"), xvalue = c(4,
8, 9, 9.75, 13, 14, 16.25, 17.25, 18, 23, 27, 28, 28.75, 4, 8,
9, 9.75, 13, 14, 16.25, 17.25, 18, 23, 27, 28, 28.75), …Run Code Online (Sandbox Code Playgroud) 我想要绘制3个维度,我希望第三个维度是颜色.
顺便说一句,这将在R中.例如,我的数据看起来像这样
x = [1,2,3,4,1,5,6,3,4,7,8,9]
y = [45,32,67,32,32,47,89,91,10,12,43,27]
z = [1,2,3,4,5,6,7,8,9,10,11,12]
Run Code Online (Sandbox Code Playgroud)
我试图使用filled.contour,但它给了我一个错误,说x和y必须按递增顺序.但我不确定如何安排我的数据,这是真的.因为如果我按递增顺序排列x,那么y将不会按递增顺序排列.
对我来说,做一个非填充轮廓方法也是可行的,它只是有色的数据点.我怎么能在R中做这个.任何建议的包?请使用具体示例.谢谢!
使用interp函数(Akima软件包),可以绘制与数据集的双变量插值相对应的表面,请参见下面的示例(来自interp文档):
library(rgl)
data(akima)
# data visualisation
rgl.spheres(akima$x,akima$z , akima$y,0.5,color="red")
rgl.bbox()
# bivariate linear interpolation
# interp:
akima.li <- interp(akima$x, akima$y, akima$z,
xo=seq(min(akima$x), max(akima$x), length = 100),
yo=seq(min(akima$y), max(akima$y), length = 100))
# interp surface:
rgl.surface(akima.li$x,akima.li$y,akima.li$z,color="green",alpha=c(0.5))
Run Code Online (Sandbox Code Playgroud)
但是,输出仅是描述一组点的列表,而不是常规函数。
问题:是否有任何方法来获得与先前获得的曲面匹配的函数z = f(x,y)?我知道它可以使用interp(akima $ x,akima $ y,akima $ z,xo = A,yo = B),但是它非常慢。
在二维中,roximfun()函数可以完成此工作,但我找不到多参数插值的等效项。
我正在尝试制作一个等高线图(或水平图,我并不特别关心哪一个),看起来像这样:
我有这个代码:
contourplot(z~x*y, data=df1, xlim=c(0,100), ylim=c(0,50),
scales=list(x=list(at=c(0,20,40,60,80,100)),
y=list(at=c(0,10,20,30,40,50))),
at=seq(0,5000,by=500))
Run Code Online (Sandbox Code Playgroud)
效果很好,但是当我尝试添加这样的颜色时:
contourplot(z~x*y, data=df1, xlim=c(0,100), ylim=c(0,50),
scales=list(x=list(at=c(0,20,40,60,80,100)),
y=list(at=c(0,10,20,30,40,50))),
at=seq(0,5000,by=500), region=T,
colorkey=list(at=seq(0,5000,by=10)), col.regions=rainbow(5000))
Run Code Online (Sandbox Code Playgroud)
我得到这个可怕的结果:
我认为问题主要是规模问题,但无论我尝试哪种价值观at,col.regions我都无法改变结果。我什至尝试过这个interpolate选项,但它并没有什么区别。我已经搜索了很多,但我不得不说我发现lattice的文档有点复杂。
数据框是这样的:
structure(list(x = c(99.9735523336143, 99.9735523336143, 99.9735523336143,
9.99735523336143, 99.9735523336143, 99.9735523336143, 99.9735523336143,
99.9735523336143, 9.99735523336143, 99.9735523336143, 9.99735523336143,
9.99735523336143, 9.99735523336143, 9.99735523336143, 9.99735523336143,
9.99735523336143, 19.9947104667229, 19.9947104667229, 19.9947104667229,
19.9947104667229, 19.9947104667229, 19.9947104667229, 19.9947104667229,
19.9947104667229, 29.9920657000843, 29.9920657000843, 29.9920657000843,
29.9920657000843, 29.9920657000843, 29.9920657000843, 29.9920657000843,
29.9920657000843, 39.9103904572927, 39.9103904572927, 39.9103904572927,
39.9103904572927, 39.9103904572927, 39.9103904572927, 39.9103904572927,
39.9103904572927, 49.9867761668072, 49.9867761668072, 49.9867761668072,
4.99867761668072, 49.9867761668072, 49.9867761668072, 49.9867761668072,
49.9867761668072, 4.99867761668072, …Run Code Online (Sandbox Code Playgroud)