Imshow: extent and aspect
我正在编写一个通过3D数据集可视化切片和投影的软件系统。 我正在使用
由于我想用绘图轴注释图像,因此我使用
不幸的是,
是否可以在保持我通过使用range关键字获得的自动生成的主要刻度线和标签的同时,强制绘图的纵横比?
您可以通过手动设置图像的纵横比(或使其自动缩放以填满图形的范围)来实现。
默认情况下,
就您而言,您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import matplotlib.pyplot as plt import numpy as np grid = np.random.random((10,10)) fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10)) ax1.imshow(grid, extent=[0,100,0,1]) ax1.set_title('Default') ax2.imshow(grid, extent=[0,100,0,1], aspect='auto') ax2.set_title('Auto-scaled Aspect') ax3.imshow(grid, extent=[0,100,0,1], aspect=100) ax3.set_title('Manually Set Aspect') plt.tight_layout() plt.show() |
根据
1 2 3 4 5 6 | %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轴标签来表示单位。代码如下。
1 2 3 | plt.imshow(data, origin = 'lower', extent = [0, 10, 0, 10]) plt.xlabel('km') plt.ylabel('m') |
为了得出正确的数字,我们应始终牢记
1 2 3 4 | 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]) |
彩色像素的外观为
1 2 | data=rng.randn(10,10) plt.imshow(data, origin = 'lower', extent = [0, 15, 0, 10], aspect = 1.5) |
最不希望的情况是将纵横比设置为任意值,例如1.2,这将不会导致正方形单位像素或正方形颜色像素。
1 | plt.imshow(data, origin = 'lower', extent = [0, 15, 0, 10], aspect = 1.2) |
长话短说,设置正确的范围并让matplotlib为我们做其余的事情总是足够的(即使x_res!= y_res)!仅在必须时更改外观。