【问题标题】:Matplotlib scale y axis based on manually zoomed x axisMatplotlib 基于手动缩放的 x 轴缩放 y 轴
【发布时间】:2014-08-27 18:28:52
【问题描述】:

我有很多在 x 轴上相关的数据,但都以非常不同的 Y 值为中心。 x 上的数据也很长,因此很难看到细节。我希望能够为数据集手动设置 x 轴,然后让绘图根据位于手动设置 x 轴内的数据点的值重新调整 y 轴本身。

matplotlib 可以做到这一点吗?

【问题讨论】:

  • 如果你使用ax.set_aspect('equal') 你会得到这样的行为......
  • 感谢您的回复,您能详细说明一下吗?我需要先拿到轴吗?你怎么告诉它x轴是确定y轴的?
  • 不会 set_aspect('equal') 导致 y 轴与 x 轴相同?我不想要这种行为,y 轴的范围比 x 轴大得多,并且值完全不同。我想设置 x 轴限制,然后让 y 缩放本身,这样我就可以轻松地看到位于我设置的 x 轴内的数据。我也没有 x 轴的大小和 y 的大小之间的关系,所以我不能只设置一些纵横比
  • 我不知道现有的选项。您可以挂钩到 matplotlib DrawEvent,检查 x 轴刻度是否更改 ax.get_xlim() 并相应地设置 y 轴。

标签: python matplotlib plot


【解决方案1】:

根据 mdurant 的评论,我写了一些小例子作为你的起点:

import pylab as pl

pl.figure()
x = pl.rand(30)
x.sort()
y =  pl.sin(2 * pl.pi * x) + 0.1 * pl.randn(30)
pl.plot(x, y)

def ondraw(event):
    xlim = pl.gca().get_xlim()
    y_sel = y[pl.logical_and(x > xlim[0], x < xlim[1])]
    pl.gca().set_ylim((y_sel.min(), y_sel.max()))

pl.gcf().canvas.mpl_connect('draw_event', ondraw)

您可能想要添加更多 events 来处理鼠标移动等。

一些cmets:

  • 我正在使用pylab,因为它提供了用于生成示例数据的有用功能。但您也可以导入 matplotlib 库。
  • ondraw 事件处理程序获取当前坐标区 gca() 的当前 x 限制,选择 y 值以及 x 限制内对应的 x 坐标,并设置由最小和最大 y 值确定的新 y 限制选定的坐标。
  • 使用mpl_connect,我们将事件处理程序附加到当前坐标区。每次绘制轴时 - 例如由于新的绘图命令或手动用户交互 - 它调用 ondraw 来更新 y 限制。

【讨论】:

  • 你能再解释一下你的代码吗?您似乎使用 pylab,但我使用的是 matplotlib。
  • @user3123955:请查看matplotlib documentation on event handling。 PyLab 基本上是 a different interface 到 NumPy 和 matplotlib,以前的 Matlab 用户经常使用。您可以同时使用两者。命令几乎相同。