Я создаю одну фигуру с примерно сотнями подсетей/осей, каждая с несколькими тысячами точек данных. В настоящее время я прохожу через каждый подзаговор и используя plt.scatter
, чтобы поместить точки. Однако это довольно медленно. Можно ли использовать несколько процессоров для ускорения построения графика, разделив рабочую силу либо на одно ядро на подзадачу, либо с точки зрения построения точек данных в пределах одного подзаголовка?В matplotlib можно ли использовать несколько процессоров для ускорения построения множества подзадач и точек данных?
До сих пор я пытался использовать joblib
для использования параллельных процессов для создания подзаголовков, но вместо создания новых подзаголовков на одной фигуре он генерирует новую фигуру для каждого подзаголовка. Я пробовал с бэкендами PDF
, Qt5Agg
и Agg
. Вот упрощенный пример моего кода.
import matplotlib as mpl
mpl.use('PDF')
import seaborn as sns
import matplotlib.pyplot as plt
from joblib import Parallel, delayed
def plotter(name, df, ax):
ax.scatter(df['petal_length'], df['sepal_length'])
iris = sns.load_dataset('iris')
fig, axes = plt.subplots(3,1)
Parallel(n_jobs=2)(delayed(plotter)
(species_name, species_df, ax)
for (species_name, species_df), ax in zip(iris.groupby('species'), axes.ravel()))
fig.savefig('test.pdf')
Установка n_jobs=1
работы, все точки, то график в пределах одной и той же фигуры. Однако, увеличивая его до одного, вы создаете четыре цифры: один, который я начинаю с plt.subplots
, а затем один за каждый раз вызывается ax.scatter
.
Поскольку я передаю оси с первой цифры до plotter
, я не уверен, как/почему создаются дополнительные фигуры. Есть ли какой-то резерв в matplotlib, который заставляет новые цифры создаваться автоматически, если указанная цифра «заблокирована» другим процессом построения графика?
Любые советы о том, как улучшить мой нынешний подход или добиться ускорения с помощью альтернативных подходов, оценены.
Возможно, было бы практически невозможно создать отдельные фигуры, временно сохранить их и, наконец, загрузить их в комбинированную фигуру? Для увеличения скорости 'plt.ioff()' также помогает, так как избегается автоматическое перерисовка. – Faultier
@Faultier @ J.P.Petersen Спасибо! Я уже использую 'plt.ioff' (не входит в пример в вопросе, извините), я никогда не показываю фигуру, просто создаю ее и сохраняю как PDF. Будет ли у меня до сих пор значительное увеличение скорости от использования 'matplotlib' напрямую и вообще избежать« pyplot »? –
@Faultier Что вы имеете в виду при создании отдельных фигур и их объединении? Из того, что [я прочитал] (http://stackoverflow.com/questions/6309472/matplotlib-can-i-create-axessubplot-objects-then-add-them-to-a-figure-instance?noredirect11&lq= 1), это громоздко (если вообще возможно) и официально не поддерживается для создания осей matplotlib отдельно и объединить их в фигуре. Вы имеете в виду сохранение отдельных PDF-файлов, а затем сшивание их вместе?Я рассматриваю это, но не уверен, какая лучшая кроссплатформенная (к сожалению, необходимая для меня) библиотека python для реализации PDF-строчки. –