将自定义用户数据添加到matplotlib艺术家

时间:2019-07-19 15:24:46

标签: python matplotlib

我有一个基于PyQt5的GUI,带有嵌入式matplotlib画布。 GUI用于1个或多个数据集的常规数据浏览。它使用户可以使用左/右孪生轴将线图添加/删除到他们想要的许多子图上。

跟踪与每个轴上的每一行关联的所有元数据(源数据文件,变量名称等)有点繁琐。将一些自定义元数据直接附加到线条艺术家对象会很好。就像Matlab的UserData属性处理图形对象一样。

我主要的用例之一是每一行上的上下文菜单。我可以直接从挑选的艺术家的用户数据中提取信息,而不必维护某种线对象到元数据的字典。

所以我的问题是:

  • 我已经做到了,到目前为止似乎还可以...但是正在添加 由于某些原因,Matplotlib艺术家的想法很糟糕 不知道吗?
  • 艺术家中是否已经有一些用户可定义的元数据容器 我只是不知道(在文档中找不到任何东西)?
  • 真的真的像这样简单吗?

示例:

lines = ax.plot([1,2,3])
lines[0].user_data = {'some':'info', 'about':'this_line'}

#... elsewhere in pick_event or button_press_event
my_lines = ax.lines
user_data = my_lines[0].user_data
#... do something useful with this info ...

1 个答案:

答案 0 :(得分:1)

完全有可能将自定义属性附加到python对象。唯一需要注意的是,它在任何情况下都不应与现有属性冲突。 user_data目前不是matplotlib.lines.Line2D或任何其他matplotlib艺术家的现有属性。
因此,唯一的风险是,在将来的某些版本中,matplotlib可能会使用您选择的名称引入属性。我看不到这种情况的发生,但这是要考虑的更普遍的事情。

如果您要使用替代方法,艺术家可以使用gid参数。如果您拥有gid到数据的映射,则可以像这样使用它

user_data = {"1" : {'some':'info', 'about':'this_line'},
             "2" : {'some':'other info', 'about':'that_line'}}

line, = plt.plot(...)
line.set_gid("1")

line_data = user_data[line.get_gid()]