Python 如何将现有二维AxesSubplot对象转换/升级为Axes3DSubplot对象?

Python 如何将现有二维AxesSubplot对象转换/升级为Axes3DSubplot对象?,python,matplotlib,Python,Matplotlib,假设我有一些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的内容,并创建新的axes3dsublot对象 我的问题是:如何获

假设我有一些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
的内容,并创建新的axes3dsublot对象


我的问题是:如何获得一个
ax2
对象(与
ax1
具有相同的子地块位置),该对象具有三维投影,并“导入”先前绘制到
ax1
的所有二维数据?

您可以在相应的
3D轴中绘制
2D轴的数据。例如:

从中获得:

在此绘图:

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

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()

这有点像复活,但我今天遇到了同样的问题,并找到了一个解决方案,主要基于@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()

这是一个很好的示例,它几乎回答了我的问题--我想避免在代码中调用plt.figure(),而只是替换第一个图的现有子图。如果您可以修改答案(或添加到答案中),那么就有一个临时存储数据的示例(或者更节省空间的示例?),我很乐意接受这个答案。为什么要关闭2d轴?我看不出有没有这行代码有什么区别。这可能不是所有情况下都需要的,但是关闭它会阻止2d轴上的任何东西被渲染。我想这是一个“安全总比后悔好”的措施。