gpt4 book ai didi

python - 在 matplotlib 中的 show() 之后保留无花果的内容?

转载 作者:太空宇宙 更新时间:2023-11-04 02:37:13 25 4
gpt4 key购买 nike

我正在创建一些数据的 fiddle 图,然后我将带有单个数据点(示例中的红点)的散点图渲染为三个子图。

enter image description here

由于 fiddle 图的生成比较耗时,我只生成一次 fiddle 图,然后为一个数据行添加散点图,写入结果文件,从轴上删除散点图并添加下一个数据行的散点图排。

一切正常,但我想添加一个选项,在保存之前显示()每个图。

如果我使用 plt.show(),图形显示正确,但之后图形似乎被清除并且在下一次迭代中我得到没有 fiddle 图的图.

有没有办法保留plt.show()后的图形内容?

简而言之,我的代码是

fig = generate_plot(ws, show=False) #returns the fig instance of the violin plot

#if I do plt.show() here (or in "generate_plot()"), the violin plots are gone.

ax1, ax3, ax2 = fig.get_axes()
scatter1 = ax1.scatter(...) #draw scatter plot for first axes
[...] #same vor every axis
plt.savefig(...)
scatter1.remove()

最佳答案

我在想一个可能的选择是使用事件循环来推进剧情。下面将定义一个更新函数,它只改变散点,绘制图像并保存它。我们可以通过一个在 key_press 上有回调的类来管理它——这样当你点击 Space 时,会显示下一张图片;在最后一张图片上按 Space 后,绘图关闭。

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np

class NextPlotter(object):
def __init__(self, fig, func, n):
self.__dict__.update(locals())
self.i = 0
self.cid = self.fig.canvas.mpl_connect("key_press_event", self.adv)

def adv(self, evt):
if evt.key == " " and self.i < self.n:
self.func(self.i)
self.i+=1
elif self.i >= self.n:
plt.close("all")

#Start of code:
# Create data
pos = [1, 2, 4, 5, 7, 8]
data = [np.random.normal(0, std, size=100) for std in pos]
data2 = [np.random.rayleigh(std, size=100) for std in pos]
scatterdata = np.random.normal(0, 5, size=(10,len(pos)))

#Create plot
fig, axes = plt.subplots(ncols=2)

axes[0].violinplot(data, pos, points=40, widths=0.9,
showmeans=True, showextrema=True, showmedians=True)
axes[1].violinplot(data2, pos, points=40, widths=0.9,
showmeans=True, showextrema=True, showmedians=True)

scatter = axes[0].scatter(pos, scatterdata[0,:], c="crimson", s=60)
scatter2 = axes[1].scatter(pos, scatterdata[1,:], c="crimson", s=60)

# define updating function
def update(i):
scatter.set_offsets(np.c_[pos,scatterdata[2*i,:]])
scatter2.set_offsets(np.c_[pos,scatterdata[2*i+1,:]])
fig.canvas.draw()
plt.savefig("plot{i}.png".format(i=i))

# instantiate NextPlotter; press <space> to advance to the next image
c = NextPlotter(fig, update, len(scatterdata)//2)

plt.show()

关于python - 在 matplotlib 中的 show() 之后保留无花果的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47605702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com