首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matplotlib savefig threadsafe吗?

matplotlib savefig threadsafe吗?
EN

Stack Overflow用户
提问于 2013-01-29 23:47:03
回答 1查看 1.9K关注 0票数 2

我有一个内部的分布式计算库,我们一直在使用它来进行并行计算工作。在进程分区之后,它们运行数据加载和计算步骤,然后以“保存”步骤结束。通常,这涉及到将数据写入数据库表。

但是对于特定的任务,我需要每个进程的输出都是一个带有一些数据图的.png文件。总共有95个进程,所以有95个.pngs。

在我的“保存”步骤(在每个进程上执行)中,我有一些非常简单的代码,它使用matplotlib的boxplot函数制作箱形图,还有一些代码使用savefig将其写入到一个.png文件中,该文件的名称基于该进程中使用的特定数据的唯一名称。

但是,我偶尔会看到这样的输出:尽管名称是唯一的,但两组或更多组数据似乎写入了同一个输出文件中。

matplotlib在制作框图或保存图形时是否使用临时文件保存?如果是这样,它是否总是使用相同的临时文件名(从而导致覆盖冲突)?我已经使用strace运行了我的进程,但是看不到任何明显看起来像是从matplotlib中写入的临时文件。

我如何确保这将是threadsafe?我当然希望并行保存文件,因为我希望大大扩展输出.pngs的数量,所以首先存储所有数据,然后只串行执行绘图/保存部分的选择是非常不可取的。

我不可能重现我们正在使用的完整并行基础设施,但下面是被调用来创建绘图句柄的函数,然后是被调用来保存绘图的函数。为了解决这个问题,您应该假设线程安全性与我们的分布式库无关。我们知道它不是来自我们的代码,它已经在我们的多处理作业中使用了多年,没有像这样的线程问题(特别是对于我们不能直接控制的东西,比如来自matplotlib的任何临时文件)。

代码语言:javascript
复制
import pandas
import numpy as np
import matplotlib.pyplot as plt

def plot_category_data(betas, category_name):
    """
    Function to organize beta data by date into vectors and pass to box plot
    code for producing a single chart of multi-period box plots.
    """
    beta_vector_list = []
    yms = np.sort(betas.yearmonth.unique())
    for ym in yms:
        beta_vector_list.append(betas[betas.yearmonth==ym].Beta.values.flatten().tolist())
    ###

    plot_output = plt.boxplot(beta_vector_list)
    axs = plt.gcf().gca()
    axs.set_xticklabels(betas.FactorDate.unique(), rotation=40, horizontalalignment='right')
    axs.set_xlabel("Date")
    axs.set_ylabel("Beta")
    axs.set_title("%s Beta to BMI Global"%(category_name))
    axs.set_ylim((-1.0, 3.0))

    return plot_output
### End plot_category_data

def save(self):
    """
    Make calls to store the plot to the desired output file.
    """
    out_file = self.output_path + "%s.png"%(self.category_name)
    fig = plt.gcf()
    fig.set_figheight(6.5)
    fig.set_figwidth(10)
    fig.savefig(out_file, bbox_inches='tight', dpi=150)
    print "Finished and stored output file %s"%(out_file)
    return None
### End save
EN

回答 1

Stack Overflow用户

发布于 2013-01-30 01:05:16

在您的两个函数中,您将调用plt.gcf()。每次使用plt.figure()绘图时,我都会尝试生成一个新的图形,并显式引用该图形,这样您就可以完全回避整个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14586764

复制
相关文章

相似问题

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