from jinja2 import Template from IPython.display import IFrame, HTML import os import json from .base_plotter import IPlotter class PlotlyPlotter(IPlotter): """ Class for creating plotly.js charts in ipython notebook """ head = ''' ''' template = '''
''' def __init__(self): super(PlotlyPlotter, self).__init__() def render(self, data, layout=None, div_id="chart", head=""): ''' render the data in HTML template ''' if not self.is_valid_name(div_id): raise ValueError( "Name {} is invalid. Only letters, numbers, '_', and '-' are permitted ".format( div_id)) return Template(head + self.template).render( div_id=div_id.replace(" ", "_"), data=json.dumps( data, indent=4).replace("'", "\\'").replace('"', "'"), layout=json.dumps( layout, indent=4).replace("'", "\\'").replace('"', "'")) def plot_and_save(self, data, layout=None, w=800, h=420, filename='chart', overwrite=True): ''' save the rendered html to a file and return an IFrame to display the plot in the notebook ''' self.save(data, layout, filename, overwrite) return IFrame(filename + '.html', w, h) def plot(self, data, layout=None, w=800, h=420): ''' output an iframe containing the plot in the notebook without saving ''' return HTML( self.iframe.format( source=self.render( data=data, layout=layout, head=self.head, ), w=w, h=h)) def save(self, data, layout=None, filename='chart', overwrite=True): ''' save the rendered html to a file in the same directory as the notebook ''' html = self.render( data=data, layout=layout, div_id=filename, head=self.head) if overwrite: with open(filename.replace(" ", "_") + '.html', 'w') as f: f.write(html) else: if not os.path.exists(filename.replace(" ", "_") + '.html'): with open(filename.replace(" ", "_") + '.html', 'w') as f: f.write(html) else: raise IOError('File Already Exists!')