1

我在一些建模软件中运行了 2d 模拟,从中我导出了具有一组 6 个属性的 x、y 点位置。我希望重新创建一个组合数据的图形,如下所示: 在此处输入图像描述

椭圆和背景根据属性 1 着色(它们的边界当然代表模型几何,但我认为我不能复制它),等值线是属性 2 的轮廓,箭头字形是来自属性 3(x 震级)和 4(y 震级)。

x,y 点是我认为的三角网格的中心,如下所示: 在此处输入图像描述

我想知道如何使用 R 重新创建这样的图。首先,由于数据是从不规则网格导出的,因此我有不规则间隔的数据。这就是我被 R 卡住的地方,我只用它来制作盒子和耳语情节等。

这是数据: https
://dl.dropbox.com/u/22417033/Ellipses_noheader.txt 编辑:字段:x、y、热通量 (x)、热通量 (y)、热导率、温度、gradT (x) , 梯度 (y)。

names(Ellipses) <- c('x','y','dfluxx','dfluxy','kxx','Temps','gradTx','gradTy')
4

3 回答 3

7

制作较低的情节很容易(假设有一个名为“edat”的数据框读入:

 edat <- read.table(file=file.choose())
 with(edat, plot(V1,V2), cex=0.2)

在此处输入图像描述

事情变得更加美好:

with(edat, plot(V1,V2, cex=0.2, col=V5))

在此处输入图像描述

所以我不认为你的原件被数据忠实地代表了。轮廓线不是直接穿过“导体”。我称它们为“导体”,因为这看起来有点像静电学中的等势线。我在这里添加了一些文本作为搜索句柄,供其他可能正在搜索现实世界物理学中的绘图问题的人使用:矢量场(箭头)、热方程、梯度、势线。然后,您可以使用以下内容覆盖矢量场:

with(edat, arrows(V1,V2, V1-20*V6*V7, V2-20*V6*V8, length=0.04, col="orange") )

在此处输入图像描述

你可以用 xlim 和 ylim“放大”:

with(edat, plot(V1,V2, cex=0.3, col=V5, xlim=c(0, 10000), ylim=c(-8000, -2000) ))
with(edat, arrows(V1,V2, V1-20*V6*V7, V2-20*V6*V8, length=0.04, col="orange") )

在此处输入图像描述

猜测是否为 Temps 变量请求了轮廓。选择等高线图。

require(akima)
intflow<- with(edat, interp(x=x, y=y, z=Temps, xo=seq(min(x), max(x), length = 410), 
              yo=seq(min(y), max(y), length = 410), duplicate="mean", linear=FALSE) )

require(lattice)
contourplot(intflow$z)
filled.contour(intflow)
with( intflow, contour(x=x, y=y, z=z) )

在此处输入图像描述

最后一个将与其他绘图示例混合,因为这些示例使用基本绘图功能。您可能需要切换到points而不是plot.

于 2013-02-19T04:31:04.983 回答
3

你的情节有几个部分,所以你可能需要几个工具来制作不同的部分。

可以创建背景和椭圆polygon(一旦你确定它们应该在哪里)。

contourLines函数可以为您计算轮廓线,您可以使用该lines函数添加这些轮廓线(或contour具有和add参数,并且可能用于直接添加线条)。

akima 包有一个函数interp,它可以在给定未网格化的值的情况下估计网格上的值。

来自 TeachingDemos 包的my.symbols函数 和ms.arrows可用于绘制矢量场。

于 2013-02-19T04:57:10.790 回答
2

@DWin 说您的图表不能忠实地代表您的数据是正确的,所以我建议您遵循他的回答。然而,这里是如何重现(我能做到的最接近的)你的图表:

Ellipses <- read.table(file.choose())
names(Ellipses) <- c('x','y','dfluxx','dfluxy','kxx','Temps','gradTx','gradTy')
require(splancs)
require(akima)

首先准备数据:

#First the background layer (the 'kxx' layer):
# Here the regular grid on which we're gonna do the interpolation
E.grid <- with(Ellipses, 
               expand.grid(seq(min(x),max(x),length=200),
                           seq(min(y),max(y),length=200)))
names(E.grid) <- c("x","y") # Without this step, function inout throws an error
E.grid$Value <- rep(0,nrow(E.grid))
#Split the dataset according to unique values of kxx
E.k <- split(Ellipses,Ellipses$kxx)
# Find the convex hull delimiting each of those values domain
E.k.ch <- lapply(E.k,function(X){X[chull(X$x,X$y),]}) 
for(i in unique(Ellipses$kxx)){ # Pick the value for each coordinate in our regular grid
    E.grid$Value[inout(E.grid[,1:2],E.k.ch[names(E.k.ch)==i][[1]],bound=TRUE)]<-i
}

# Then the regular grid for the second layer (Temp)
T.grid <- with(Ellipses,
               interp(x,y,Temps, xo=seq(min(x),max(x),length=200),        
                      yo=seq(min(y),max(y),length=200), 
                      duplicate="mean", linear=FALSE))
# The regular grids for the arrow layer (gradT)
dx <- with(Ellipses,
           interp(x,y,gradTx,xo=seq(min(x),max(x),length=15),
                  yo=seq(min(y),max(y),length=10),
                  duplicate="mean", linear=FALSE))
dy <- with(Ellipses,
           interp(x,y,gradTy,xo=seq(min(x),max(x),length=15),
                  yo=seq(min(y),max(y),length=10),
                  duplicate="mean", linear=FALSE))
T.grid2 <- with(Ellipses,
               interp(x,y,Temps, xo=seq(min(x),max(x),length=15),        
                      yo=seq(min(y),max(y),length=10), 
                      duplicate="mean", linear=FALSE))
gradTgrid<-expand.grid(dx$x,dx$y)

然后是绘图:

palette(grey(seq(0.5,0.9,length=5)))
par(mar=rep(0,4))
plot(E.grid$x, E.grid$y, col=E.grid$Value, 
     axes=F, xaxs="i", yaxs="i", pch=19)
contour(T.grid, add=TRUE, col=colorRampPalette(c("blue","red"))(15), drawlabels=FALSE)
arrows(gradTgrid[,1], gradTgrid[,2],  # Here I multiply the values so you can see them
       gradTgrid[,1]-dx$z*40*T.grid2$z, gradTgrid[,2]-dy$z*40*T.grid2$z, 
       col="yellow", length=0.05)

在此处输入图像描述

要详细了解此代码的工作原理,我建议您阅读以下帮助页面:?inout?chull?interp和。?expand.grid?contour

于 2013-02-20T08:28:47.193 回答