我正在写一个软件系统,通过三维数据集可视化切片和投影。我使用matplotlib
,特别是imshow
来可视化我从分析代码中得到的图像缓冲区。
因为我想用绘图轴注释图像,所以我使用imshow
提供的extent关键字将图像缓冲区像素坐标映射到数据空间坐标系。
不幸的是,matplotlib
不知道单位。假设(举一个人工例子)我想绘制一个维度为1000 m X 1 km
的图像。在这种情况下,范围应该是[0, 1000, 0, 1]
。即使图像数组是正方形的,由于extent关键字所隐含的纵横比是1000,因此生成的绘图轴也具有1000的纵横比。
是否可以强制绘图的纵横比,同时仍保留使用extent关键字自动生成的主要刻度线和标签?
您可以通过手动设置图像的方面(或通过让它自动缩放以填充图形的范围)来完成此操作。
默认情况下,
imshow
将绘图的方面设置为1,因为这通常是人们想要的图像数据。在你的情况下,你可以这样做:
从^{} 官方指南中,我们知道纵横比控制轴的纵横比。用我的话说,纵横比就是x单位和y单位的比值。大多数时候,我们希望保持它为1,因为我们不想无意中歪曲数字。然而,确实有一些情况下,我们需要指定方面a的值,而不是1。发问者提供了一个很好的例子,x轴和y轴可能有不同的物理单位。假设x以km为单位,y以m为单位。因此,对于10x10数据,范围应为[0,10km,0,10m]=[0,10000m,0,10m]。在这种情况下,如果我们继续使用default aspect=1,那么图的质量就非常糟糕。因此,我们可以指定aspect=1000来优化我们的图形。下面的代码说明了这种方法。
不过,我认为还有一种选择可以满足提问者的要求。我们可以将范围设置为[0,10,0,10]并添加额外的xy轴标签来表示单位。代码如下。
为了做出一个正确的数字,我们应该始终记住
x_max-x_min = x_res * data.shape[1]
和y_max - y_min = y_res * data.shape[0]
,其中extent = [x_min, x_max, y_min, y_max]
。默认情况下,aspect = 1
,表示单位像素为正方形。对于具有不同值的x_res和y_res,此默认行为也可以正常工作。扩展前面的例子,假设x_res是1.5,而y_res是1。因此范围应等于[0,15,0,10]。使用默认方面,我们可以有矩形颜色像素,而单位像素仍然是正方形!彩色像素的方面是
x_res / y_res
。将其纵横比设置为单位像素的纵横比(即aspect = x_res / y_res = ((x_max - x_min) / data.shape[1]) / ((y_max - y_min) / data.shape[0])
)将始终提供方形颜色像素。我们可以改变aspect=1.5,使x轴单位是y轴单位的1.5倍,从而得到一个正方形的彩色像素和正方形的整个图形,而不是矩形的像素单位。显然,这通常是不被接受的。最不希望出现的情况是,将aspect设置为任意值,如1.2,这既不会导致平方单位像素,也不会导致平方颜色像素。
长话短说,只要设置正确的范围,让matplotlib为我们做剩下的事情就足够了(即使x琰res!=是的)!只有在必要时才改变方面。
相关问题 更多 >
编程相关推荐