【发布时间】:2014-10-07 17:37:08
【问题描述】:
我想在 Matplotlib 中绘制一个由零组成的曲面,除了以 (0, 0) 为中心的矩形区域,边为 (Dx, Dy),由一个组成 - 有点像一张桌子,如果你愿意的话;我可以使用plot_surface 命令来做到这一点,不用担心。我还想在“x”和“y”方向(如this demo)绘制它的投影,这时结果变得很奇怪:Python 似乎在插值我的幅度值(同样,它应该是零或一)用于等高线图并显示一些值与我的数据点不对应的线。
这就是我正在做的:
import numpy
from matplotlib import pylab
from mpl_toolkits.mplot3d import axes3d
Dx = 1. # Define the sides of the rectangle
Dy = 2.
x_2D = numpy.linspace(-Dx, Dx, 100) # Create the mesh points
y_2D = numpy.linspace(-Dy, Dy, 100)
x_mesh, y_mesh = numpy.meshgrid(x_2D, y_2D)
rect_2D = numpy.zeros(x_mesh.shape) # All values of "rect_2D" are zero...
for i in range(x_2D.size):
for j in range(y_2D.size):
if numpy.abs(x_mesh[i, j]) <= Dx/2 and numpy.abs(y_mesh[i, j]) <= Dy/2:
rect_2D[i, j] = 1. # ... except these ones
fig = pylab.figure(figsize=(9, 7))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x_mesh, y_mesh, rect_2D, alpha=0.3)
ax.contour(x_mesh, y_mesh, rect_2D, zdir='x', offset=-1.5, cmap=pylab.cm.brg)
ax.contour(x_mesh, y_mesh, rect_2D, zdir='y', offset=3, cmap=pylab.cm.brg)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-3, 3)
ax.set_zlim(0., 1.5)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
生成的图形在“x”和“y”投影上都有一条振幅略低于 0.8 的深绿色线,这在我的“rect_2D”变量中不存在。有谁知道这是一个错误还是我的代码有错误?关于如何摆脱它的任何建议?提前致谢!
【问题讨论】:
-
您可能想知道,一个 numpy 代码可以运行矢量化并且执行速度比 嵌套 for 循环快得多。从 36300+ [usec] 下降到大约 340 [usec] 使得处理速度提高了 100 倍以上,恕我直言,值得一提。矢量化 numpy 语法如下所示:
rect_2D[:,:] = 1 * ( ( numpy.abs( x_mesh ) <= DxHalf ) * ( numpy.abs( y_mesh ) <= DyHalf ) )跨度> -
感谢user3666197,确实值得一提!每当我记得时,我都会尝试使用矢量化代码,但旧习惯很难改掉!
标签: python matplotlib plot data-visualization