Matplotlib:缩放后找出xlim和ylim

13

请问有没有快速的方法可以在放大后跟踪我的图形边界限制呢?我想要精确地知道坐标,这样我就可以使用ax.set_xlimax.set_ylim来再现图形。我正在使用标准的qt4agg后端。

编辑:我知道我可以使用光标找到左下角和右上角的两个位置,但也许有正式的方法可以做到这一点吗?


1
你可以使用 ax.get_xlimax.set_ylim 来检索限制。 - hitzg
2个回答

35

matplotlib有一个事件处理API,您可以使用它来钩入到像您所提到的那些操作中。 事件处理 页面概述了事件API,并且在Axes 页面中简要介绍了x和y轴限制事件。

Axes实例支持通过回调属性进行回调,该属性是CallbackRegistry实例。你可以连接到的事件是xlim_changedylim_changed,回调将通过func(ax)调用,其中axAxes实例。

在您的情况下,您需要在Axes对象的xlim_changedylim_changed事件上注册回调函数。每当用户缩放或移动视口时,这些函数将被调用。

这是一个最小化的工作示例:

Python 2

import matplotlib.pyplot as plt

#
# Some toy data
x_seq = [x / 100.0 for x in xrange(1, 100)]
y_seq = [x**2 for x in x_seq]

#
# Scatter plot
fig, ax = plt.subplots(1, 1)
ax.scatter(x_seq, y_seq)

#
# Declare and register callbacks
def on_xlims_change(event_ax):
    print "updated xlims: ", event_ax.get_xlim()

def on_ylims_change(event_ax):
    print "updated ylims: ", event_ax.get_ylim()

ax.callbacks.connect('xlim_changed', on_xlims_change)
ax.callbacks.connect('ylim_changed', on_ylims_change)

#
# Show
plt.show()

Python 3

import matplotlib.pyplot as plt

#
# Some toy data
x_seq = [x / 100.0 for x in range(1, 100)]
y_seq = [x**2 for x in x_seq]

#
# Scatter plot
fig, ax = plt.subplots(1, 1)
ax.scatter(x_seq, y_seq)

#
# Declare and register callbacks
def on_xlims_change(event_ax):
    print("updated xlims: ", event_ax.get_xlim())

def on_ylims_change(event_ax):
    print("updated ylims: ", event_ax.get_ylim())

ax.callbacks.connect('xlim_changed', on_xlims_change)
ax.callbacks.connect('ylim_changed', on_ylims_change)

#
# Show
plt.show()

这个例子在Python 3中无法工作。即使纠正了“print”和“xrange”,“axes.get_xlim()”也不会产生值。 - eatcrayons
2
@eatcrayons 这是正确的,因为axes没有被定义;它需要是ax.get_xlim() - 我编辑了答案。 - ImportanceOfBeingErnest

2
print ax.get_xlim(), ax.get_ylim()

1
这可能不是 OP 所询问的内容;根据我的经验,这些函数返回由 set_xlim() 给定的限制,但对用户手动平移/缩放后的视图毫不知情。 - dominecf
1
那么为什么被接受的答案有效呢?它也使用了.get_xlim - EL_DON
2
是的,这个答案是正确的,因为ax.get_xlim()会在任何时候返回绘图的当前限制,即使在缩放后也是如此。因此,如果能够与图形进行交互并以交互方式调用此类命令,例如在IPython会话中,这将正常工作。如果绘图是由脚本生成的,则通常没有此选项;在这种情况下,另一个答案显示了如何使用所需的事件以便能够打印出限制。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接