前言#
對於簡單的多維矩陣數據處理,用 R 還是比較方便的,語法也很簡潔。
在做的過程有了解到通過等高線圖或熱力圖的方式表現應力應變的平面分佈,我在找這種圖的實現方式時,在人大經濟論壇上看有到大佬提到 R 語言 Plotly 這麼個包。
了解之後被他的表現力吸引了,原來可視化能用這麼簡單的方式做的這麼漂亮。就決定是你了!
這是官網給出的 3D Surface Plot 的 Demo: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 曲面圖需要一個二維純數值矩陣,所以組員處理完原始數據後,給我的是一系列不同深度 z 上的水平面的應力(應變)矩陣(矩陣的 i 即為 x 軸,j 即為 y 軸)。
由於我們劃分實際水平面是按 2cm*2cm 劃分,所以矩陣所有 ij 點需要乘 2 才是實際坐標。
單個圖參照官網給的 Demo 就能實現,Rstudio 不僅可以導出靜態圖片,還可以以 html 的形式輸出整個三維模型,用瀏覽器能交互式查看。前文給出的官方 Demo 頁面就能體驗一下。
而我們需要做的是一個初始參數變化時,他的應力應變分佈的變化,這就需要 gif 動畫來實現了。
我閱讀了 Plotly 官方文檔後,R 的包貌似不支持通過代碼輸出 html,也不支持生成三維動畫(我嘗試用 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數據文件,每個文件輸出一張圖
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 軟件拼接圖片後,最後實現動畫效果如圖:
以上。