python - 如何指定回调以处理不同的 matplotlib 子图

标签 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 的解决方案是什么?

最佳答案

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

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()

关于python - 如何指定回调以处理不同的 matplotlib 子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540472/

相关文章:

python - 在 PYTHON 中使用 selenium 在具有动态小键盘虚拟键盘的网站上输入密码

python - Argparse:如何区分解析器和子解析器的参数

python - 在 python 中使用 matplotlib 在 pdf 中的现有页面之间插入新页面

python - 您将如何在 Python 中绘制此 3D 可视化图?

python - 绘制目录中的所有数据文件

python - matplotlib.imshow() 实际上返回什么对象?如何使用这个对象?

python - 空列表的正确类型提示是什么?

python re - 在一个大字符串中提取一个人的聊天文本

python - python内置@property如何接收重载的setter函数?

pyqt - Qtdesigner 中的 Matplotlib 小部件