Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用twinx时定义纵横比_Python_Matplotlib_Aspect Ratio - Fatal编程技术网

Python 使用twinx时定义纵横比

Python 使用twinx时定义纵横比,python,matplotlib,aspect-ratio,Python,Matplotlib,Aspect Ratio,如何为使用twinx的绘图设置纵横比 下面,我提供三个例子: 不使用twinx来突出显示我如何设置纵横比 仅使用twinx说明如何重置先前定义的纵横比 我试图在使用twinx时定义两个y轴的纵横比(这不起作用) 我正在使用matplotlib 1.3.0 以下脚本说明了如何设置简单绘图的纵横比: import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,1.6,50) + 50.0 fig = plt.figu

如何为使用
twinx
的绘图设置纵横比


下面,我提供三个例子:

  • 不使用
    twinx
    来突出显示我如何设置纵横比
  • 仅使用
    twinx
    说明如何重置先前定义的纵横比
  • 我试图在使用
    twinx
    时定义两个
    y
    轴的纵横比(这不起作用)
  • 我正在使用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()
    
    由此生成的图形具有定义的纵横比:

    但是,如果我想使用
    twinx()
    功能添加一个额外的
    y
    -轴,纵横比将重置:

    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
    -限值被重置):

    现在,再次尝试指定纵横比不会产生预期结果:

    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()
    
    这将产生:


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

    查看轴的
    可调参数。这将控制当纵横比/限制更改时,是更改数据限制还是更改边界矩形的形状

    通常,选项是
    “box”
    “datalim”
    ,但对于共享轴有一个特殊情况。在您的情况下,您需要
    可调class='box-forced'

    举一个简单的例子(我自由地稍微简化了一些事情,如果你更清楚的话,可以随意使用单独的
    set\u foo
    方法。如果你这样做,方法就是
    ax.set\u adjustable
    ):


    Matplotlib 3.1删除了“框强制”选项。Joe的解决方案现在产生一个
    ValueError:“box forced”不是可调的有效值;支持的值为“box”、“datalim”
    。可在以下位置找到解决方法

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,1.6,50) + 50.0
    
    fig, ax = plt.subplots()
    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(adjustable='box-forced',
           xlim=XLIM, ylim=YLIM[:2],
           xticks=np.arange(XLIM[0], XLIM[1], 0.2),
           yticks=np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1],
           aspect=(XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
    
    ax2.set(adjustable='box-forced',
            ylim=YLIM[2:],
            yticks=np.arange(YLIM[2], YLIM[3]+1.0, 1.0),
            aspect=(XLIM[1]-XLIM[0])/(YLIM[3]-YLIM[2]))
    
    ax.grid(True, which='major',linestyle='solid')
    
    plt.show()