我是Python新手,试图使用matplotlib子图和matplotlib PdfPages后端在单个多页PDF输出文件中可视化大量数据。我的问题是我发现了一个瓶颈,我不知道如何解决。以下是我到目前为止的代码:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
with PdfPages("myfigures.pdf") as pdf:
for i in range(1000):
f, axarr = plt.subplots(2, 3)
plt.subplots(2, 3)
axarr[0, 0].plot(x1, y1)
axarr[1, 0].plot(x2, y2)
pdf.savefig(f)
plt.close("all")
在for循环的每次迭代中创建一个图形似乎非常耗时,但是如果我把它放在循环之外,在绘制下一个图形时,前面的图形不会被清除。我尝试的其他选项,如clear()
或clf()
也不起作用,或者最终创造了多个不同的人物(当我需要的是一个子图数组收集和输出作为一个单一的数字到pdf).有没有人有一个想法如何实现这一点?也许也使它更快?
1条答案
按热度按时间z9gpfhce1#
Multipage PDF追加
matplotlib
在
pdf
* 页 * 上创建子图axes
阵列的 *行-行×行-行 * 矩阵,并在每页子图矩阵完全填满时保存(追加)→然后创建新页,重复,重复。要在单个PDF中包含大量子图作为多页输出,请立即开始用图填充第一页,然后在检测到图生成迭代中添加的最新子图已使当前页面的"行×行×行-行“子图阵列布局[即子图的”行×行矩阵]中的可用空间达到最大后,需要创建一个新页面。
这里有一种方法,可以很容易地改变控制每页子图数量的尺寸(x×x):
对于任何 m×n 布局,只需分别更改 m 和 n 值的声明即可。从上面的代码(其中“
m, n = 4, 5
“)中,生成一个4x 5子图矩阵,共有33个样本,作为两页的pdf输出文件:引用
使用
seaborn
关于上面实现的更高级(& more“pythonic"*)扩展,请参见下面:
多页处理可能应该通过创建一个
new_page
函数来简化;最好不要逐字重复代码 *,特别是如果您开始自定义绘图,在这种情况下,您不想镜像每个更改并输入两次相同的内容。基于seaborn
并使用可用的matplotlib
参数的更定制的美学也可能更好,如下图所示。添加一个
new_page
函数和一些子图样式的自定义: