从Matplotlib轴对象获取数据

5
我正在尝试确定 matplotlib 的 上的数据点是什么。是否在 Axes 对象上缺少属性以获取 x/y 数据值? 例如,假设我的代码接收了一条线图,并且我想打印出所绘制的 x/y 值。
1个回答

9
您的plot调用将给您一个lines.Line2D,它具有get_xdata(orig=True)get_ydata(orig=True)方法。 您可以检查axes.get_children()来获取Line2D实例。 请注意,从软件设计角度来看,您正在做的事情听起来很可怕。您应该实现类似于plot的包装器,以打印您的原始数据。 @JRichardSnape补充说,如果您的图仅为线条,则可以使用get_lines()而不是过滤get_children()的输出。

谢谢你的帮助。我不同意你对“从软件设计角度来看很糟糕”的评论。我正在尝试使用一个返回图形的第三方库。我没有自己创建图形。因此,我必须询问这个图形的数据是什么。 - durden2.0
1
@durden2.0:我并没有说你的设计选择很糟糕 :) - Marcus Müller
1
@durden2.0 此外,也许你可以将axes.plot函数重命名为axes.oldplot之类的名称,然后在你的matplotlib安装中编写一个最小的包装器。或者干脆修改你正在使用的软件的源代码,如果你能得到它的话。对于任何绘制数据的内容,我强烈建议作者两次给你源代码——不要相信你没有自己伪造的任何图形表示! - Marcus Müller
这是一个很好的观点。我可以直接更改matplotlib或其他库中的源代码。但是,那么我必须记住当我升级任一库时进行的更改。如果可能的话,我尽量避免修改其他软件包,以避免在这些库中破坏任何内容并维护自己的分支来进行如此小的更改。 - durden2.0
让用户能够访问他们应该明确得到的数据,这是朝着正确方向迈出的重要一步。你提到了fork,所以我猜测这是自由开源软件?为了良好的软件生态,请贡献代码,使其他人也能受益! - Marcus Müller
1
一个小的附注 - 我本来要写一个答案,但看起来这个问题已经解决了。如果(我认为只有)你的图表数据是线条(而不是由plt.scatter()生成的集合),那么你可以使用get_lines()而不是get_children(),然后你只会得到Line2D对象,而不是所有的艺术家,然后你需要过滤。 - J Richard Snape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,