根据Matplotlib

时间:2017-10-20 18:46:09

标签: python matplotlib label

亲爱的所有我想重新计算在我的数字的刻度标签中写入的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刻度标签?再说一次,我想我真的只需要更改标签中给出的值,对吗?或者更容易更改坐标的实际值,以便自动刻度标签仍然有效?

谢谢我提前

2 个答案:

答案 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 内更新您的限制来实现您的目标。但是,我们需要确保不会以无限回调循环结束。一种方法是在我们更新 xlimylim 时断开回调,然后立即重新连接。

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 之后为标准缩放事件调用。这样我们就可以在开始进行更改之前获得最终的缩放结果。