使用matplotlib在pdf上绘制多个图

时间:2015-08-05 12:57:01

标签: python pdf matplotlib subplot

我已经和pyplot打了几天了。我想在每页上返回一份包含4个样本的pdf报告。每个有4个内联子图:带有名称和一些统计信息的文本,以及3个值与时间的图表。我在网上找到了一个教程并尝试了它(见下文),但它什么都没有。 pdf是空的。我找不到它的错误。 提前谢谢!

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()

1 个答案:

答案 0 :(得分:1)

由于你还没有任何答案,我有另一个建议:

Try 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)

这段代码中肯定缺少部分...但是这些是我导入的项目(例如,“英寸”是一个用于调整大小的值,乘以你想要的那个尺寸的英寸数)

您基本上按照他们进入的顺序构建一个列入报表pdf的项目列表。对于每个元素,都会有一些样式设置发生。您可以包括文本(段落),表格(它是“列表列表”,每个列表是一行)和图像。

相关问题