首页 > 解决方案 > 具有多处理 * 有时 * 的 matplotlib 会更改图形格式

问题描述

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

这 5 个左右的绘图函数在计算之间被另一个函数一次调用一个。(一些计算,plotting_function_1,一些更多的计算,plotting_function_2,...)。

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

当我在程序完成后检查数字时,许多数字的标题和纸张大小都有非常奇怪的格式错误。奇怪的部分是数据总是按应有的方式绘制(散点数据可能看起来有些丢失,但这只是数据集的一部分)。看看好数字与坏数字,看看我在说什么(左上角是预期输出,其他是问题)。

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

编辑:我的数据集是非常大的空间数据集,因此我的每个绘图函数都会创建并保存多个绘图(大约 20 个,但可能会更少或更多,具体取决于数据集的大小)。我已经弄清楚问题何时发生,但仍然不知道为什么。当两个绘图函数同时运行时会发生奇怪的行为。

发生奇怪行为的典型时间线是:(plotting_function_1 已经开始 --> 一些小计算发生 --> plotting_function_2 开始 --> plotting_function_1 完成 --> Plotting_function_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)

标签: pythonpython-3.xmatplotlibmultiprocessing

解决方案


推荐阅读