Python 是否从三维打印中提取绘图仪Matplotlib二维轴?

Python 是否从三维打印中提取绘图仪Matplotlib二维轴?,python,matplotlib,plot,Python,Matplotlib,Plot,这就是我的问题所在——我使用一个基于matplotlib的库,它接受2D轴ax作为输入,并使用ax.imshow,这就假设传递给它的ax是2D轴。我想使用此库,但要在三维matplotlib绘图上以z=0在xy平面上绘制其结果 据我所知: 。。。基本上,我必须使用ax.plot\u surface在3D中获得与ax.imshow等效的效果。然而,这涉及到重写/破解库,因此所有相应的调用都被替换 所以,我试着想出这个简单的例子,看看在3D环境中使用imshow可以实现什么: 将numpy导

这就是我的问题所在——我使用一个基于matplotlib的库,它接受2D轴
ax
作为输入,并使用
ax.imshow
,这就假设传递给它的
ax
是2D轴。我想使用此库,但要在三维matplotlib绘图上以z=0在xy平面上绘制其结果

据我所知:

。。。基本上,我必须使用
ax.plot\u surface
在3D中获得与
ax.imshow
等效的效果。然而,这涉及到重写/破解库,因此所有相应的调用都被替换

所以,我试着想出这个简单的例子,看看在3D环境中使用
imshow
可以实现什么:

将numpy导入为np
将matplotlib.pyplot作为plt导入
将matplotlib.cm导入为cm
图=plt.图()
ax3d=fig.add_子地块(投影=3d')
x=np.linspace(0,1100)
y=np.sin(x*2*np.pi)/2+0.5
#ax3d.plot(x,y,zs=0,zdir='z',label='curve in(x,y)'
#2d绘图的语法:
ax3d.plot(x,y,label=(x,y)中的曲线)#
# https://matplotlib.org/stable/gallery/images_contours_and_fields/image_demo.html
增量=0.025
xa=ya=np.arange(0.0,1.0,δ)
Xa,Ya=np.meshgrid(Xa,Ya)
Z1a=np.exp(-Xa**2-Ya**2)
Z2a=np.exp(-(Xa-1)**2-(Ya-1)**2)
Za=(Z1a-Z2a)*2
#imshow导致未实现错误:Axes3D当前仅支持方面参数“auto”。你通过了“平等”考试。
ax3d.set_aspect('auto')#没有帮助
im=ax3d.imshow(Za,插值='双线性',cmap=cm.RdYlGn,
原点='lower',范围=[0,1,0,1],
vmax=abs(Za).max(),vmin=-abs(Za).max(),
aspect='auto'#使imshow通过并绘制-但图形未连接到三维旋转
)
ax3d.set_xlim(0,1)
ax3d.set_ylim(0,1)
ax3d.set_zlim(0,1)
ax3d.view_init(标高=20,方位=35)
plt.show()
。。。因此,从语法上讲,它可以被“哄骗”——不幸的是,结果不是3D绘图的“一部分”,因为它不在z=0时的xy平面上,并且它不会像绘图的其余部分那样随3D视图旋转:

所以,我在想-是否有一种方法/a“hack”排序,以便我可以“提取”3D绘图z=0处xy平面的2D Axis matplotlib对象,-然后使用该Axis对象作为输入传递到库,库将照常进行(但其绘图的最终结果将是3D绘图的一部分)?基本上,如以下伪代码所示:

。。。
ax2dxy=ax3d.get_2daxes('x','y',z=0)#伪
im=ax2dxy.imshow(Za,插值='双线性',cmap=cm.RdYlGn,
原点='lower',范围=[0,1,0,1],
vmax=abs(Za).max(),vmin=-abs(Za).max(),
)
...

这个问题的答案不太清楚-而且很可能,从3D轴“提取”可绘制的2D轴并不容易-但在下面的示例中,我尝试了它,但我无法让它做很多事情

然而,我也尝试过在“虚拟”2D轴上绘制2D
imshow
,并将该数据重新用于3D打印表面,似乎效果不错:

将numpy导入为np
导入matplotlib
将matplotlib.pyplot作为plt导入
将matplotlib.cm导入为cm
进口检验
图=plt.图()
ax3d=fig.add_子地块(投影=3d')
#~ax3d=图添加_子图()
x=np.linspace(0,1100)
y=np.sin(x*2*np.pi)/2+0.5
#ax3d.plot(x,y,zs=0,zdir='z',label='curve in(x,y)'
#2d绘图的语法:
ax3d.plot(x,y,label=(x,y)中的曲线)#
# https://matplotlib.org/stable/gallery/images_contours_and_fields/image_demo.html
增量=0.025
xa=ya=np.arange(0.0,1.0,δ)
Xa,Ya=np.meshgrid(Xa,Ya)
Z1a=np.exp(-Xa**2-Ya**2)
Z2a=np.exp(-(Xa-1)**2-(Ya-1)**2)
Za=(Z1a-Z2a)*2
#打印(inspect.getsourcefile(ax3d.plot3D))35;/mingw64/lib/python3.8/site-packages/mpl_工具包/mplot3d/axes3d.py
#打印(inspect.getsource(ax3d.plot3D))#定义打印!plot3D=绘图
#打印(inspect.getsourcefile(matplotlib.axes.axes))#/mingw64/lib/python3.8/site-packages/matplotlib/axes//u axes.py
#imshow in/mingw64/lib/python3.8/site-packages/matplotlib/axes//u axes.py
打印(ax3d.xaxis,ax3d.yaxis,ax3d._位置)#ax3d._位置为矩形,Bbox(x0=0.125,y0=0.1099999999999,x1=0.9,y1=0.88)
newax=matplotlib.axes.axes(图(0,0,1,1))
打印(新最大位置)#Bbox(x0=0.0,y0=0.0,x1=1.0,y1=1.0)
newax.xaxis=ax3d.xaxis
newax.yaxis=ax3d.yaxis
#imshow导致未实现错误:Axes3D当前仅支持方面参数“auto”。你通过了“平等”考试。
ax3d.set_aspect('auto')#没有帮助
#im=ax3d.imshow(Za,插值='双线性',cmap=cm.RdYlGn,
#原点='lower',范围=[0,1,0,1],
#vmax=abs(Za).max(),vmin=-abs(Za).max(),
#aspect='auto'#使imshow通过并绘制-但图形未连接到三维旋转
#               )
imB=newax.imshow(Za,插值='双线性',cmap=cm.RdYlGn,
原点='lower',范围=[0,1,0,1],
vmax=abs(Za).max(),vmin=-abs(Za).max(),
)#通过,但没有显示任何内容
#imB.axes=ax3d#value错误:无法重置轴。您可能试图在多个不受支持的轴上重复使用艺术家
#~print(newax.images)#[]
#~print(imB.\u A)#有吗
fig.canvas.draw()#调用创建fig.canvas.renderer
im,l,b,trans=imB.make_image(图canvas.renderer,unsample=True)
#打印(im)
ax3d.set_axis低于(False)
ax3d.plot_曲面(Xa,Ya,np.zero(Xa.shape),rstride=1,cstride=1,facecolors=np.divide(im,255.0),shade=False,zorder=-100)
#ax3d.grid(True,哪个='major')
ax3d.set_xlim(0,1)
ax3d.set_ylim(0,1)
ax3d.set_zlim(0,1)
ax3d.view_init(标高=20,方位=35)
plt.show()
上述代码生成:

。。。看起来不错

现在我只希望我知道如何控制z阶(下面是plot_曲面,上面是网格线和正弦曲线)-