Matplotlib如何在3D图的XY表面上以原点为中心放置2D图像?

问题描述:

我有一个尺寸为330x330像素,实际尺寸为5cm x 5cm的图像。当我尝试使用功能plot_surface时,图像的左上角卡住了原点。不过,我想在图像的中心在这样的原点定位,Matplotlib如何在3D图的XY表面上以原点为中心放置2D图像?

imageView

有没有什么办法可以做到这一点?我怎样才能将单位系统改为cm而不是像素?

编辑: 这里是我当前的代码:

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

xx, yy = np.meshgrid(np.linspace(0, 1, 330), np.linspace(0, 1, 330)) 
X = xx 
Y = yy 
ax.plot_surface(X, Y, 0, rstride=10, cstride=10, facecolors=plt.imread('pattern.jpg')/255., shade=False) 

plt.show() 
+0

在问这里之前,我会建议,[take the tour](http://*.com/tour)为例如熟悉[如何提出问题](http://*.com/help/how-to-ask)以及本网站上的常规系统。 – ImportanceOfBeingErnest

您可以使用figsize=(width, height)参数设置在matplotlib一个图形的大小。像素中的图形大小由参数dpi = 80确定。例如

plt.figure(figsize=(8,6)) 
... 
plt.savefig("out.png", dpi=100) 

将导致8倍6英寸的图形,其具有800×600像素。
您不能将单位从英寸更改为其他东西,但由于1英寸= 2.54厘米,因此如果需要,您可以计算所需的图形尺寸。

所有这些与matplotlib使用的绘图单元无关,在matplotlib中绘制的图形与真实长度单位无关,也就是说,您可以绘制太阳系地图旁边原子的大小,都在一张纸的大小的一个小区里。

图中原点的位置由轴限制确定。粗略地说,如果轴从02,原点位于图的左侧,如果您的图从-11,原点位于中间。

ax是您的轴对象,你可以通过

ax.set_xlim3d([-1,1]) 
ax.set_ylim3d([-1,1]) 
ax.set_zlim3d([-1,1]) 


设置使用

ax.set_xlim([-1,1]) 
ax.set_ylim([-1,1]) 
在2D情况下

或者是,对于3D情况下的起源现在我们有一些代码要使用,我们可以使用适当的坐标将图像设置在中心。如果图像被限定在0和1之间,那么轴坐标就会坐在那里,而不是以原点为中心。 当我们将图像定义为从-1到1时,它应该按预期工作。

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

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

xx, yy = np.meshgrid(np.linspace(-1, 1, 330), np.linspace(-1, 1, 330)) 
X = xx 
Y = yy 

c = np.random.rand(330,330,3) 

ax.plot_surface(X, Y, 0, rstride=30, cstride=30, 
       facecolors=c, shade=False) 

plt.show() 
+0

嗨@ImportanceOfBeingErnest,谢谢你的回答。但我认为我关于图像位置的问题仍然存在。通过改变轴的极限,原点确实到了中间,但图像仍然卡在第一象限中。我希望图像中心位于原点,以便整个图像看起来像我上传的图像中显示的正方形 – AnnieBin

+0

更新了答案。 – ImportanceOfBeingErnest

+0

我明白了。非常感谢 – AnnieBin