我有一个带有多个子图的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解决方案是什么?
答案 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()