缩放后根据Matplotlib中的当前ylim和xlim重新计算xy值


问题内容

亲爱的所有人,我要以原点始终为(0,0)以及显然x和x上的值的相对距离的方式重新计算写在图形的刻度标签上的xy值。 y轴保持不变。

我认为放大后需要跟踪图形的极限,而不是简单地从实际xy刻度值中减去当前的xmin和ymin。我想这可以通过事件处理API
事件处理来实现, 正如我在这里学到的:
Source1

这也是我开始MWE的地方:

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(axes):
    a=axes.get_xlim()
    print "updated xlims: ", axes.get_xlim()
    return a

def on_ylims_change(axes):
    a=axes.get_ylim()
    print "updated ylims: ", axes.get_ylim()
    return a

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



#
# Show
plt.show()

但是我真的不知道该怎么走?我是否必须在on_xlims_change函数中进行计算并在那里更改x和y刻度标签?再次,我认为我真的只需要更改标签中给出的值,对吗?还是更容易更改坐标的实际值以使自动刻度标记仍然有效?

谢谢我前进


问题答案:

这可能听起来并不容易。更改限制时,您将更改限制,以使回调无限期运行,从而使窗口崩溃。

因此,我将选择另一个解决方案,使用第二个轴。假设您有两个轴:

  • ax2是要绘制的轴。但是没有框架,也没有刻度标签。这是可以更改限制的轴。
  • ax是空的。最初的限制与相同ax2。它将显示ticklabels。

放大后,ax2回调函数可以更改ax您喜欢的限制。这就是屏​​幕上显示的内容。

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]

# ax is empty
fig, ax = plt.subplots()
ax.set_navigate(False)
# ax2 will hold the plot, but has invisible labels
ax2 = fig.add_subplot(111,zorder=2)
ax2.scatter(x_seq, y_seq)
ax2.axis("off")

ax.set_xlim(ax2.get_xlim())
ax.set_ylim(ax2.get_ylim())

#
# Declare and register callbacks
def on_lims_change(axes):
    # change limits of ax, when ax2 limits are changed.
    a=ax2.get_xlim()
    ax.set_xlim(0, a[1]-a[0])
    a=ax2.get_ylim()
    ax.set_ylim(0, a[1]-a[0])

ax2.callbacks.connect('xlim_changed', on_lims_change)
ax2.callbacks.connect('ylim_changed', on_lims_change)

# Show
plt.show()