1

いくつかのモデリングソフトウェアで2Dシミュレーションを実行しました。そこから、6つの属性のセットを持つx、yポイントの場所をエクスポートしました。次のように、データを組み合わせた図を再作成したいと思います。 ここに画像の説明を入力してください

楕円と背景は属性1に従って陰影が付けられ(これらの境界線はもちろんモデルのジオメトリを表していますが、それを再現できるとは思いません)、等値線は属性2の輪郭であり、矢印のグリフは属性3(xマグニチュード)および4(yマグニチュード)から。

x、yポイントは、私が思う三角分割メッシュの中心であり、次のようになります。 ここに画像の説明を入力してください

Rを使用してこのようなプロットを再作成する方法を知りたいです。まず、不規則なメッシュからエクスポートされているため、不規則な間隔のデータがあります。それはすぐに私がRに行き詰まり、ボックスアンドウィスパープロットなどを作成するためにRを使用したことがあるだけです。

データは次のとおりです: https
://dl.dropbox.com/u/22417033/Ellipses_noheader.txt 編集:フィールド:x、y、熱流束(x)、熱流束(y)、熱伝導率、温度、gradT(x) 、gradT(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(またはcontouradd引数があり、おそらく線を直接追加するために使用できます)。

interpakima パッケージには、グリッド化されていない値が与えられた場合に、グリッド上の値を推定できる関数があります。

このmy.symbols関数ms.arrowsは、TeachingDemos パッケージに含まれており、ベクトル フィールドを描画するために使用できます。

于 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 に答える