缩放后根据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()