带有多处理*有时*的matplotlib更改图形格式

2024-06-16 12:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用matplotlib制作许多图形并保存它们。我有5个左右的函数,可以对数据执行简单或不进行计算,绘制数据,然后格式化图形以适合特定的形式(标题、轴、纸张大小)

这5个左右的绘图函数在计算之间从另一个函数一次调用一个。(一些计算,绘制函数1,一些其他计算,绘制函数2,…)

我通过plotProcess1 = multiprocessing.Process(target=plot_data1, args=(data, save_directory); myProcess.start()在新进程中启动每个绘图函数,以便在绘图函数运行时继续计算

当我在程序完成后检查图形时,许多图形的标题和纸张大小都有奇怪的格式错误。奇怪的是,数据总是按其应有的方式绘制(分散数据可能看起来缺少一些,但这只是数据集的一部分)。请看一下Good figures vs bad figures,看看我在说什么(左上角是预期输出,其他是问题)

这只是在我开始使用多重处理在后台绘制绘图时开始的。最奇怪的是,它并不总是这样做,而且似乎是随机做的。关于它为什么会这样做以及如何修复它,有什么想法吗?由于时间原因,我真的希望在绘制图时保持计算运行。对于某些数据集,每个绘图功能将绘制几百个绘图,整个程序可能需要10秒才能完成

编辑:我的数据集是非常大的空间数据集,因此我的每个绘图功能都会创建和保存多个绘图(大约20个,但可能会根据数据集的大小而减少或增加)。我已经弄清楚了问题是什么时候发生的,但仍然没有弄清楚为什么会发生。当两个绘图函数同时运行时,会发生这种奇怪的行为

发生这种奇怪行为的典型时间线是:(绘图功能\u 1已启动-->;发生一些小计算-->;绘图功能\u 2已启动-->;绘图功能\u 1完成-->;绘图功能\u 2完成)

这对我来说仍然没有意义,因为每个绘图函数都在一个单独的进程中运行,不更改任何数据,并保存为唯一的文件名

编辑2:下面是一段代码,它将创建格式奇怪的图形

# Plot the raw data
    if plot_TF is True:
        photon_data_copy = photon_data.copy()
        plot_segments_copy = plot_segments.copy()

        if isParallel is True:
            rawPlotProcess = multiprocessing.Process(target=plot_raw_data, args=(photon_data_copy, plot_segments_copy, run_name, plotdir))
            rawPlotProcess.start()
        else:
            plot_raw_data(photon_data_copy, plot_segments_copy, run_name, plotdir)

    # Calculate signal slab and noise slab
    start = time.time()
    signal_mask, noise_mask = assign_slabs_by_histogram_max_bin(photon_data, pixel_dimensions, slab_thickness)
    logger.info('Time elapsed assigning slabs: {}'.format(time.time() - start))

    photon_signal = photon_data[signal_mask, :]
    photon_noise = photon_data[noise_mask, :]

    # Plot the Signal and Noise slabs
    if plot_TF is True:
        photon_signal_copy = photon_signal.copy()
        photon_noise_copy = photon_noise.copy()

        if isParallel is True:
            slabPlotProcess = multiprocessing.Process(target=plot_slabs, args=(photon_signal_copy, photon_noise_copy, plot_segments_copy, run_name, plotdir))
            slabPlotProcess.start()
        else:
            plot_slabs(photon_signal_copy, photon_noise_copy, plot_segments_copy, run_name, plotdir)

Tags: 数据函数功能图形绘图datasignalplot