如何在不拉伸图像的情况下更改matplotlib中imshow的比例?

时间:2012-06-10 13:31:09

标签: python matplotlib

我想以类似于第二个示例http://www.scipy.org/Plotting_Tutorial的方式使用imshow绘图,但要重新定义轴的比例。当我这样做的时候,我也希望图像保持静止!

示例中的代码:

from scipy import *
from pylab import *

# Creating the grid of coordinates x,y 
x,y = ogrid[-1.:1.:.01, -1.:1.:.01]

z = 3*y*(3*x**2-y**2)/4 + .5*cos(6*pi * sqrt(x**2 +y**2) + arctan2(x,y))

hold(True)
# Creating image
imshow(z, origin='lower', extent=[-1,1,-1,1])

xlabel('x')
ylabel('y')
title('A spiral !')

# Adding a line plot slicing the z matrix just for fun. 
plot(x[:], z[50, :])

show()

如果我将范围修改为更宽,例如:

imshow(z, origin='lower', extent=[-4,4,-1,1])

然后拉伸得到的图像。但我想做的就是改变刻度以与我的数据一致。我知道我可以使用pcolor来保存X和Y数据,但这会产生其他后果。

我找到了这个答案,它允许我手动重做所有刻度:

How do I convert (or scale) axis values and redefine the tick frequency in matplotlib?

但这似乎有点矫枉过正。

有没有办法只改变标签显示的范围?

1 个答案:

答案 0 :(得分:11)

help(imshow)会找到aspect参数,经过一些实验后似乎给出了你想要的东西(螺旋的方形图像,但是x的比例从-4到4,而y来自-1到1)当这样使用时:

imshow(z, origin='lower', extent=[-4,4,-1,1], aspect=4)

但是现在你的plot仍然是-1到1,所以你也必须修改它......

plot(x[:]*4, z[50, :])

我认为当你有几个必须修改的元素时,只需使用单行刻度重新标记而不是过度杀伤:

xticks(xticks()[0], [str(t*4) for t in xticks()[0]])