【问题标题】:Python contour plotting wrong values with plot_surfacePython 等高线用 plot_surface 绘制错误值
【发布时间】: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 ) &lt;= DxHalf ) * ( numpy.abs( y_mesh ) &lt;= DyHalf ) )跨度>
  • 感谢user3666197,确实值得一提!每当我记得时,我都会尝试使用矢量化代码,但旧习惯很难改掉!

标签: python matplotlib plot data-visualization


【解决方案1】:

levels = [0], kwarg 添加到您的ax.contour 电话中。这指定了沿zdir 轴计算轮廓的位置。有关详细信息,请参阅mpl.axes.Axes.contour 文档字符串。

问题在于,如果不指定 levels,contour 会自动计算绘制轮廓的位置,并且在“表格边缘”之后选择其中一个轮廓,但在 Zdata 为 0 之前。在这些点轮廓插值介于 0 和 1 之间。

【讨论】:

  • 嗨,farnorth,这是正确的!我确实想象 Matplotlib 会有某种方法来定义绘制哪些轮廓,但如果没有给出数据,我不希望它对数据进行插值。谢谢!
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 2022-01-05
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多