Interactive plots in HTML with Plotly
Posted February 06, 2016 at 12:44 PM | categories: plotting, interactive, python | tags:
Most of the plots in this blog are static. Today, I look at making them interactive. I will use https://plot.ly for this. I want to use some data from a paper we published on the relative stabilities of oxide polymorphs mehta-2015-ident-poten. We will make an interactive figure showing the relative stabilities of the RuO2 polymorphs. When you hover on a point, it will show you which polymorph the point refers to. Let's see the figure first here. If you think its interesting read on to see how we made it!
We get our data source here: http://pubs.acs.org/doi/suppl/10.1021/am4059149/suppl_file/am4059149_si_001.pdf .
Now, we extract the data files:
pdftk ~/Desktop/am4059149_si_001.pdf unpack_files
That extracts a json file called supporting-information.json. We use it as suggested in the SI pdf to plot the equations of state for RuO2 for several polymorphs.
# coding=utf-8 import plotly.plotly as py import plotly.graph_objs as go import plotly.tools as tls import numpy as np import json import matplotlib.pyplot as plt from ase.utils.eos import EquationOfState with open('supporting-information.json', 'rb') as f: d = json.loads(f.read()) BO2 = 'RuO2' xc = 'PBE' layout = go.Layout(title='Energy vs. Volume for RuO<sub>2</sub> polymorphs', xaxis=dict(title='Volume (Å<sup>3</sup>)'), yaxis=dict(title='Energy (eV)')) traces = [] for polymorph in ['rutile','anatase','brookite','columbite','pyrite','fluorite']: # number of atoms in the unit cell - used to normalize natoms= len(d[BO2][polymorph][xc]['EOS']['calculations'] [0]['atoms']['symbols']) volumes = [entry['data']['volume']*3./natoms for entry in d[BO2][polymorph][xc]['EOS']['calculations']] energies = [entry['data']['total_energy']*3./natoms for entry in d[BO2][polymorph][xc]['EOS']['calculations']] trace = go.Scatter(x=np.array(volumes), y=np.array(energies), mode='lines+markers', name=polymorph, text=polymorph) traces += [trace] fig = go.Figure(data=traces, layout=layout) plot_url = py.plot(fig, filename='ruo2-2') print tls.get_embed(plot_url)
Pretty nice, now we should have an interactive plot in our browser with the data points labeled with tags, zooming, etc… That is nice for the blog. It isn't so nice for daily work, as there is no visual version of the plot in my org-file. Of course, I can visit the url to see the plot in my browser, it is just different from what I am used to. For everyone else, this is probably better. It looks like you can actually get the data from the web page, including some minimal analysis like regression, and save your view to an image! That could be pretty nice for some data sets.
1 Using Plotly yourself
First, go to https://plot.ly and sign up for an account. You will want to register your API key like this, which will save it in a file for your convenience. Then you can do things like I did above too.
import plotly.tools as tls tls.set_credentials_file(username='jkitchin', api_key='xxxxxxx')
2 References
Copyright (C) 2016 by John Kitchin. See the License for information about copying.
Org-mode version = 8.2.10