从plt.imshow()
官方指南中,我们知道 aspect 控制轴的纵横比。好吧,用我的话来说,方面正是 x unit和 y unit的比率。大多数情况下,我们希望将其保持为 1,因为我们不想无意中扭曲数字。但是,确实有一些情况需要我们指定aspect一个不是1的值。提问者提供了一个很好的例子,x和y轴可能有不同的物理单位。假设x以km为单位,y以m为单位。因此,对于 10x10 数据,范围应为 [0,10km,0,10m] = [0, 10000m, 0, 10m]。在这种情况下,如果我们继续使用默认的 aspect=1,那么图形的质量真的很差。因此,我们可以指定 aspect = 1000 来优化我们的图形。下面的代码说明了这种方法。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
rng=np.random.RandomState(0)
data=rng.randn(10,10)
plt.imshow(data, origin = 'lower', extent = [0, 10000, 0, 10], aspect = 1000)
不过,我认为有一个替代方案可以满足提问者的需求。我们可以将范围设置为 [0,10,0,10] 并添加额外的 xy 轴标签来表示单位。代码如下。
plt.imshow(data, origin = 'lower', extent = [0, 10, 0, 10])
plt.xlabel('km')
plt.ylabel('m')
要做出正确的数字,我们应该始终牢记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]。使用默认方面,我们可以有矩形颜色像素,而单位像素仍然是正方形!
plt.imshow(data, origin = 'lower', extent = [0, 15, 0, 10])
# Or we have similar x_max and y_max but different data.shape, leading to different color pixel res.
data=rng.randn(10,5)
plt.imshow(data, origin = 'lower', extent = [0, 5, 0, 5])
颜色像素的方面是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 倍,从而得到一个正方形的颜色像素和正方形的整个图形,而不是矩形的像素单元。显然,它通常不被接受。
data=rng.randn(10,10)
plt.imshow(data, origin = 'lower', extent = [0, 15, 0, 10], aspect = 1.5)
最不希望的情况是设置纵横比为任意值,如 1.2,这将导致既不会导致正方形单位像素也不会导致正方形颜色像素。
plt.imshow(data, origin = 'lower', extent = [0, 15, 0, 10], aspect = 1.2)
长话短说,设置正确的范围并让 matplotlib 为我们做剩下的事情总是足够的(即使 x_res!=y_res)!只有在必须时才改变方面。