编程语言
首页 > 编程语言> > python – 使用twinx时定义宽高比

python – 使用twinx时定义宽高比

作者:互联网

如何为使用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”,但共享轴有一个特殊情况.在你的情况下,你想要adjust =’box-forced’.

作为一个简单的例子(我可以自由地简化一些事情,如果它们对你更清楚,可以随意使用单独的set_foo方法.如果采用这种方法,方法就是ax.set_adjustable.):

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()

标签:python,matplotlib,aspect-ratio
来源: https://codeday.me/bug/20190528/1173385.html