问题的要点是:
我有一个用于为机器学习培训生成图像的线程池。我给游泳池喂了所有已经注释的图像,然后我从中生成图像。 (它有效)
然后我添加一个可视化步骤,即生成人类可理解的漂亮图像。为此,我使用matplotlib。 (它有效)
然后我想将此作为池中的附加步骤,并且我的代码崩溃了。这个问题似乎是一个非常明确的陈述:
import matplotlib.pyplot as plt
[code for visualisation]
plt.savefig(f, bbox_inches='tight', pad_inches=0)
plt.cla()
plt.close()
plt.switch_backend(backend_org)
当一个线程到达最后一行时,所有其他plt
崩溃,因此在Matlab中,一个人能够指定一个操作的变量名,使得close()
或仅在特定图像上执行的其他功能。我无法在matplotlib中找到类似的概念,但是它存在吗?
只是为了显示面向对象的代码。
fig = plt.figure()
fig.subplots_adjust(left=0, right=1, top=1, bottom=0,
wspace=0, hspace=0)
ax = fig.add_subplot(1, 1, 1)
ax.margins(0, 0)
ax.xaxis.set_major_locator(plt.NullLocator())
ax.yaxis.set_major_locator(plt.NullLocator())
label_viz = label2rgb(label, img, n_labels=len(label_names)) #generate labels
ax.imshow(label_viz)
ax.axis('off')
plt_handlers = []
plt_titles = []
for label_value, label_name in enumerate(label_names):
[...]
#generate legend
ax.legend(plt_handlers, plt_titles, loc='lower right', framealpha=.5)
f = io.BytesIO()
fig.savefig(f, bbox_inches='tight', pad_inches=0)
#ax.cla() #resulting in crashes across the thread
plt.close(fig)
答案 0 :(得分:1)
我认为您不应该使用基于状态的pyplot方法,而是使用面向对象的版本,您可以使用axes.Axes
的实例。否则,不同过程中的不同情节会混淆。简短的例子:
fig, ax = plt.subplots()
ax.plot(...)
fig.savefig(...)