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

Nor*_*add 6 python label matplotlib

亲爱的大家,我想在放大图形后重新计算在刻度标签中写入的 xy 值,使得原点始终位于 (0,0) ,并且显然 x 和 上的值的相对距离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()
Run Code Online (Sandbox Code Playgroud)

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

Imp*_*est 1

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

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

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

一旦放大ax2回调函数就可以根据您的喜好更改限制ax。这就是屏​​幕上显示的内容。

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]

# 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()
Run Code Online (Sandbox Code Playgroud)