Python Matplotlib:在缩放后查找xlim和ylim

Python Matplotlib:在缩放后查找xlim和ylim,python,matplotlib,Python,Matplotlib,你肯定知道一个快速的方法,在放大后,我如何能追踪到我身材的极限?我想精确地知道坐标,这样我就可以用ax.set\u xlim和ax.set\u ylim再现图形。 我使用的是标准的qt4agg后端 编辑:我知道我可以使用光标找出下角和上角的两个位置,但也许有正式的方法可以做到这一点?matplotlib有一个事件处理API,您可以使用它来连接到您所指的操作。该页面概述了events API,并(非常)简要地介绍了x和y限制事件 Axes实例通过callbacks属性支持回调,该属性是Callba

你肯定知道一个快速的方法,在放大后,我如何能追踪到我身材的极限?我想精确地知道坐标,这样我就可以用
ax.set\u xlim
ax.set\u ylim
再现图形。 我使用的是标准的qt4agg后端


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

matplotlib有一个事件处理API,您可以使用它来连接到您所指的操作。该页面概述了events API,并(非常)简要地介绍了x和y限制事件

Axes
实例通过callbacks属性支持回调,该属性是
CallbackRegistry
实例。您可以连接到的事件是
xlim\u changed
ylim\u changed
,回调将使用
func(ax)
调用,其中
ax
Axes
实例

在您的场景中,您希望在
对象的
xlim\u changed
ylim\u 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

导入matplotlib.pyplot作为plt
#
#一些玩具数据
x_seq=[x/100.0表示范围内的x(1100)]
y顺序=[x**2代表x中的x顺序]
#
#散点图
图,ax=plt子批次(1,1)
最大散射(x顺序,y顺序)
#
#声明并注册回调
更改时的def(事件):
打印(“更新的xlims:,事件\u ax.get\u xlim())
更改时的def(事件):
打印(“更新的ylims:,事件\u ax.get\u ylim())
ax.callbacks.connect('xlim\u changed',on\u xlims\u change)
ax.callbacks.connect('ylim\u change',on\u ylims\u change)
#
#展示
plt.show()

您可以使用
ax.get_xlim
ax.set_ylim
检索限制。这可能不是OP想要的;根据我的经验,这些函数返回set_xlim()给定的限制,但不知道用户在之后手动平移/缩放了什么视图。那么,为什么接受的答案有效呢?它还使用
.get\u xlim
。是的,这个答案是正确的,因为
ax.get\u xlim()
将在任何时间点返回绘图的当前限制,即使在缩放之后也是如此。因此,如果能够与图形交互并以交互方式调用此类命令,例如在IPython会话中,这就可以了。如果绘图由脚本生成,则通常没有此选项;在这种情况下,另一个答案显示了如何使用打印限制所需的事件。即使已更正
print
s和
xrange
axes.getxlim()
也不会生成值。@EAT正确的蜡笔,因为未定义
;它必须是ax.get\u xlim()-我编辑了答案。
print ax.get_xlim(), ax.get_ylim()