matplotlib和Log10Transform中的可拾取图形

matplotlib和Log10Transform中的可拾取图形,matplotlib,scale,pickle,Matplotlib,Scale,Pickle,您可能已经知道,在matplotlib 1.2.0中有一个新的实验特性,即图形是可拾取的(可以使用picklemodule保存) 然而,当使用logscale时,它不起作用 import matplotlib.pyplot as plt import numpy as np import pickle ax = plt.subplot(111) x = np.linspace(0, 10) y = np.exp(x) plt.plot(x, y) ax.set_yscale('log') pic

您可能已经知道,在matplotlib 1.2.0中有一个新的实验特性,即图形是可拾取的(可以使用
pickle
module保存)

然而,当使用logscale时,它不起作用

import matplotlib.pyplot as plt
import numpy as np
import pickle
ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
ax.set_yscale('log')
pickle.dump(ax, file('myplot.pickle', 'w'))
结果:

PicklingError: Can't pickle <class 'matplotlib.scale.Log10Transform'>: attribute lookup matplotlib.scale.Log10Transform failed
PicklingError:无法pickle:属性查找matplotlib.scale.Log10Transform失败

有人知道这个问题的解决方法吗?

我在matplotlib上打开了这个错误报告。这是一个相当容易在matplotlib存储库端实现的修复程序(只是不要将
Log10Transform
类嵌套在
LogScale
类中),但这并不能真正帮助您将其用于mpl 1.2.0

在1.2.0中,有一个解决方案可以让它为您工作,但我警告您——它并不漂亮

根据我对a的回答,可以对嵌套类进行pickle(如
Log10Transform
is)。我们所需要做的就是告诉
Log10Transform
如何“自己”:

您可能还决定对其他基于日志的转换/类执行此操作,但对于您的示例,您现在可以pickle(并成功取消pickle)示例图:

import matplotlib.pyplot as plt
import numpy as np
import pickle


ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
ax.set_yscale('log')

pickle.dump(ax, file('myplot.pickle', 'w'))
plt.savefig('pickle_log.pre.png')
plt.close()

pickle.load(file('myplot.pickle', 'r'))
plt.savefig('pickle_log.post.png')
我将继续为mpl 1.3.x解决这个问题,这样以后就不需要这种讨厌的解决方法:-)


嗯,

没问题。问:出于兴趣,您打算如何使用酸洗功能?所以实际上这是一种间接使用。我的意思是:我正在创建很多绘图,所以我使用
多处理
与许多工作人员并行执行。然后,工作人员创建的一些绘图需要返回到主线程,因此我使用
多处理.Queue
将图形传递回。它所做的基本上是对插入到
队列中的对象进行酸洗。但我也对直接使用感兴趣,只是为了保存数字,就像我习惯于使用
xmgrace
一样,并在以后必要时编辑它们。我还没有做过,所以我不知道它在mpl中是如何工作的。最好的!ipython(尚未完成)等产品的多处理和中间存储是我这么做的主要动力,听到这一点真是太好了!谢谢你让我知道!
import matplotlib.pyplot as plt
import numpy as np
import pickle


ax = plt.subplot(111)
x = np.linspace(0, 10)
y = np.exp(x)
plt.plot(x, y)
ax.set_yscale('log')

pickle.dump(ax, file('myplot.pickle', 'w'))
plt.savefig('pickle_log.pre.png')
plt.close()

pickle.load(file('myplot.pickle', 'r'))
plt.savefig('pickle_log.post.png')