jupyter | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Since Plotly graphs can be embedded in HTML or exported as a static image, you can embed Plotly graphs in reports suited for print and for the web. This notebook is a primer on creating PDF reports with Python from HTML with Plotly graphs. This notebook uses:
- Plotly for interactive, web native graphs
- IPython Notebook to create this notebook, combining text, HTML, and Python code
- xhtml2pdf to convert HTML to PDF in Python
Run ! pip install xhtml2pdf
in the Terminal to install the xhtml2pdf
package.
First choose the plots that you'd like to add to the report.
graphs= ['https://plot.ly/~christopherp/308', 'https://plot.ly/~christopherp/306', 'https://plot.ly/~christopherp/300', 'https://plot.ly/~christopherp/296']
fromIPython.displayimportdisplay, HTMLdefreport_block_template(report_type, graph_url, caption=''): ifreport_type=='interactive': graph_block='<iframe style="border: none;" src="{graph_url}.embed" width="100%" height="600px"></iframe>'elifreport_type=='static': graph_block= ('''<a href="{graph_url}" target="_blank">'# Open the interactive graph when you click on the image'<img style="height: 400px;" src="{graph_url}.png">''</a>') report_block= (''+graph_block+'{caption}'+# Optional caption to include below the graph'<br>'+# Line break'<a href="{graph_url}" style="color: rgb(190,190,190); text-decoration: none; font-weight: 200;" target="_blank">'+'Click to comment and see the interactive graph'+# Direct readers to Plotly for commenting, interactive graph'</a>'+'<br>'+'<hr>') # horizontal linereturnreport_block.format(graph_url=graph_url, caption=caption) interactive_report=''static_report=''forgraph_urlingraphs: _static_block=report_block_template('static', graph_url, caption='') _interactive_block=report_block_template('interactive', graph_url, caption='') static_report+=_static_blockinteractive_report+=_interactive_block
This version, suited for the web, contains the interactive version of the Plotly graphs, served from Plotly's server.
display(HTML(interactive_report))
This version is easy to convert to PDF. It contains the static version of the Plotly graphs, also served from Plotly's server.
display(HTML(static_report))
importxhtml2pdffromxhtml2pdfimportpisa
fromxhtml2pdfimportpisa# Utility functiondefconvert_html_to_pdf(source_html, output_filename): # open output file for writing (truncated binary)result_file=open(output_filename, "w+b") # convert HTML to PDFpisa_status=pisa.CreatePDF( source_html, # the HTML to convertdest=result_file) # file handle to recieve result# close output fileresult_file.close() # close output file# return True on success and False on errorsreturnpisa_status.errconvert_html_to_pdf(static_report, 'report.pdf') ! openreport.pdf
The static report in the example above uses graphs that were already created in Plotly. Sometimes it's helpful to use graph images that are created on-the-fly. For example, if you're using plotly.js to create the web-reports you might not be saving the graphs to accounts on plot.ly.
To create static images of graphs on-the-fly, use the plotly.plotly.image
class. This class generates images by making a request to the Plotly image server.
Here's an alternative template that uses py.image.get
to generate the images and template them into an HTML and PDF report.
importplotly.plotlyaspyimportbase64width=600height=600template= ('''<img style="width: {width}; height: {height}" src="data:image/png;base64,{image}">''{caption}'# Optional caption to include below the graph'<br>''<hr>''') # A collection of Plotly graphsfigures= [ {'data': [{'x': [1,2,3], 'y': [3,1,6]}], 'layout': {'title': 'the first graph'}}, {'data': [{'x': [1,2,3], 'y': [3,7,6], 'type': 'bar'}], 'layout': {'title': 'the second graph'}} ] # Generate their images using `py.image.get`images= [base64.b64encode(py.image.get(figure, width=width, height=height)).decode('utf-8') forfigureinfigures] report_html=''forimageinimages: _=template_=_.format(image=image, caption='', width=width, height=height) report_html+=_display(HTML(report_html)) convert_html_to_pdf(report_html, 'report-2.pdf')
- Questions? support@plot.ly
- Getting started with Plotly and Python
- Updating Plotly graphs with Python and cron jobs
- Using Plotly offline in IPython notebooks
- Generate HTML reports with Python, Pandas, and Plotly
- Emailing Plotly graphs with Python
- Edit this tutorial
! pipinstallpublisher--upgradefromIPython.displayimportHTML, displaydisplay(HTML('<link href="//fonts.googleapis.com/css?family=Open+Sans:600,400,300,200|Inconsolata|Ubuntu+Mono:400,700" rel="stylesheet" type="text/css" />')) display(HTML('<link rel="stylesheet" type="text/css" href="https://help.plot.ly/documentation/all_static/css/ipython-notebook-custom.css">')) ! pipinstallgit+https://github.com/plotly/publisher.git--upgradeimportpublisherpublisher.publish('pdf-reports.ipynb', 'python/pdf-reports/', 'PDF Reports''How to make PDF reports with Python and Plotly Graphs.', title='Python PDF Reports | plotly', name='PDF Reports', has_thumbnail='true', thumbnail='thumbnail/ipython_10_pdf_report.jpg', language='python', page_type='example_index', display_as='report_generation', order=1)