简体   繁体   English

Subplot内的分页符? 多页上的 Matplotlib 子图

[英]Pagebreak inside Subplot? Matplotlib subplot over mulitple pages

I want to create a python programm that is able to plot multiple graphs into one PDF file, however the number of subplots is variable.我想创建一个能够将多个图形绘制到一个 PDF 文件中的 python 程序,但是子图的数量是可变的。 I did this already with one plot per page.我已经做到了每页一个情节。 However, since i got someteimes arround 100 plots that makes a lot of scrolling and is not really clearly shown.然而,因为我得到了一些大约 100 个图,这些图进行了大量滚动并且没有真正清楚地显示出来。 Therefore I would like to get like 5X4 subpltots per page.因此,我希望每页有 5X4 个 subpltot。 I wrote code for that alreaedy, the whole code is long and since im very new to pyhton it looks terrible to someone who knows what to do, however the ploting part looks like this:我已经为此编写了代码,整个代码很长,因为我对 pyhton 非常陌生,所以对于知道该怎么做的人来说这看起来很糟糕,但是绘图部分看起来像这样:

rows = (len(tags))/5
fig = plt.figure()
count = 0    
for keyInTags in tags:
       count = count + 1
       ax = fig.add_subplot(int(rows), 5, count)
       ax.set_title("cell" + keyInTags)
       ax.plot(x, y_green, color='k')
       ax.plot(x, y_red, color='k')
       plt.subplots_adjust(hspace=0.5, wspace=0.3)
pdf.savefig(fig)

The idea is that i get an PDF with all "cells" (its for biological research) ploted.这个想法是我得到了一个包含所有“细胞”(用于生物学研究)的 PDF。 The code I wrote is working fine so far, however if I got more than 4 rows of subplots I would like to do a "pageprake".到目前为止,我编写的代码运行良好,但是如果我有超过 4 行的子图,我想做一个“pageprake”。 In some cases i got over 21 rows on one page, that makes it impossible to see anything.在某些情况下,我在一页上有超过 21 行,这使得看不到任何内容。

So, is there a solution to, for example, tell Python to do a page break after 4 rows?那么,是否有解决方案,例如,告诉 Python 在 4 行后进行分页? In the case with 21 rows id like to have 6 pages with nice visible plots.在 21 行 id 的情况下,喜欢有 6 页具有漂亮的可见图。 Or is it done by doing 5x4 plots and then iterating somehow over the file?或者它是通过做 5x4 绘图然后以某种方式迭代文件来完成的? I would be really happy if someone could help a little or give a hint.如果有人可以提供一点帮助或提示,我会非常高兴。 Im sitting here since 4 hours, not finding a solution.我在这里坐了 4 个小时,没有找到解决方案。

A. Loop over pages A. 循环页面

You could find out how many pages you need ( npages ) and create a new figure per page.您可以找出需要多少页 ( npages ) 并为每页创建一个新图。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages


tags = ["".join(np.random.choice(list("ABCDEFG123"), size=5)) for _ in range(53)]

N = len(tags)  # number of subplots
nrows = 5      # number of rows per page
ncols = 4      # number of columns per page

# calculate number of pages needed
npages = N // (nrows*ncols)
if N % (nrows*ncols) > 0:
    npages += 1

pdf = PdfPages('out2.pdf')

for page in range(npages):
    fig = plt.figure(figsize=(8,11))
    for i in range(min(nrows*ncols, N-page*(nrows*ncols))):
        # Your plot here
        count = page*ncols*nrows+i
        ax = fig.add_subplot(nrows, ncols, i+1)
        ax.set_title(f"{count} - {tags[count]}")
        ax.plot(np.cumsum(np.random.randn(33)))
        # end of plotting

    fig.tight_layout()
    pdf.savefig(fig)

pdf.close()
plt.show()

B. Loop over data B. 循环数据

Or alternatively you could loop over the tags themselves and create a new figure once it's needed:或者,您可以遍历标签本身并在需要时创建一个新图形:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages


tags = ["".join(np.random.choice(list("ABCDEFG123"), size=5)) for _ in range(53)]

nrows = 5      # number of rows per page
ncols = 4      # number of columns per page

pdf = PdfPages('out2.pdf')

for i, tag in enumerate(tags):
    j = i % (nrows*ncols)
    if j == 0:
        fig = plt.figure(figsize=(8,11))

    ax = fig.add_subplot(nrows, ncols,j+1)
    ax.set_title(f"{i} - {tags[i]}")
    ax.plot(np.cumsum(np.random.randn(33)))
    # end of plotting
    if j == (nrows*ncols)-1 or i == len(tags)-1:
       fig.tight_layout()
       pdf.savefig(fig)

pdf.close()
plt.show()

You can use matplotlib 's PdfPages as follows.您可以使用matplotlibPdfPages如下。

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt 
import numpy as np

pp = PdfPages('multipage.pdf')

x=np.arange(1,10)
y=np.arange(1,10)

fig=plt.figure()
ax1=fig.add_subplot(211)
# ax1.set_title("cell" + keyInTags)
# ax1.plot(x, y, color='k')
# ax.plot(x, y_red, color='k')
ax2=fig.add_subplot(212)

pp.savefig(fig)

fig2=plt.figure()
ax1=fig2.add_subplot(321)
ax1.plot(x, y, color='k')
ax2=fig2.add_subplot(322)
ax2.plot(x, y, color='k')
ax3=fig2.add_subplot(313)

pp.savefig(fig2)

pp.close()

Play with these subplot numbers a little bit, so you would understand how to handle which graph goes where.稍微玩一下这些子图编号,这样您就会了解如何处理哪个图去哪里。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM