简体   繁体   English

使用matplotlib在pdf上绘制多个图

[英]Multiple plots on pdf with matplotlib

I've been fighting with pyplot for few days now. 我已经和pyplot战斗了几天了。 I want to return a pdf report with 4 samples on each page. 我想返回每页包含4个样本的pdf报告。 4 inline subplots for each: text with the name and some statistics, and 3 graphs of values vs time. 每个都有4个内联子图:带有名称和一些统计信息的文本,以及3个值随时间变化的图形。 I found a tutorial online and tried it (see below) but it gives nothing. 我在网上找到了一个教程并进行了尝试(请参阅下文),但没有任何帮助。 the pdf is empty. pdf为空。 I can't find where it is wrong. 我找不到哪里出了问题。 Thank you in advance ! 先感谢您 !

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt 
t=[n*5 for n in range(len(ratio))]

y_list_ratio=[[x*100/l[3]for x in l[2]]for l in hit_ratio]
props = dict(boxstyle='round', facecolor='wheat', alpha=0.5)


 pp = PdfPages('multipage.pdf')



# Generate the pages
nb_plots = len(hit_ratio)
nb_plots_per_page = 4
nb_pages = int(numpy.ceil(nb_plots / float(nb_plots_per_page)))
grid_size = (nb_plots_per_page, 4)

for i, elt in enumerate(hit_ratio):
  # Create a figure instance (ie. a new page) if needed
    if i % nb_plots_per_page == 0:
        plt = plt.figure(figsize=(8.27, 11.69), dpi=100)

  # Plot stuffs !
    plt.subplot2grid(grid_size, (i % nb_plots_per_page, 0))

    plt.text(0.5,0.5,"Puit       Hauteur_pic       Digitonine\n"+ \
            str(elt[-1])+"   "+str(elt[5])+"   "+str(elt[6]),horizontalalignment='center',verticalalignment='center', bbox=props)

    plt.subplot2grid(grid_size, (i % nb_plots_per_page, 1))
    plt.plot(t,hit_norm[i][0])

    plt.subplot2grid(grid_size, (i % nb_plots_per_page, 2))
    plt.plot(t,y_list_ratio[i])

    plt.subplot2grid(grid_size, (i % nb_plots_per_page, 3))
    plt.plot(t,elt[7])
    plt.plot(t,elt[8])

  # Close the page if needed
    if (i + 1) % nb_plots_per_page == 0 or (i + 1) == nb_plots:
        fig2.tight_layout()
        pp.savefig(fig2)

# Write the PDF document to the disk
pp.close()

Since you don't have any answers yet, I have an alternate suggestion: 由于您还没有任何答案,因此我有另一种建议:

Try ReportLab. 尝试ReportLab。

from reportlab.lib import colors, utils
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter, landscape
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image, PageBreak, KeepTogether
from reportlab.lib.styles import ParagraphStyle as PS
from reportlab.lib.enums import TA_CENTER
from reportlab.platypus.paragraph import Paragraph

landscape_pic_width = 8
letter_pic_width = 6

....

def get_image(path, width=1*inch):
#'''returns an image for adding to report'''
    img = utils.ImageReader(path)
    iw, ih = img.getSize()
    aspect = ih / float(iw)
    return Image(path, width=width, height=(width * aspect))

def plot_stuff():
    #whatever you want to plot, finish with saving the figure

elements = [] #this is a list that will contain the items to be included in the report
report_title = str(report_title) 

c_table = Table(Conditions_Table_data)
c_table.setStyle(TableStyle([('ALIGN', (0,0),(-1,-1),'CENTER'), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0),(-1,-1), 2, colors.blueviolet), ('SIZE', (0,0),(-1,-1), 10), ('SPAN',(-3,3),(-1,3))]))
#tells it how to format the table 

#puts in the logo, the assigned report title, the entered report title, the conditions table, and the setup picture
elements.append(get_image(logo_picture, width = 9*inch))
elements.append(Paragraph(document_title, PS(name='Heading1', spaceAfter = 22, fontName = 'Times-Bold', fontSize = 18, alignment = TA_CENTER)))  
#you can append items to the list "elements" with a for loop. 

doc = SimpleDocTemplate(path_plus_title + ".pdf", pagesize=landscape(letter))

#creates the report. Will throw an error if the report exists and is already open. Otherwise, will generate a report 
#this WILL overwrite an existing report with the same name. Timestamps being forced into the data file names help. 
doc.build(elements)

There's definitely sections missing from this code...but these are the items I import ("inch", for instance, is a value for sizing that you multiply by the number of inches you want for that dimension) 此代码中肯定缺少某些部分...但是这些是我导入的项目(例如,“ inch”是用于将尺寸乘以该尺寸所需的英寸数的值)

You basically build a list of the items that go into your report pdf in the order they go in. For each element, there's some style setting that takes place. 基本上,您将按照进入清单的顺序来构建进入报告pdf的清单。对于每个元素,都会进行一些样式设置。 You can include text (Paragraphs), tables (it's a "list of lists" with each list being a row), and images. 您可以包括文本(段落),表格(这是“列表列表”,每个列表为一行)和图像。

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

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