简体   繁体   中英

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. 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. Therefore I would like to get like 5X4 subpltots per page. 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:

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. 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". In some cases i got over 21 rows on one page, that makes it impossible to see anything.

So, is there a solution to, for example, tell Python to do a page break after 4 rows? In the case with 21 rows id like to have 6 pages with nice visible plots. Or is it done by doing 5x4 plots and then iterating somehow over the file? 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.

A. Loop over pages

You could find out how many pages you need ( npages ) and create a new figure per page.

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

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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