我有一个基于PyQt5的GUI,带有嵌入式matplotlib画布。 GUI用于1个或多个数据集的常规数据浏览。它使用户可以使用左/右孪生轴将线图添加/删除到他们想要的许多子图上。
跟踪与每个轴上的每一行关联的所有元数据(源数据文件,变量名称等)有点繁琐。将一些自定义元数据直接附加到线条艺术家对象会很好。就像Matlab的UserData
属性处理图形对象一样。
我主要的用例之一是每一行上的上下文菜单。我可以直接从挑选的艺术家的用户数据中提取信息,而不必维护某种线对象到元数据的字典。
所以我的问题是:
示例:
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 ...
答案 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()]