我正在创建一个带有大约一百个子图/轴的图,每个子图都有几千个数据点。目前,我正在遍历每个子区域,并使用plt.scatter
来放置点。但是,这很慢。是否可以使用多个CPU来加速绘图,通过将每个子图划分为一个核心还是绘制单个子图中的数据点?在matplotlib中,我可以使用多个CPU来加速绘制许多子图和数据点吗?
到目前为止,我曾尝试使用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
工程,所有点然后绘制在同一个图内。然而,将它增加到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?noredirect=1&lq= 1),它很麻烦(如果可能的话),并且不正式支持分别创建matplotlib坐标轴并将它们组合在一个图中。你是指保存单独的PDF文件,然后将它们拼接在一起?我正在考虑这一点,但不知道哪一个是最好的跨平台(不幸的是我需要)python库来实现pdf拼接。 –