【问题标题】:Python - Plotting two 3D graphs with a contour mapPython - 用等高线图绘制两个 3D 图
【发布时间】:2020-05-18 17:49:05
【问题描述】:

我正在尝试在 Python 中绘制一个带有两个 3D 图(相同函数,不同角度)和一个相同函数的 2D 等高线图的图形,我不知道为什么,但前两个数字没问题,等高线图很奇怪,它出现在前两个数字的底部,而且尺寸都很奇怪(见附图)。有没有办法将地图放置在其他 2 个图形的右侧并调整其大小以使其更像正方形?

感谢您的帮助。

这是我的代码:

import numpy as np
import matplotlib.pylab as plt
import matplotlib.cm as cm
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(-5, 5, 0.01)
y = np.arange(-5, 5, 0.01)
X, Y = np.meshgrid(x, y)

Z = 5 + (10 * X**2 + 20 * Y**2) * np.exp((-X**2)-(Y**2)) + 3 *np.sin(X) - np.sin(Y)

fig = plt.figure(figsize=(15,5))

ax1 = plt.subplot(131, projection='3d')
surf1 = ax1.plot_surface(X, Y, Z, cmap=cm.coolwarm)

ax2 = plt.subplot(132, projection='3d')
surf2 = ax2.plot_surface(X, Y, Z, cmap=cm.coolwarm)
for angle in range(0,360):
    ax2.view_init(20, angle)
    plt.pause(.001)

ax3 = plt.subplot(133)
surf3 = ax3.contour(X, Y, Z, colors='black', linestyles='dashed')
plt.clabel(surf3, fmt = '%.0f', inline=True, fontsize=8)


ax1.set_xlabel('X')
ax2.set_xlabel('X')
ax3.set_xlabel('X')
ax1.set_ylabel('Y')
ax2.set_ylabel('Y')
ax3.set_ylabel('Y')
ax1.set_zlabel('Z')
ax2.set_zlabel('Z')

plt.show()

【问题讨论】:

  • plt.subplots() 没有 ncols 和 nrows 参数吗?当我做多图时,我总是这样做:fig, (ax1,ax2,ax3) = plt.subplots(ncols=3,nrows=1) 这样我就可以在同一个无花果实例中获得三个相邻的图。编辑:看来您正在打开第二个图形实例,这就是发生这种情况的原因。将所有三个 ax 实例显式绑定到 fig 实例,并且不要单独调用任何 plt.somethingsomething 函数。如果你做一个 plt.调用并且它不是归因于斧头,它有时会创建一个新的无花果。
  • 顺便说一句,我 100% 偷了这个模板。

标签: python numpy matplotlib 3d


【解决方案1】:

知道了:

import numpy as np
import matplotlib.pylab as plt
import matplotlib.cm as cm
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(-5, 5, 0.01)
y = np.arange(-5, 5, 0.01)
X, Y = np.meshgrid(x, y)

Z = 5 + (10 * X**2 + 20 * Y**2) * np.exp((-X**2)-(Y**2)) + 3 *np.sin(X) - np.sin(Y)

fig = plt.figure(figsize=(15,5))

ax1 = fig.add_subplot(1, 3, 1, projection='3d')
surf1 = ax1.plot_surface(X, Y, Z, cmap=cm.coolwarm)

ax3 = fig.add_subplot(1, 3, 2)
surf3 = ax3.contour(X, Y, Z, colors='black', linestyles='dashed')
plt.clabel(surf3, fmt = '%.0f', inline=True, fontsize=8)


ax2 = fig.add_subplot(1, 3, 3, projection='3d')
surf2 = ax2.plot_surface(X, Y, Z, cmap=cm.coolwarm)


for angle in range(0,360):
    ax2.view_init(20, angle)
    plt.pause(.001)

ax1.set_xlabel('X')
ax2.set_xlabel('X')
ax3.set_xlabel('X')
ax1.set_ylabel('Y')
ax2.set_ylabel('Y')
ax3.set_ylabel('Y')
ax1.set_zlabel('Z')
ax2.set_zlabel('Z')

plt.show()

【讨论】:

  • 我认为问题与 matplotlib 中的多线程(或缺少多线程)有关。也许你可以应用它,如果你知道怎么做,但我不知道。我只是更改了子图定义的顺序。您基本上是一次又一次地回忆动画。直到那还没有用完(这只会发生,如果你关闭窗口),最后一个图(等高线图)将永远不会被绘制。因为您在同一个线程中运行所有内容,所以所有调用都将按时间顺序执行。而且由于第二次调用阻止了一切,我猜第三个子图被移到了一个单独的图中。
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2021-05-19
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多