亲爱的所有我想重新计算在我的数字的刻度标签中写入的xy值之后我以这样的方式放大它,原点总是在(0,0),显然是值的相对距离x轴和y轴保持不变。
我想我需要在放大后跟踪我的数字的极限,而不是简单地从实际的x y刻度值中减去当前的xmin和ymin。 我想这可以通过事件处理API来实现 Event handling 正如我在这里学到的: 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刻度标签?再说一次,我想我真的只需要更改标签中给出的值,对吗?或者更容易更改坐标的实际值,以便自动刻度标签仍然有效?
谢谢我提前
答案 0 :(得分:1)
这可能不像听起来那么容易。更改限制时,您将更改限制,以使回调无限运行,从而导致窗口崩溃。
因此我会选择另一种解决方案,使用第二个轴。所以假设你有两个轴:
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()
答案 1 :(得分:0)
您可以通过在 on_ylims_change
内更新您的限制来实现您的目标。但是,我们需要确保不会以无限回调循环结束。一种方法是在我们更新 xlim
和 ylim
时断开回调,然后立即重新连接。
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_lims_change(event_ax):
cid_list = list(event_ax.callbacks.callbacks['ylim_changed'].keys())
for cid in cid_list:
event_ax.callbacks.disconnect(cid)
a = ax.get_xlim()
span = a[1]-a[0]
event_ax.set_xlim(-span/2, span/2)
a = ax.get_ylim()
span = a[1]-a[0]
event_ax.set_ylim(-span/2, span/2)
event_ax.callbacks.connect('ylim_changed', on_lims_change)
ax.callbacks.connect('ylim_changed', on_lims_change)
#
# Show
plt.show()
通常我们只想连接到 ylim_changed
事件,因为这将在 xlim_changed
之后为标准缩放事件调用。这样我们就可以在开始进行更改之前获得最终的缩放结果。