windows - Pickled Matplotlib 3D 缺乏交互功能

标签 windows python-3.x matplotlib pickle

在 Windows 上,当我使用 pickle 模块保存 3D matplotlib 表面图并重新加载它们时,这些图缺少任何交互功能,例如能够旋转图或放大图。但是,如果我保存并重新加载 2D pickled matplotlib 图,我仍然可以与这些图进行交互,至少可以使用缩放工具。以下代码重新创建了成功的 2D 绘图案例。

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


xs = np.linspace(0, 4*np.pi, 100)
ys = np.sin(xs)

fig, ax = plt.subplots()
ax.plot(xs, ys)

with open("plot.pickle", 'wb') as file:
    pickle.dump(fig, file)

plt.show()

plt.close(fig)

with open("plot.pickle", 'rb') as file:
    fig = pickle.load(file)

plt.show()

以下代码是重现 3D 绘图问题的一个小示例。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pickle


xs = np.linspace(0, 1, 100)
ys = np.linspace(0, 4*np.pi, 100)
zs = np.zeros((100, 100))

for i, amp in enumerate(xs):
    for j, phase in enumerate(ys):
        zs[j, i] = amp*np.sin(phase)

xs, ys = np.meshgrid(xs, ys)
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
ax.plot_surface(xs, ys, zs)

with open("plot.pickle", 'wb') as file:
    pickle.dump(fig, file)

plt.close(fig)

with open("plot.pickle", 'rb') as file:
    fig = pickle.load(file)

plt.show()

我可以进行哪些更改,以便我的 3D pickle 地 block 具有交互式旋转和缩放功能?如果 3D pickle 图无法实现此类功能,它们是否有任何替代方法来保存(无需最初在窗口中显示该图)和重新加载交互式 3D matplotlib 表面图?

最佳答案

我找到的不是解决方案,而是解决方法。 解决方法是将绘制 r=图形所需的所有数据以及绘制它的函数保存在 pickle 文件中。

为此,我需要使用 dill 而不是 picke,正如 @JoshRosen 所建议的 在他对 Is there an easy way to pickle a python function (or otherwise serialize its code)? 的回答中

创建 pickle :

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import dill as pickle


def plotfun(plotdata):
    ax = plt.gca()
    ax.plot_surface(plotdata['xs'], plotdata['ys'], plotdata['zs'])


xs = np.linspace(0, 1, 100)
ys = np.linspace(0, 4*np.pi, 100)
zs = np.zeros((100, 100))
for j, phase in enumerate(ys):
    zs[j, :] = xs*np.sin(phase)
xs, ys = np.meshgrid(xs, ys)

fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
plotdata = {'xs': xs, 'ys': ys, 'zs': zs, 'plotfun': plotfun}
plotdata['plotfun'](plotdata)
with open("test.pickle", 'wb') as file:
    pickle.dump(plotdata, file)

加载 pickle

import dill as pickle
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt


plt.figure().add_subplot(111, projection='3d'),
plotdata = pickle.load(open('test.pickle', 'rb'))
plotdata['plotfun'](plotdata)
plt.show()

关于windows - Pickled Matplotlib 3D 缺乏交互功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51511698/

相关文章:

windows - 混帐狂欢 : Not accepting my keyboard input

windows - 带有任务调度程序的控制台应用程序

python - 使用 feedparser 从博客中获取每个独特的项目。检查 for 循环中的列表成员身份不起作用

windows - 通过网络连接到 Visual Studio 远程调试器 (msvsmon) 所需的设置

linux - Path::new(many-subdirs) 对于 Linux 和 Windows 是否足够好?

python-3.x - 属性错误: type object 'numpy.ndarray' has no attribute '__array_function__' on import numpy 1. 15.4

Python:列表理解无法正常工作

python-2.7 - 无法将图形另存为 .eps [无法识别 gswin32c]

python - 图表中条形图的颜色基于数据框同一行中的 bool 值

python - 寻找最大的闭合 3D 等值线图