从二次重新缩放次级y轴

时间:2014-02-15 21:00:03

标签: python matplotlib visualization

我正在尝试添加一个辅助y轴,其刻度从原始刻度重新缩放。我的代码中的rescaleY函数使用twiny来添加辅助轴,然后我设置新轴的ybound并为其设置纵横比。结果显示左右y轴之间的正确对应关系,但边界不正确。

我想要什么: 左侧y轴的ybound为(-0.5,4.5),右侧y轴的ybound为(-5.0,45.0)。

我得到的:左y轴的ybound为(-2,6),右y轴的ybound为(-20,60),即顶部和底部有白色条纹实际绘图区。

只有当原始图的宽高比“相等”时,才会出现此问题。在这种情况下,这是调用imshow的结果(相反,如果我使用pcolormesh,一切看起来都很好;如果我为imshow的结果手动重置方面,它也很好)。您可能还注意到,ybound的屏幕打印与您从图像中读取的内容不同。

任何人都有想法解决这个问题?感谢。

代码:

from matplotlib.pyplot import *
from numpy import *

def rescaleY(ax=None,scaleY=1.0):
    '''
    Add an right-side y-axis whose ticks are 
    rescaled from that of ax by scaleY.
    '''
    if ax == None:
        ax = gca()
    x0,x1 = ax.get_xbound()
    y0,y1 = ax.get_ybound()
    axTwinX = ax.twinx()
    if ax.get_aspect() in ['equal',1.,1]:
        axTwinX.set_aspect(1./scaleY)
    axTwinX.set_ybound(y0*scaleY, y1*scaleY)
    #print axTwinX.get_xbound(),axTwinX.get_ybound()
    return axTwinX

xs = arange(10)
ys = arange(5)
x,y=meshgrid(xs,ys)
ax = gca()
ax.imshow(sin(x),origin='lower')

axTwinX = rescaleY(ax,10)

print ax.get_xbound(),ax.get_ybound(),ax.get_aspect()
print axTwinX.get_xbound(),axTwinX.get_ybound(),axTwinX.get_aspect()
savefig('rescaleY',bbox_inches='tight')
show()

结果命令行输出:

( - 0.5,9.5)( - 0.5,5.5)等于

( - 0.5,9.5)( - 5.0,45.0)0.1

结果图片: rescaleY

1 个答案:

答案 0 :(得分:1)

ax.imshow(...)

行下插入
ax.set_aspect('auto')

此设置的宽高比使其适合要显示的数据。