前書き#
シンプルな多次元行列データの処理には、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は公式ドキュメントで提供されている画像出力方法で、別途インストールが必要です
}
jpeg ソフトウェアで画像を結合した後、最終的なアニメーション効果は次のようになります:
以上。