python - 使用 twinx 时定义纵横比

标签 python matplotlib aspect-ratio

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


下面,我举三个例子:

  1. 没有 twinx 来突出显示我是如何设置宽高比的
  2. 仅用twinx来说明如何重置先前定义的纵横比
  3. 我尝试在使用 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()

生成的图形具有定义的纵横比:

first plot

但是,如果我想使用 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-limits 被重置):

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 时如何定义纵横比?

最佳答案

查看轴的 adjustable 参数。这控制在更改纵横比/限制时是否更改数据限制或边界矩形的形状。

通常情况下,选项是"box""datalim",但有一个共享轴的特殊情况。在您的情况下,您需要 adjustable='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()

enter image description here

关于python - 使用 twinx 时定义纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24738186/

相关文章:

python - 我可以将具有多对一关系映射的 CSV 批量上传到 Django 吗?

python - 如何从循环更新 matplotlib 图?

Python pandas 线图 : change x-axis to be linear

css - 通过将图像高度设置为容器高度,使图像适合其容器

c# - 调整控件大小以匹配纵横比

python - 从 C++ 调用的 python 方法返回列表

python - 在名为 `types.py` 的文件上运行 Python 的 doctest

python - matplotlib plt.show() 预索引空 numpy 数组时出现视觉故障

qt - 如何使用 QML 布局在网格中排列纵横比缩放的项目?

python - 硬编码置信区间作为条形图中的 mustache