创建一个格子化(小平面)薄板样条响应曲面 [英] Creating a trellised (faceted) thin-plate spline response surface

查看:201
本文介绍了创建一个格子化(小平面)薄板样条响应曲面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想绘制一束薄板样条曲线响应曲面,用于测量与两个连续变量和一个离散变量有关的测量值。到目前为止,我一直在基于离散变量对数据进行子集化以生成一对图,但在我看来,应该有办法创建一些光滑的网格图。看起来可以通过在 ggplot2 中使用 geom_tile geom_contour < (1)如何重新组织数据(或解释预测的曲面数据)用于绘制,但我被困在

> GGPLOT2 ? (b)使用基本图形创建格子化热图的语法(b)(b)b
$ b



(3)使用来自 rsm 的图形来完成此操作( rsm 可以应付高阶曲面,所以我可以在某种程度上强制一些东西,但是曲线并没有完全格子化)。



以下是迄今为止我一直在使用的一个例子:

  library(ggplot2)

sumframe< -structure(list(Morph = c(LW,LW,LW,LW, LWLW
LWLWLWLWLWLWLWSWSWSW SW,SW,SW,SW,SW,SW,SW,SW,SW,xvalue = c,SW, (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),y值= c(17,
34,12,21.75,29,7,36.25,14.25,24,19,36,14,23.75,17,
34,12,21.75,29,7,36.25,14.25,24,19,36,14,23.75),z值= c(126.852666666667,
182.843333333333,147.883333333333,214.686666666667,234.511333333333,
198.345333333333 ,280.9275,246.425,245.165,247.611764705882,
266.068,276.744,283.325,167.889,229.044,218.447777777778,
207.393,278.278,203.167,250.495,329.54,282.463,299.825,
286.942,372.103 ,307.0 68)),.Names = c(Morph,xvalue,yvalue,
zvalue),row.names = c(NA,-26L),class =data.frame)

sumframeLW<-subset(sumframe,Morph ==LW)
sumframeSW< -subset(sumframe,Morph =SW)

split.screen (c(1,2))
screen(n = 1)
surf.teLW <-Tps(cbind(sumframeLW $ xvalue,sumframeLW $ yvalue),sumframeLW $ zvalue,lambda = 0.01)
summary(surf.teLW)
surf.te.outLW< -predict.surface(surf.teLW)
image(surf.te.outLW,col = tim.colors(128),xlim = c(0,38),ylim = c(0,38),zlim = c(100,400),lwd = 5,las = 1,font.lab = 2,cex.lab = 1.3,mgp = c(2.7,0.5 ,0),font.axis = 1,lab = c(5,5,6),xlab =表达式(X值),ylab =表达式(Y值),main =LW图)
轮廓线(surf.te.outLW,lwd = 2,labcex = 1,add = T)
points(sumframeLW $ xvalue,sumframeLW $ yvalue,pch = 21)
abline(a = 0, b = 1,lty = 1,lwd = 1.5)
abline(a = 0,b = 1.35,lty = 2)

screen(n = 2)
surf。 teSW <-Tps(cbind(sumframeSW $ xvalue,sumframeSW $ yvalue),sumframeSW $ zvalue,lambda = 0.01)
summary (surf.teSW)
surf.te.outSW< -predict.surface(surf.teSW)
图片(surf.te.outSW,col = tim.colors(128),xlim = c(0 ,38),ylim = c(0,38),zlim = c(100,400),lwd = 5,las = 1,font.lab = 2,cex.lab = 1.3,mgp = c(2.7,0.5,0) ,font.axis = 1,lab = c(5,5,6),xlab =表达式(X值),ylab =表达式(Y值),main =SW图)
轮廓(surf.te.outSW,lwd = 2,labcex = 1,add = T)
points(sumframeSW $ xvalue,sumframeSW $ yvalue,pch = 21)
abline(a = 0,b = 1 ,1 = 1,lwd = 1.5)
abline(a = 0,b = 1.35,lty = 2)

close.screen(all.screens = TRUE)


解决方案

如注释中所述, melt()可以用来重新整形 Tps()输出,那么它可以重新格式化(删除NA),重新组合成一个数据框,并绘制。这里有 ggplot2 levelplot



<$ p $ (格子)

LWsurfm< -melt(surf.te.outLW)
LWsurfm< -rename(LWsurfm, c(value=z,Var1=x,Var2=y))
LWsurfms <-na.omit(LWsurfm)
SWsurfms [,Morph ]< -c(SW)

SWsurfm< -melt(surf.te.outSW)
SWsurfm< -rename(SWsurfm,c(value=z, X1=x,X2=y))
SWsurfms< -na.omit(SWsurfm)
LWsurfms [,Morph]< -c(LW)

LWSWsurf <-rbind(LWsurfms,SWsurfms)

LWSWp <-ggplot(LWSWsurf,aes(x,y,z = z))+ facet_wrap(〜Morph)
LWSWp <-LWSWp + geom_tile(aes(fill = z))+ stat_contour()
LWSWp



或者:
levelplot(z〜x * y | Morph,data = LWSWsurf,contour = TRUE)



I am trying to plot a bunch of thin-plate spline response surfaces for measurements related to two continuous variables plus one discrete variable. So far, I have been subsetting the data based on the discrete variable to generate pairs of plots, but it seems to me there should be a way to create some slick trellised plots instead. It seems like this could be done by faceting heatmaps in ggplot2 with geom_tile and geom_contour, but I am stuck on

(1) how to reorganize the data (or interpret the predicted surface data) for plotting with ggplot2?

(2) syntax for creating trellised heatmaps with base graphics? or

(3) ways to use graphics from rsm to accomplish this (rsm can cope with higher-order surfaces, so I could coerce things to some extent, but plots aren't fully trellised).

Here's an example of what I've been working with so far:

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), yvalue = c(17, 
34, 12, 21.75, 29, 7, 36.25, 14.25, 24, 19, 36, 14, 23.75, 17, 
34, 12, 21.75, 29, 7, 36.25, 14.25, 24, 19, 36, 14, 23.75), zvalue = c(126.852666666667, 
182.843333333333, 147.883333333333, 214.686666666667, 234.511333333333, 
198.345333333333, 280.9275, 246.425, 245.165, 247.611764705882, 
266.068, 276.744, 283.325, 167.889, 229.044, 218.447777777778, 
207.393, 278.278, 203.167, 250.495, 329.54, 282.463, 299.825, 
286.942, 372.103, 307.068)), .Names = c("Morph", "xvalue", "yvalue", 
"zvalue"), row.names = c(NA, -26L), class = "data.frame")

sumframeLW<-subset(sumframe, Morph=="LW")
sumframeSW<-subset(sumframe, Morph="SW")

split.screen(c(1,2))
screen(n=1)
surf.teLW<-Tps(cbind(sumframeLW$xvalue, sumframeLW$yvalue), sumframeLW$zvalue, lambda=0.01)
summary(surf.teLW)
surf.te.outLW<-predict.surface(surf.teLW)
image(surf.te.outLW, col=tim.colors(128), xlim=c(0,38), ylim=c(0,38), zlim=c(100,400), lwd=5, las=1, font.lab=2, cex.lab=1.3, mgp=c(2.7,0.5,0), font.axis=1, lab=c(5,5,6), xlab=expression("X value"), ylab=expression("Y value"),main="LW plot")
contour(surf.te.outLW, lwd=2, labcex=1, add=T)
points(sumframeLW$xvalue, sumframeLW$yvalue, pch=21)
abline(a=0, b=1, lty=1, lwd=1.5)
abline(a=0, b=1.35, lty=2)

screen(n=2)
surf.teSW<-Tps(cbind(sumframeSW$xvalue, sumframeSW$yvalue), sumframeSW$zvalue, lambda=0.01)
summary(surf.teSW)
surf.te.outSW<-predict.surface(surf.teSW)
image(surf.te.outSW, col=tim.colors(128), xlim=c(0,38), ylim=c(0,38), zlim=c(100,400), lwd=5, las=1, font.lab=2, cex.lab=1.3, mgp=c(2.7,0.5,0), font.axis=1, lab=c(5,5,6), xlab=expression("X value"), ylab=expression("Y value"),main="SW plot")
contour(surf.te.outSW, lwd=2, labcex=1, add=T)
points(sumframeSW$xvalue, sumframeSW$yvalue, pch=21)
abline(a=0, b=1, lty=1, lwd=1.5)
abline(a=0, b=1.35, lty=2)

close.screen(all.screens=TRUE)

解决方案

As noted in a comment, melt() can be used to reshape the Tps() output, then it can be reformatted a bit (to remove NA's), recombined into a single data frame, and plotted. Here are plots with ggplot2 and levelplot:

library(reshape)
library(lattice)

LWsurfm<-melt(surf.te.outLW)
LWsurfm<-rename(LWsurfm, c("value"="z", "Var1"="x", "Var2"="y"))
LWsurfms<-na.omit(LWsurfm)
SWsurfms[,"Morph"]<-c("SW")

SWsurfm<-melt(surf.te.outSW)
SWsurfm<-rename(SWsurfm, c("value"="z", "X1"="x", "X2"="y"))
SWsurfms<-na.omit(SWsurfm)
LWsurfms[,"Morph"]<-c("LW")

LWSWsurf<-rbind(LWsurfms, SWsurfms)

LWSWp<-ggplot(LWSWsurf, aes(x,y,z=z))+facet_wrap(~Morph)
LWSWp<-LWSWp+geom_tile(aes(fill=z))+stat_contour()
LWSWp

or: levelplot(z~x*y|Morph, data=LWSWsurf, contour=TRUE)

这篇关于创建一个格子化(小平面)薄板样条响应曲面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆