本文介绍了matplotlib中的多进程绘图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何通过并行函数使用matplotlib可视化数据? IE.我想在并行流程中创建图形,然后在主流程中显示它们.

How can one visualize data using matplotlib by a function in parallel? I.e. I want to create figures in parallel processes and then display them in the main process.

这里是一个例子:

# input data
import pandas as pd, matplotlib.pyplot as plt
df = pd.DataFrame(data={'i':['A','A','B','B'],
                       'x':[1.,2.,3.,4.],
                       'y':[1.,2.,3.,4.]})
df.set_index('i', inplace=True)
df.sort_index(inplace=True)

# function which creates a figure from the data
def Draw(df, i):
    fig = plt.figure(i)
    ax = fig.gca()
    df = df.loc[i,:]
    ax.scatter(df['x'], df['y'])
    return fig

def DrawWrapper(x): return Draw(*x)

# creating figures in parallel
from multiprocessing import Pool
poolSize = 2
with Pool(poolSize) as p:
    args = [(df,'A'), (df,'B')]
    figs = p.map(DrawWrapper, args)

# attempt to visualize the results
fig = plt.figure('A')
plt.show()
# FIXME: get "RuntimeError: main thread is not in main loop"

如何从工作流程中转移图形对象,以便能够在主流程中显示图形?

How do I transfer the figure objects from the worker processes such as to be able to show the figures in the main process?

谢谢您的帮助!

建议该问题可以通过此线程

It was suggested that the problem might be solved by this thread

这是对应的代码:

# input data
import pandas as pd, matplotlib.pyplot as plt
df = pd.DataFrame(data={'i':['A','A','B','B'],
                       'x':[1.,2.,3.,4.],
                       'y':[1.,2.,3.,4.]})
df.set_index('i', inplace=True)
df.sort_index(inplace=True)

# function which creates a figure from the data
def Draw(df, i):
    fig = plt.figure(i)
    ax = fig.gca()
    df = df.loc[i,:]
    ax.scatter(df['x'], df['y'])
    plt.show()

# creating figures in parallel
from multiprocessing import Process
args = [(df,'A'), (df,'B')]
for a in args:
    p = Process(target=Draw, args=a)
    p.start()

# FIXME: result is the same (might be even worse since I do not
# get any result which I could attempt to show):
# ...
# RuntimeError: main thread is not in main loop
# RuntimeError: main thread is not in main loop

我想念什么吗?

推荐答案

链接的问题的答案在if __name__ == "__main__":子句中隐藏了代码的开头.因此,以下内容应在这里工作.

The linked question's answer hides the start of the code in a if __name__ == "__main__": clause. Hence the following should work here.

import pandas as pd
import matplotlib.pyplot as plt

import multiprocessing
#multiprocessing.freeze_support() # <- may be required on windows

df = pd.DataFrame(data={'i':['A','A','B','B'],
                       'x':[1.,2.,3.,4.],
                       'y':[1.,2.,3.,4.]})
df.set_index('i', inplace=True)
df.sort_index(inplace=True)

# function which creates a figure from the data
def Draw(df, i):
    fig, ax  = plt.subplots()
    df = df.loc[i,:]
    ax.scatter(df['x'], df['y'])
    plt.show()

# creating figures in parallel
args = [(df,'A'), (df,'B')]

def multiP():
    for a in args:
        p = multiprocessing.Process(target=Draw, args=a)
        p.start()

if __name__ == "__main__":
    multiP()

这篇关于matplotlib中的多进程绘图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 22:13