如何通过 Matplotlib 获得以下曲面?
在matlab中很容易通过:
mesh(peaks)
mesh
似乎 matplotlib在 matlab中没有精确的对应物。没有Wireframe plots
任何colormap
选择
如何通过 Matplotlib 获得以下曲面?
在matlab中很容易通过:
mesh(peaks)
mesh
似乎 matplotlib在 matlab中没有精确的对应物。没有Wireframe plots
任何colormap
选择
在回答另一个问题时,我发现您可以轻松地使用它plot_surface
来生成颜色映射表面,然后交换面和边缘颜色:
surf = ax.plot_surface(X, Y, Z, rstride=2, cstride=2, shade=False, cmap="jet", linewidth=1)
draw()
surf.set_edgecolors(surf.to_rgba(surf._A))
surf.set_facecolors("white")
show()
生产
该解决方案相对于另一种解决方案的缺点是边缘没有平滑的逐像素着色,而是每个边缘只有一种颜色。
使用 matplotlib 似乎是可能的,即使它有点 hack:
from mpl_toolkits.mplot3d import axes3d
from mpl_toolkits.mplot3d import art3d
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
wire = ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
# Retrive data from internal storage of plot_wireframe, then delete it
nx, ny, _ = np.shape(wire._segments3d)
wire_x = np.array(wire._segments3d)[:, :, 0].ravel()
wire_y = np.array(wire._segments3d)[:, :, 1].ravel()
wire_z = np.array(wire._segments3d)[:, :, 2].ravel()
wire.remove()
# create data for a LineCollection
wire_x1 = np.vstack([wire_x, np.roll(wire_x, 1)])
wire_y1 = np.vstack([wire_y, np.roll(wire_y, 1)])
wire_z1 = np.vstack([wire_z, np.roll(wire_z, 1)])
to_delete = np.arange(0, nx*ny, ny)
wire_x1 = np.delete(wire_x1, to_delete, axis=1)
wire_y1 = np.delete(wire_y1, to_delete, axis=1)
wire_z1 = np.delete(wire_z1, to_delete, axis=1)
scalars = np.delete(wire_z, to_delete)
segs = [list(zip(xl, yl, zl)) for xl, yl, zl in \
zip(wire_x1.T, wire_y1.T, wire_z1.T)]
# Plots the wireframe by a a line3DCollection
my_wire = art3d.Line3DCollection(segs, cmap="hsv")
my_wire.set_array(scalars)
ax.add_collection(my_wire)
plt.colorbar(my_wire)
plt.show()
当前matplotlib 1.3.1
似乎无法处理此类mesh
绘图或进一步的 PDF 导出。gnuplot.py
在 matplotlib 进一步更新之前, gnuplot.py 1.8可能是一个选择。
这是通过 gnuplot 创建的示例:
MayaVI2不支持 PDF 导出,但可能是另一个不错的选择。