前言

对于简单的多维矩阵数据处理,用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

pl2.png

点这前往

3D模型是交互性的,可以用鼠标拖动,指针的位置还会显示数据。

关于Plotly

Plotly是一个非常强大的开源交互式可视化包,支持Python,R,Matlab(貌似是非官方)。大概阅读了官方文档后感觉对Python的功能支持更好,对于R的话部分功能实现仍存在一定困难。

pl3.png

有在线和离线模式,在线模式是注册官网账户以后,可以把你的可视化结果上传到官方平台,在线保存查看。我用的是离线模式。

可视化实现

Plotly绘制3D曲面图需要一个二维纯数值矩阵,所以组员处理完原始数据后,给我的是一系列不同深度z上的水平面的应力(应变)矩阵(矩阵的i即为x轴,j即为y轴)。

由于我们划分实际水平面是按2cm*2cm划分,所以矩阵所有ij点需要乘2才是实际坐标。

单个图参照官网给的Demo就能实现,Rstudio不仅可以导出静态图片,还可以以html的形式输出整个三维模型,用浏览器能交互式查看。前文给出的官方Demo页面就能体验一下。

pl1.png

而我们需要做的是一个初始参数变化时,他的应力应变分布的变化,这就需要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软件拼接图片后,最后实现动画效果如图:

pl4.gif

以上。