使用twinx时定义纵横比

时间:2014-07-14 13:54:59

标签: python matplotlib aspect-ratio

如何为使用twinx

的地块设置纵横比

下面,我提供三个例子:

  1. 没有twinx来突出显示我如何设置宽高比
  2. 只有twinx来说明如何重置先前定义的宽高比
  3. 我尝试使用y定义twinx - 轴的宽高比(不起作用)
  4. 我正在使用matplotlib 1.3.0
    以下脚本说明了如何设置简单绘图的宽高比:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,1.6,50) + 50.0
    
    fig = plt.figure()
    
    ax = fig.add_subplot(111)
    
    XLIM = [50.0, 51.6]
    YLIM = [0.0, 1.1, 0.0, 11.0] 
    
    ax.plot(x,np.sin(x-50.0),'b')
    
    ax.set_xlim([XLIM[0], XLIM[1]])
    ax.set_ylim([YLIM[0], YLIM[1]])
    
    ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
    ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])
    
    ax.grid(True,which='major',linestyle='solid')
    
    ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
    
    plt.show()
    

    这个产生的数字有一个明确的宽高比:

    first plot

    但是,如果我想使用y函数添加额外的twinx() - 轴,则会重置宽高比:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,1.6,50) + 50.0
    
    fig = plt.figure()
    
    ax = fig.add_subplot(111)
    ax2 = ax.twinx()
    
    XLIM = [50.0, 51.6]
    YLIM = [0.0, 1.1, 0.0, 11.0] 
    
    ax.plot(x,np.sin(x-50.0),'b')
    
    ax.set_xlim([XLIM[0], XLIM[1]])
    ax.set_ylim([YLIM[0], YLIM[1]])
    
    ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
    ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])
    
    ax.grid(True,which='major',linestyle='solid')
    
    ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
    
    plt.show()
    

    导致此图(其中左侧的先前定义的y - 限制被重置):

    first twinx attempt

    现在,尝试再次指定宽高比不会产生预期的结果:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,1.6,50) + 50.0
    
    fig = plt.figure()
    
    ax = fig.add_subplot(111)
    ax2 = ax.twinx()
    
    XLIM = [50.0, 51.6]
    YLIM = [0.0, 1.1, 0.0, 11.0] 
    
    ax.plot(x,np.sin(x-50.0),'b')
    ax2.plot(x,np.cos(x-50.0)*10.,'r')
    
    ax.set_xlim([XLIM[0], XLIM[1]])
    ax.set_ylim([YLIM[0], YLIM[1]])
    ax2.set_ylim([YLIM[2], YLIM[3]])
    
    ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
    ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])
    ax2.set_yticks(np.arange(YLIM[2], YLIM[3]+1.0, 1.0))
    
    ax.grid(True,which='major',linestyle='solid')
    
    ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
    ax2.set_aspect((XLIM[1]-XLIM[0])/(YLIM[3]-YLIM[2]))
    
    plt.show()
    

    这会产生:

    attempt to fix the aspect ratio

    为了生成第一个图,但有两个y - 不同比例的轴,我缺少什么?使用twinx时如何定义宽高比?

2 个答案:

答案 0 :(得分:7)

查看轴的adjustable参数。这可以控制在更改方位/限制时是否更改数据限制或边界矩形的形状。

通常,选项为"box""datalim",但共享轴的特殊情况。在您的情况下,您需要adjustable='box-forced'

作为一个简单的例子(我冒昧地稍微简化了一些事情,如果他们对你更清楚,可以随意使用单独的set_foo方法。如果采取这种方法,方法是{{ 1}}):

ax.set_adjustable

enter image description here

答案 1 :(得分:0)

Matplotlib 3.1删除了选项“ box-forced”。现在,乔的解决方案产生了ValueError: 'box-forced' is not a valid value for adjustable; supported values are 'box', 'datalim'。解决方法可以在Define aspect ratio when using twinx in new version of matplotlib上找到。