Plot 3D mesh using mplot3d

2019-09-14 15:56发布

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.

1条回答
劫难
2楼-- · 2019-09-14 16:33

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()

enter image description here

查看更多
登录 后发表回答