首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >酸洗的Matplotlib 3D缺少交互功能

酸洗的Matplotlib 3D缺少交互功能
EN

Stack Overflow用户
提问于 2018-07-25 13:53:56
回答 1查看 411关注 0票数 3

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

代码语言:javascript
复制
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打印问题的小示例。

代码语言:javascript
复制
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酸洗绘图具有交互式旋转和缩放功能?如果3D酸洗绘图不能实现这样的功能,它们是否有任何替代方法来保存(不必最初在窗口中显示绘图)和重新加载交互式3D matplotlib曲面图?

EN

回答 1

Stack Overflow用户

发布于 2020-07-06 02:26:14

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

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

创建泡菜:

代码语言:javascript
复制
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)

加载泡菜

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51511698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档