如何指定回调以使用不同的matplotlib子图

时间:2014-02-04 00:07:25

标签: python matplotlib

我有一个带有多个子图的matplotlib图,如下所示:

我想在这两个子图中添加一个交互式组件,这样如果用户点击圆周上的一个节点,则只显示与该节点的连接。

对于此任务而言重要的一个元素是知道回调event具有引用其轴的inaxes属性。但这还不够。

为了完成我的任务,我需要存储一些绘图数据。具体来说,我需要知道哪些边对应于哪些节点,然后根据所选组件所属的轴检索该信息。

当图中只有一个轴时,我将此信息存储在闭包中:

def make_subplot():

  def _on_button_press(event, indices=None):
    # callback logic

  callback = partial(indices=indices)
  figure.mpl_connect('button_press_event',callback)

但是,当有多个子图时,这不起作用,因为回调被覆盖或者必须存储所有图的索引。

我的问题是,最好的方法是什么?据我所知,最简单的方法是将轴映射到子图作为全局变量,如下所示:

_indices_table = {}

def make_subplot():

  def _on_button_press(event,axes=None):
    indices = _indices_table[axes]
    #callback logic

  callback = partial(_on_button_press,axes=axes)
  _indices_table.update({axes, indices})
  figure.mpl_connect('button_press_event', callback)

但我正在寻找一个不那么难看的解决方案。也许只是因为我对全局变量的厌恶。但是,当全局变量更简单,更可读时,我也不想添加大型控制结构的开销来处理这个任务。

我意识到我仍然可以将这个字典放在闭包中,但它基本上是相同的解决方案,除非更糟,因为回调需要采用与回调逻辑无关的额外参数。

这里的pythonic解决方案是什么?

1 个答案:

答案 0 :(得分:1)

只需将数据保存在Axe对象的属性中:

from matplotlib import pyplot as plt

def _on_button_press(event):
    ax = event.inaxes
    if ax is not None:
        print ax._my_labels

fig, axes = plt.subplots(1,2)

axes[0]._my_labels = [1,2,3]
axes[1]._my_labels = [4,5,6]

fig.canvas.mpl_connect('button_press_event', _on_button_press)

plt.show()