如何为使用twinx
?
下面,我提供三个例子:
twinx
来突出显示我如何设置宽高比twinx
来说明如何重置先前定义的宽高比y
定义twinx
- 轴的宽高比(不起作用)我正在使用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()
这个产生的数字有一个明确的宽高比:
但是,如果我想使用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
- 限制被重置):
现在,尝试再次指定宽高比不会产生预期的结果:
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
时如何定义宽高比?
答案 0 :(得分:7)
查看轴的adjustable
参数。这可以控制在更改方位/限制时是否更改数据限制或边界矩形的形状。
通常,选项为"box"
和"datalim"
,但共享轴的特殊情况。在您的情况下,您需要adjustable='box-forced'
。
作为一个简单的例子(我冒昧地稍微简化了一些事情,如果他们对你更清楚,可以随意使用单独的set_foo
方法。如果采取这种方法,方法是{{ 1}}):
ax.set_adjustable
答案 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上找到。