从包含3D曲面的点坐标的文本文件开始,由于施加在其上的压力而变形,以及根据以下示例施加的压力值:
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 .... .... .... .... .... .... .... ....
我正在尝试使用mplot3d库绘制3D表面+变形,以及变形表面上的压力的彩色等高线图。这是我的代码:
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()
但它没有绘制任何东西。
答案 0 :(得分:1)
来自@ImportanceOfBeingErnest评论,使用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()