Генерация многопроцессных линий, но в основном на графике - PullRequest
0 голосов
/ 25 июня 2019

У меня есть список траекторий (различной длины), которые я хочу (наложить) на один и тот же рисунок и затем показать / сохранить его.Это можно сделать, запустив простой цикл for и вызвав plt.plot() для каждой траектории, и в конце запустив plt.show().

(используя import matplotlib.pyplot as plt)

Это очень медленнодля большого количества траекторий (> 10k), поэтому я хотел бы распараллелить графики, но в конце все еще имею один отдельный график.

Я нашел несколько сообщений , которые достигают этого, носоставление графиков в каждом процессе.Однако это не то, что мне нужно, поскольку все траектории должны быть на одной фигуре.

Я также пытался реализовать следующий подход:


import matplotlib.pyplot as plt
import multiprocessing as mpi

class WorkerClass():
    def __init__(self, ax):
        self.ax = ax

    def worker(self, tli):
        t,l,i = tli
        self.ax.plot(t[:,0], t[:,1], alpha=0.5, color='C0' if l==-1 else 'C1', linestyle=np.array(['-','-.',':','--',':'])[i.astype(bool)][0])

    def get_ax(self):
        return self.ax


### main code
# trajectories, labels, info are lists passed from other functions

fig, ax = plt.subplots()
w = Worker(ax)

with mpi.Pool(processes=4) as p:
        lines = p.map(w.worker, zip(trajectories, labels, info))

ax = w.get_ax()
ax.set_title('Trajectories')
plt.show()

Однако это не работаетЯ получаю ошибку стека:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/multiprocessing/pool.py", line 429, in _handle_results
    task = get()
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/multiprocessing/connection.py", line 251, in recv
    return ForkingPickler.loads(buf.getbuffer())
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/site-packages/matplotlib/figure.py", line 1904, in __setstate__
    mgr = plt._backend_mod.new_figure_manager_given_figure(num, self)
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/site-packages/matplotlib/backends/_backend_tk.py", line 1044, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "/home/robin/anaconda3/envs/py35lab/lib/python3.5/tkinter/__init__.py", line 1868, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: out of stack space (infinite loop?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...