KANIKIG

KANIKIG

just for fun | 兴趣使然 Ph.D. in Engineering|❤️ #NFT $ETH| [Twitter](https://twitter.com/kanikig2)|[Github](https://github.com/KANIKIG)|[Telegram channel](https://t.me/kanikigtech)

R语言使用Plotly进行3D可视化

image

前言#

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

以上。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。