前書き#
シンプルな多次元行列データの処理には、R を使用すると便利で、構文も簡潔です。
プロセス中に、応力とひずみの平面分布を等高線図またはヒートマップで表現する方法について調べていると、人大経済論壇で R 言語の Plotly というパッケージについての言及を見つけました。
調査した後、その表現力に魅了されました。視覚化は、こんなに簡単な方法で美しく行うことができるのですね。あなたに決めました!
これは公式ウェブサイトの 3D Surface Plot のデモです:Volcano
library(plotly)
# volcano is a numeric matrix that ships with R
fig <- plot_ly(z = ~volcano)
fig <- fig %>% add_surface()
fig
3D モデルはインタラクティブで、マウスでドラッグすることができ、ポインタの位置にはデータが表示されます。
Plotly について#
Plotly は非常に強力なオープンソースのインタラクティブな可視化パッケージで、Python、R、Matlab(非公式のようです)をサポートしています。公式ドキュメントを読んだ結果、Python の機能サポートがより優れていると感じましたが、R の場合、一部の機能の実装にはまだ苦労しているようです。
オンラインモードとオフラインモードがあり、オンラインモードでは、公式プラットフォームに可視化結果をアップロードして保存および表示することができます。私はオフラインモードを使用しています。
可視化の実現#
Plotly で 3D サーフェスプロットを描くには、2 次元の数値行列が必要です。したがって、チームメンバーが元のデータを処理した後、私には応力(ひずみ)行列のさまざまな深度 z 上の水平面が与えられました(行列の i は x 軸、j は y 軸です)。
実際の水平面は 2cm×2cm で分割されるため、行列のすべての ij ポイントは 2 倍する必要があります。
個々の図は公式ウェブサイトのデモを参考にして実現できます。Rstudio では静的な画像だけでなく、html 形式で全体の 3D モデルを出力し、ブラウザでインタラクティブに表示することもできます。前述の公式デモページで試してみることができます。
私たちが行う必要があるのは、初期パラメータの変化に伴う応力とひずみの分布の変化であり、これには gif アニメーションが必要です。
Plotly の公式ドキュメントを読んだ後、R のパッケージはコードで html を出力することをサポートしていないようであり、3D アニメーションを生成することもサポートしていないようです(for ループで結果を出力しようと試みましたが、アニメーションは実現できませんでした)。
私の研究が不十分なのかもしれませんが、最終的には比較的単純な方法を取りました。
ループで jpeg 画像を出力し、その後、gif 作成ソフトウェアを使用して画像を結合してアニメーションを実現しました。(少なくとも、アニメーションをコードでどのように実現するかを考える必要はありませんでした)
以下はコードです:
library(stringr)
library(dplyr)
library(plotly)
library(processx)
#行列ijを実際の座標に変換する
x1 <- seq(0,by=2,length.out=100)
y1 <- seq(0,by=2,length.out=100)
#フォルダのパス内のすべてのファイル名を取得してループで処理するために使用
strdir <- "./3D/data-z/ txy (kPa)"
dir <- dir(strdir)
#フォルダ内のすべてのcsvデータファイルをループで処理し、各ファイルごとに1つの図を出力する
for (i in 1:length(dir))
{
stress <- as.matrix(read.csv(file = str_c(strdir,"/",dir[i]))) #読み込んだファイルを数値行列に変換する
stress <- stress[,-1] #私に渡されたcsvファイルの最初の列は番号であり、不要なので削除する
fig <- plot_ly(z=~stress, x=x1, y=y1)%>%add_surface()
fig <- fig %>% layout(
title <- dir[i],
scene <- list(
yaxis <- list(autorange = "reversed"), #私たちが定義した座標系ではy軸は反転しています
zaxis <- list(title = "せん断応力")
))
orca(fig, str_c(dir[i],".jpeg")) #orcaは公式ドキュメントで提供されている画像出力方法で、別途インストールが必要です
}
gif ソフトウェアで画像を結合した後、最終的なアニメーション効果は次のようになります:
以上。