创建一个格子化(小平面)薄板样条响应曲面 [英] Creating a trellised (faceted) thin-plate spline response surface
问题描述
我想绘制一束薄板样条曲线响应曲面,用于测量与两个连续变量和一个离散变量有关的测量值。到目前为止,我一直在基于离散变量对数据进行子集化以生成一对图,但在我看来,应该有办法创建一些光滑的网格图。看起来可以通过在 > GGPLOT2 或 (3)使用来自 以下是迄今为止我一直在使用的一个例子: ggplot2
中使用 geom_tile
和 geom_contour < (1)如何重新组织数据(或解释预测的曲面数据)用于绘制
,但我被困在
? (b)使用基本图形创建格子化热图的语法(b)(b)b
$ b
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屋!