1

假设我有一些 matplotlib 代码,如下所示:

### import statements, etc. ###

ax1 = fig.add_subplot(221)

### plot some 2D data to ax1 ###

ax2 = fig.add_subplot(221, projection='3d')

### plot some 3D data to ax2 ###

这条线的效果ax2 = ...是删除任何绘制到的内容ax1,并创建一个新的 Axes3DSubplot 对象。

我的问题是:如何获得一个具有3D 投影并且“导入”之前绘制到的所有 2D 数据的ax2对象(具有相同的子图位置) ?ax1ax1

4

2 回答 2

0

2D-Axes您可以从相应的 中绘制数据3D-Axes。例子:

从中得到:

在此处输入图像描述

在这里绘制:

在此处输入图像描述

这是用于上述示例的代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.ion()
ax1 = plt.subplot(221)
ax1.plot([1,2,3,4])
ax2 = plt.subplot(222)
ax2.plot([4,3,2,1])
ax3 = plt.subplot(223)
ax3.plot([4,3,2,1])
ax4 = plt.subplot(224)
ax4.plot([1,2,3,4])
plt.gcf().tight_layout()
plt.show()

plt.figure()
ax1_3d = plt.subplot(221, projection='3d')
ax2_3d = plt.subplot(222, projection='3d')
ax3_3d = plt.subplot(223, projection='3d')
ax4_3d = plt.subplot(224, projection='3d')
[ax1_3d.plot(*ax1.lines[i].get_data()) for i,v in enumerate(ax1.lines)]
[ax2_3d.plot(*ax2.lines[i].get_data()) for i,v in enumerate(ax2.lines)]
[ax3_3d.plot(*ax3.lines[i].get_data()) for i,v in enumerate(ax3.lines)]
[ax4_3d.plot(*ax4.lines[i].get_data()) for i,v in enumerate(ax4.lines)]
plt.gcf().tight_layout()
plt.show()
于 2013-06-30T06:40:48.973 回答
0

这有点复活,但我今天遇到了同样的问题并找到了一个解决方案,主要基于@Saullo Castro 的回答。这个例子使用了一个子图,但不管你有多少,这个想法都是一样的:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Initial 2d axes
ax1 = plt.subplot(111)
ax1.plot([1,2,3,4])

# Create Axes3D and plot the 2d data on it
ax1_3d = plt.subplot(111, projection='3d')
[ax1_3d.plot(*ax1.lines[i].get_data()) for i,v in enumerate(ax1.lines)]

# Important step: turn off the old 2d axes!
ax1.set_axis_off()
plt.show()
于 2015-07-17T20:14:38.653 回答