[英]Plotting 3D surface in python
尽管有几个关于如何使用 XYZ 格式绘制 3D 曲面的来源。 我有一个来自扫描激光的 CSV 文件,它不提供 X 和 Y 的坐标信息,只提供矩形网格的 Z 坐标。
该文件为 800 x 1600,只有 z 坐标。 Excel 可以很容易地用曲面图绘制它,但受大小限制。
我该如何解决这个问题?
您只需要创建X
和Y
坐标的数组。 我们可以用numpy.meshgrid
做到这numpy.meshgrid
。 在下面的例子中,我设置单元格大小为1,但可以很容易地扩展,通过改变cellsize
可变。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# Create x, y coords
nx, ny = 800, 1600
cellsize = 1.
x = np.arange(0., float(nx), 1.) * cellsize
y = np.arange(0., float(ny), 1.) * cellsize
X, Y = np.meshgrid(x, y)
# dummy data
Z = (X**2 + Y**2) / 1e6
# Create matplotlib Figure and Axes
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
print X.shape, Y.shape, Z.shape
# Plot the surface
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
我遇到了类似的问题,@tmdavison 的回复让我朝着正确的方向前进。 但是这个答案在从 CSV 文件中检索数据的部分不清楚。
这是我的解决方案。
import csv
import matplotlib.pyplot as plt
import numpy
def csv_3d(file_name):
"""Draw content of csv file with matplotlib 3D like MS Excel."""
data = [
[float(i.replace(',', '.')) for i in row]
for row in csv.reader(open(file_name), delimiter=';')
]
# matplotlib/numpy magic
x_arr, y_arr = numpy.meshgrid(
numpy.arange(0.0, float(len(data[0])), 1.0), # x: number of columns in csv
numpy.arange(0.0, float(len(data)), 1.0), # y: number of rows in csv
)
z_arr = numpy.array(data) # transform csv data into 2D values numpy array
plt.figure(num=file_name)
axes = plt.axes(projection="3d")
axes.plot_surface(x_arr, y_arr, z_arr)
plt.show()
csv_3d('my.csv')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.