Matplotlib穿线;关闭特定的数字实例

时间:2018-06-07 13:16:38

标签: python matplotlib python-multithreading

问题的要点是:

我有一个用于为机器学习培训生成图像的线程池。我给游泳池喂了所有已经注释的图像,然后我从中生成图像。 (它有效)

然后我添加一个可视化步骤,即生成人类可理解的漂亮图像。为此,我使用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)

1 个答案:

答案 0 :(得分:1)

我认为您不应该使用基于状态的pyplot方法,而是使用面向对象的版本,您可以使用axes.Axes的实例。否则,不同过程中的不同情节会混淆。简短的例子:

fig, ax = plt.subplots()
ax.plot(...)
fig.savefig(...)