我正在创建一个包含大约一百个子图/坐标轴的图形,每个子图都有几千个数据点。目前,我正在循环遍历每个子图,并使用
到目前为止,我尝试使用
plt.scatter
放置数据点。然而,这样做速度很慢。是否可以使用多个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()
也很有帮助,因为可以避免自动重绘。 - Faultierplt.ioff
(未包含在问题示例中,抱歉),我从不显示图形,只是创建它并保存为PDF。如果完全避免使用pyplot
,直接使用matplotlib
,我是否仍然可以获得显著的速度提升? - joelostblomplt.imread()
和plt.imshow()
填充该图。 2/3b. 或者,将图片放入 LaTeX 表格中,并从中创建 PDF。