使用mplot3d绘制3D网格 [英] Plot 3D mesh using mplot3d

查看:91
本文介绍了使用mplot3d绘制3D网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从包含3D曲面的点坐标的文本文件开始,其变形是由于施加在其上的压力以及根据以下示例施加的压力值引起的:


  Node_label X_in Y_in Z_in X_def Y_def Z_def按下

11542 15229 17734 18332 11.4645 67.7709 138.905 4.97573E-03
11543 3283 3238 16784 7.73624 67.3238 138.781 13.2628E-03
11540 13506 13385 17482 18.9023 67.6291 139.051 3.61705E-03
11541 7637 7516 18637 15.2164 68.0038 139.031 12.7343E-03
11546 16137 16651 16886 -2.98896 66.1776 138.431 19.0185E-03
11547 7360 7361 16903 -6.42838 65.3547 138.177 2.74949E-03
.... .... .... .... .... .... .... ....


我正在尝试绘制3D曲面及其变形以及彩色使用mplot3d库在变形表面上的压力的轮廓图。这是我的代码:

 从Tkinter导入Tk 
从tkFileDialog导入askopenfilename,asksaveasfile
从mpl_toolkits导入。 mplot3d import Axes3D
as mattlotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator,FormatStrFormatter
numpy as np

Tk ().withdraw()

f_in = askopenfilename(title ='选择TXT文件')

x_in = []
y_in = []
z_in = []
x_def = []
y_def = []
z_def = []
cpress = []

并且open(f_in, r)为f0:ind的
,枚举(f0)中的行:如果ind> 2:
项目= line.strip()

,如果项目:
项目= item.split()

x_in.append(item [0 ])
y_in.append(item [1])$ ​​b $ b z_in.append(item [2])
x_def.append(item [3])
y_def.append(item [4])
z_def.append(item [5])
cpress.append(item [6])

图= plt.figure()
斧头= fig.gca(投影='3d')

x_in = np.asarray(x_in)
y_in = np.asarray(y_in)
z_in = np.asarray(z_in )

surf = ax.plot_surface(x_in,y_in,z_in,cmap = cm.coolwarm,
linewidth = 0,antialiased = False)
plt.show()

但它不会绘制任何内容。

解决方案

使用


starting from a text file containing the points coordinates of a 3D surface, its deformed due to a pressure applied on it and the values of the pressure applied according to the following example:

 Node_label           X_in           Y_in           Z_in          X_def          Y_def          Z_def         Press

      11542          15229          17734          18332        11.4645        67.7709        138.905    4.97573E-03
      11543           3283           3238          16784        7.73624        67.3238        138.781    13.2628E-03
      11540          13506          13385          17482        18.9023        67.6291        139.051    3.61705E-03
      11541           7637           7516          18637        15.2164        68.0038        139.031    12.7343E-03
      11546          16137          16651          16886       -2.98896        66.1776        138.431    19.0185E-03
      11547           7360           7361          16903       -6.42838        65.3547        138.177    2.74949E-03
       ....           ....           ....           ....           ....           ....           ....            ....

I am trying to plot a 3D surface + its deformed, together with a colored contour plot of the pressure on the deformed surface using mplot3d library. Here is my code:

from Tkinter import Tk
from tkFileDialog import askopenfilename, asksaveasfile
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np

Tk().withdraw() 

f_in = askopenfilename(title='Choose the TXT file') 

x_in = []
y_in = []
z_in = []
x_def = []
y_def = []
z_def = []
cpress = []

with open(f_in,"r") as f0:
     for ind, line in enumerate(f0):
          if ind > 2:
               item = line.strip()

               if item:
                    item = item.split()

               x_in.append(item[0])
               y_in.append(item[1])
               z_in.append(item[2])
               x_def.append(item[3])
               y_def.append(item[4])
               z_def.append(item[5])
               cpress.append(item[6])

fig = plt.figure()
ax = fig.gca(projection='3d')

x_in = np.asarray(x_in)
y_in = np.asarray(y_in)
z_in = np.asarray(z_in)

surf = ax.plot_surface(x_in, y_in, z_in, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)
plt.show()

But it does not plot anything.

解决方案

From @ImportanceOfBeingErnest comentary, using plot_trisurf:

[...]
with open(f_in,"r") as f0:
    for ind, line in enumerate(f0):
        if ind > 2:
            item = line.strip()
            if item:
                item = item.split()
                #Node_label = item[0]
                x_in.append(item[1])
                y_in.append(item[2])
                z_in.append(item[3])
                x_def.append(item[4])
                y_def.append(item[5])
                z_def.append(item[6])
                cpress.append(item[7])

# type is important to convert strings to numbers:
x_in = np.asarray(x_in, dtype=np.float64)
y_in = np.asarray(y_in, dtype=np.float64)
z_in = np.asarray(z_in, dtype=np.float64)

fig = plt.figure()
ax = fig.gca(projection='3d')

points = ax.scatter(x_in, y_in, z_in, cmap=cm.coolwarm, antialiased=False)

surface = ax.plot_trisurf(x_in, y_in, z_in, cmap=cm.coolwarm, antialiased=False)

fig.tight_layout()
fig.show()

这篇关于使用mplot3d绘制3D网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆