我尝试为matplotlib编写一个脚本,其中数据点被绘制为线框。我曾经在gnuplot中做过一次(这是有效的)。然而,我将我的一些脚本迁移到matplotlib,因为我现在更加信任它。
我用圆柱坐标计算了一些数据。对于固定的z,我根据phi角计算x和y坐标。当绘制一个完整的圆时,下一个z步骤被计算等。数据看起来像这样
6.71570E+01 0.00000E+00 6.00000E+01 4.46028E+01
6.70761E+01 3.29524E+00 6.00000E+01 4.46028E+01
6.68336E+01 6.58254E+00 6.00000E+01 4.46028E+01
6.64301E+01 9.85398E+00 6.00000E+01 4.46028E+01
6.58666E+01 1.31017E+01 6.00000E+01 4.46028E+01
6.51444E+01 1.63178E+01 6.00000E+01 4.46028E+01
6.42653E+01 1.94947E+01 6.00000E+01 4.46028E+01
6.32313E+01 2.26245E+01 6.00000E+01 4.46028E+01
[...]
6.68336E+01 -6.58254E+00 6.00000E+01 4.46028E+01
6.70761E+01 -3.29524E+00 6.00000E+01 4.46028E+01
6.71570E+01 -8.51512E-13 6.00000E+01 4.46028E+01
6.34799E+01 0.00000E+00 5.70000E+01 4.21513E+01
6.34035E+01 3.11481E+00 5.70000E+01 4.21513E+01
6.31742E+01 6.22212E+00 5.70000E+01 4.21513E+01
6.27928E+01 9.31444E+00 5.70000E+01 4.21513E+01
6.22602E+01 1.23843E+01 5.70000E+01 4.21513E+01
6.15775E+01 1.54244E+01 5.70000E+01 4.21513E+01
6.07465E+01 1.84272E+01 5.70000E+01 4.21513E+01
5.97691E+01 2.13857E+01 5.70000E+01 4.21513E+01
5.86478E+01 2.42927E+01 5.70000E+01 4.21513E+01
5.73852E+01 2.71412E+01 5.70000E+01 4.21513E+01
5.59843E+01 2.99242E+01 5.70000E+01 4.21513E+01
5.44485E+01 3.26352E+01 5.70000E+01 4.21513E+01
5.27816E+01 3.52676E+01 5.70000E+01 4.21513E+01
[...]
这里需要空行来让gnuplot绘制线框,如下所述(lowrank.net/gnuplot/datafile-e.html,参见'三维数据')。只需拨打电话' splot'在gnuplot中绘制我的数据的正确线框。
尝试使用以下代码在matplotlib中绘制它时:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.close('all')
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
file_in = open('wireframe_data.dat')
with file_in as file:
data_mani = [[np.double(digit) for digit in line.split()] for line in file]
file_in.close()
data_mani = list(filter(None, data_mani)) # remove blank lines, fastest way
data_mani = np.array(data_mani, dtype='float64')
ax.plot_wireframe(data_mani[:, 0], data_mani[:, 1], data_mani[:, 2], rcount = 10, ccount = 10, linewidth=0.7)
它仅沿z方向绘制固定z坐标和沿圆圈的一条线,即不是完全线框。结果就像这样......
Matplotlib plot of my wireframe (different data, but same structure)
我试图弄清楚如何在python中正确绘制它,我无法使用不同的网格网格调用。目前我甚至不确定我是否需要meshgrid,因为表面数据已经存在。也许有人有想法,可以帮助我吗?我此刻真的很沮丧。
期待您的回答。
祝福, TheOrangeman
答案 0 :(得分:1)
好的,我找到了解决方案。我必须通过以下方式重塑我的数据:
[...]
num_z = len(np.unique(data_mani[:, 2]))
points_per_z = len(data_mani) / num_z
XX = np.reshape(data_mani[:, 0], (num_z, points_per_z))
YY = np.reshape(data_mani[:, 1], (num_z, points_per_z))
ZZ = np.reshape(data_mani[:, 2], (num_z, points_per_z))
ax.plot_wireframe(XX, YY, ZZ)
现在看起来像this。