如何将现有的2D AxesSubplot对象转换/升级为Axes3DSubplot对象?

时间:2013-06-30 05:01:03

标签: 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的任何内容,并创建一个新的Axes3DSubplot对象。

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

2 个答案:

答案 0 :(得分:0)

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

从中得到:

enter image description here

在这里绘图:

enter image description here

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

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

答案 1 :(得分: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()