【发布时间】:2012-02-14 20:14:58
【问题描述】:
我有一个wxPython 程序,它从不同的数据集读取数据,对数据执行各种类型的简单动态分析,并将数据集的各种组合绘制到matplotlib 画布上。我希望有机会将当前绘制的数据转储到文件中,以便以后进行更复杂的分析。
问题是:matplotlib 中是否有任何方法允许访问当前在matplotlib.Figure 中绘制的数据?
【问题讨论】:
标签: python matplotlib
我有一个wxPython 程序,它从不同的数据集读取数据,对数据执行各种类型的简单动态分析,并将数据集的各种组合绘制到matplotlib 画布上。我希望有机会将当前绘制的数据转储到文件中,以便以后进行更复杂的分析。
问题是:matplotlib 中是否有任何方法允许访问当前在matplotlib.Figure 中绘制的数据?
【问题讨论】:
标签: python matplotlib
Jakub 修改 Python 脚本以将数据直接从发送到绘图的源中写出是正确的;这就是我更喜欢这样做的方式。但作为参考,如果您确实需要从绘图中获取数据,我认为应该这样做
gca().get_lines()[n].get_xydata()
或者,您可以分别获取 x 和 y 数据集:
line = gca().get_lines()[n]
xd = line.get_xdata()
yd = line.get_ydata()
【讨论】:
mpl_toolkits.mplot3d.art3d.Line3D object 没有get_zdata()?我无法提取 z 值。 :-(
matplotlib.pyplot.gca 可用于从 matplotlib 图中提取数据。这是一个简单的例子:
import matplotlib.pyplot as plt
plt.plot([1,2,3],[4,5,6])
ax = plt.gca()
line = ax.lines[0]
line.get_xydata()
运行此程序时,您将看到 2 个输出 - 绘图和数据:
array([[1., 4.],
[2., 5.],
[3., 6.]])
您也可以分别获取 x 数据和 y 数据。
运行line.get_xdata(),你会得到:
array([1, 2, 3])
在运行line.get_ydata() 时,您将获得:
array([4, 5, 6])
注意: gca 代表获取当前坐标轴
【讨论】:
它是 Python,因此您可以直接修改源脚本,以便在绘制数据之前转储数据
【讨论】:
我知道这是一个老问题,但我觉得有一个比这里提供的更好的解决方案,所以我决定写这个答案。
您可以使用unittest.mock.patch临时替换matplotlib.axes.Axes.plot函数:
from unittest.mock import patch
def save_data(self, *args, **kwargs):
# save the data that was passed into the plot function
print(args)
with patch('matplotlib.axes.Axes.plot', new=save_data):
# some code that will eventually plot data
a_function_that_plots()
退出with 块后,Axes.plot 将恢复正常行为。
【讨论】:
with 杀死它。 global? :\
总结一下,供以后参考:
如果使用 plt.plot() 或 plt.stem() 或 plt.step() 进行绘图,您可以获得 Line2D 对象的列表:
ax = plt.gca() # to get the axis
ax.get_lines()
对于plt.pie()、plt.bar() 或plt.barh(),您可以获得楔形或矩形对象列表:
ax = plt.gca() # to get the axis
ax.patches()
然后,根据具体情况,您可以通过运行get_xdata()、get_ydata()(请参阅Line2D)获取更多信息。
或即get_height() 用于条形图(请参阅Rectangle)了解更多信息。
一般来说,对于所有基本绘图功能,您可以通过运行 ax.get_children() 找到您要查找的内容
返回子Artists 的列表(基类包含图形的所有元素)。
【讨论】: