<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <atom:link href="http://kitchingroup.cheme.cmu.edu/blog/feed/index.xml" rel="self" type="application/rss+xml" />
    <title>The Kitchin Research Group</title>
    <link>https://kitchingroup.cheme.cmu.edu/blog</link>
    <description>Chemical Engineering at Carnegie Mellon University</description>
    <pubDate>Sat, 01 Nov 2025 13:47:46 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    
    <item>
      <title>Calling remote code-blocks in org-mode</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2016/02/09/Calling-remote-code-blocks-in-org-mode</link>
      <pubDate>Tue, 09 Feb 2016 20:40:59 EST</pubDate>
      <category><![CDATA[orgmode]]></category>
      <category><![CDATA[interactive]]></category>
      <category><![CDATA[plotting]]></category>
      <guid isPermaLink="false">-ajoa6PEQC22p9Dndgz702zHuJo=</guid>
      <description>Calling remote code-blocks in org-mode</description>
      <content:encoded><![CDATA[


&lt;div id="table-of-contents"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#sec-1"&gt;1. References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
We often write code in supporting information files that generates figures or tables in a scientific manuscript. Today, we explore how to call those code blocks remotely but get the output in the file we call it from. We will write code in &lt;a href="/media/2016-02-09-Calling-remote-code-blocks-in-org-mode/si.org"&gt;si.org&lt;/a&gt; that generates an interactive figure that is presented in this file. We will use data published in &lt;a class='org-ref-reference' href="#hallenbeck-2015-compar-co2"&gt;hallenbeck-2015-compar-co2&lt;/a&gt;. You can find the data we used in the SI for that paper, or more conveniently &lt;a href="https://github.com/KitchinHUB/kitchingroup-62"&gt;here&lt;/a&gt; .
&lt;/p&gt;

&lt;p&gt;
So, we make a named code block in the &lt;a href="/media/2016-02-09-Calling-remote-code-blocks-in-org-mode/si.org"&gt;si.org&lt;/a&gt; file called "figure-1". Then we call it like this:
&lt;/p&gt;

&lt;pre class="example"&gt;
#+call: si.org:figure-1() :wrap html
&lt;/pre&gt;

&lt;p&gt;
That executes the code block in the other file, and wraps the output in an HTML block &lt;i&gt;in this file&lt;/i&gt;! I do not like my code blocks to execute when I export because they are usually expensive calculations, so I have to manually run the line with C-c C-c, but you can override that behavior with a local setting of org-export-babel-evaluate. So, without further delay, here is the result. Now we have a nice, neat blog post file, with code in an &lt;a href="/media/2016-02-09-Calling-remote-code-blocks-in-org-mode/si.org"&gt;si.org&lt;/a&gt; file!
&lt;/p&gt;

&lt;iframe id="igraph" scrolling="no" style="border:none;"seamless="seamless" src="https://plot.ly/~jkitchin/6.embed" height="525" width="100%"&gt;&lt;/iframe&gt;

&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; References&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
&lt;h1 class='org-ref-bib-h1'&gt;Bibliography&lt;/h1&gt;
&lt;ul class='org-ref-bib'&gt;&lt;li&gt;&lt;a id="hallenbeck-2015-compar-co2"&gt;[hallenbeck-2015-compar-co2] "Alexander Hallenbeck, Adefemi Egbebi, Kevin Resnik, , David Hopkinson, Shelley Anna &amp; John Kitchin", Comparative Microfluidic Screening of Amino Acid Salt  Solutions for Post-Combustion \ceCO2 Capture, &lt;i&gt;"International Journal of Greenhouse Gas Control "&lt;/i&gt;, &lt;b&gt;43&lt;/b&gt;, 189 - 197 (2015). &lt;a href="http://www.sciencedirect.com/science/article/pii/S1750583615301134"&gt;link&lt;/a&gt;. &lt;a href="https://doi.org/10.1016/j.ijggc.2015.10.026"&gt;doi&lt;/a&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2016 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2016/02/09/Calling-remote-code-blocks-in-org-mode.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;
]]></content:encoded>
    </item>
    <item>
      <title>Interactive figures in blog posts with mpld3</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2016/02/08/Interactive-figures-in-blog-posts-with-mpld3</link>
      <pubDate>Mon, 08 Feb 2016 07:33:23 EST</pubDate>
      <category><![CDATA[plotting]]></category>
      <category><![CDATA[interactive]]></category>
      <category><![CDATA[python]]></category>
      <guid isPermaLink="false">1CrAIWaPYEtSGBHf15JTbQbHCHI=</guid>
      <description>Interactive figures in blog posts with mpld3</description>
      <content:encoded><![CDATA[



&lt;p&gt;
Continuing the exploration of interactive figures, today we consider the Python plotting library &lt;a href="http://mpld3.github.io/index.html"&gt;mpld3&lt;/a&gt; . We will again use our own published data. We wrote this great paper on core level shifts (CLS) in Cu-Pd alloys &lt;a class='org-ref-reference' href="#boes-2015-core-cu"&gt;boes-2015-core-cu&lt;/a&gt;. I want an interactive figure that shows the name of the calculation on each point as a tooltip. This data is all stored in the supporting information file, and you can see how we use it &lt;a href="#sec-1"&gt;here&lt;/a&gt;. This figure shows how the core level shift of a Cu atom changes depending on the number of nearest neighbor Cu atoms. Just hover your mouse over a point to see the name and CLS for that point.
&lt;/p&gt;



&lt;style&gt;

&lt;/style&gt;

&lt;div id="fig_el8116045214667689201799167"&gt;&lt;/div&gt;
&lt;script&gt;
function mpld3_load_lib(url, callback){
  var s = document.createElement('script');
  s.src = url;
  s.async = true;
  s.onreadystatechange = s.onload = callback;
  s.onerror = function(){console.warn("failed to load library " + url);};
  document.getElementsByTagName("head")[0].appendChild(s);
}

if(typeof(mpld3) !== "undefined" &amp;&amp; mpld3._mpld3IsLoaded){
   // already loaded: just create the figure
   !function(mpld3){

    mpld3.register_plugin("htmltooltip", HtmlTooltipPlugin);
    HtmlTooltipPlugin.prototype = Object.create(mpld3.Plugin.prototype);
    HtmlTooltipPlugin.prototype.constructor = HtmlTooltipPlugin;
    HtmlTooltipPlugin.prototype.requiredProps = ["id"];
    HtmlTooltipPlugin.prototype.defaultProps = {labels:null, hoffset:0, voffset:10};
    function HtmlTooltipPlugin(fig, props){
        mpld3.Plugin.call(this, fig, props);
    };

    HtmlTooltipPlugin.prototype.draw = function(){
       var obj = mpld3.get_element(this.props.id);
       var labels = this.props.labels;
       var tooltip = d3.select("body").append("div")
                    .attr("class", "mpld3-tooltip")
                    .style("position", "absolute")
                    .style("z-index", "10")
                    .style("visibility", "hidden");

       obj.elements()
           .on("mouseover", function(d, i){
                              tooltip.html(labels[i])
                                     .style("visibility", "visible");})
           .on("mousemove", function(d, i){
                    tooltip
                      .style("top", d3.event.pageY + this.props.voffset + "px")
                      .style("left",d3.event.pageX + this.props.hoffset + "px");
                 }.bind(this))
           .on("mouseout",  function(d, i){
                           tooltip.style("visibility", "hidden");});
    };

       mpld3.draw_figure("fig_el8116045214667689201799167", {"axes": [{"xlim": [-0.10000000000000001, 5.0999999999999996], "yscale": "linear", "axesbg": "#FFFFFF", "texts": [{"v_baseline": "hanging", "h_anchor": "middle", "color": "#000000", "text": "# Cu Nearest neighbors", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [0.5, -0.059895833333333329], "rotation": -0.0, "id": "el811604301509136"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Cu 2p(3/2) Core Level Shift (eV)", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [-0.081149193548387094, 0.5], "rotation": -90.0, "id": "el811604590615056"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Hover over a point to see the calculation name", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 14.399999999999999, "position": [0.5, 1.0144675925925926], "rotation": -0.0, "id": "el811604590601360"}], "zoomable": true, "images": [], "xdomain": [-0.10000000000000001, 5.0999999999999996], "ylim": [-1.1499999999999999, -0.59999999999999998], "paths": [], "sharey": [], "sharex": [], "axesbgalpha": null, "axes": [{"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "bottom", "nticks": 8, "tickvalues": null}, {"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "left", "nticks": 8, "tickvalues": null}], "lines": [], "markers": [], "id": "el811604578565392", "ydomain": [-1.1499999999999999, -0.59999999999999998], "collections": [{"paths": [[[[0.0, -0.5], [0.13260155, -0.5], [0.25978993539242673, -0.44731684579412084], [0.3535533905932738, -0.3535533905932738], [0.44731684579412084, -0.25978993539242673], [0.5, -0.13260155], [0.5, 0.0], [0.5, 0.13260155], [0.44731684579412084, 0.25978993539242673], [0.3535533905932738, 0.3535533905932738], [0.25978993539242673, 0.44731684579412084], [0.13260155, 0.5], [0.0, 0.5], [-0.13260155, 0.5], [-0.25978993539242673, 0.44731684579412084], [-0.3535533905932738, 0.3535533905932738], [-0.44731684579412084, 0.25978993539242673], [-0.5, 0.13260155], [-0.5, 0.0], [-0.5, -0.13260155], [-0.44731684579412084, -0.25978993539242673], [-0.3535533905932738, -0.3535533905932738], [-0.25978993539242673, -0.44731684579412084], [-0.13260155, -0.5], [0.0, -0.5]], ["M", "C", "C", "C", "C", "C", "C", "C", "C", "Z"]]], "edgecolors": ["#000000"], "edgewidths": [1.0], "offsets": "data01", "yindex": 1, "id": "el811604578805904", "pathtransforms": [[5.555555555555555, 0.0, 0.0, 5.555555555555555, 0.0, 0.0]], "pathcoordinates": "display", "offsetcoordinates": "data", "zorder": 1, "xindex": 0, "alphas": [null], "facecolors": ["#007F00"]}], "xscale": "linear", "bbox": [0.125, 0.099999999999999978, 0.77500000000000002, 0.80000000000000004]}], "height": 480.0, "width": 640.0, "plugins": [{"type": "reset"}, {"enabled": false, "button": true, "type": "zoom"}, {"enabled": false, "button": true, "type": "boxzoom"}, {"voffset": 0, "labels": ["I2C0 (2, -0.935278)", "I2C1 (2, -0.946807)", "I2C2 (2, -0.943939)", "I3C0 (3, -0.833261)", "I3C1 (3, -0.843403)", "I3C2 (3, -0.855672)", "I4C0 (4, -0.724523)", "I4C1 (4, -0.747264)", "I4C2 (4, -0.747883)", "I4C3 (4, -0.735007)", "I4C4 (4, -0.736147)", "I5C0 (5, -0.632788)", "I5C1 (5, -0.646229)", "I5C2 (5, -0.654132)", "(1, -1.041875)", "(0, -1.127344)"], "type": "htmltooltip", "id": "el811604578805904", "hoffset": 10}], "data": {"data01": [[2.0, -0.9352779999999825], [2.0, -0.9468069999999216], [2.0, -0.9439389999999435], [3.0, -0.8332609999999363], [3.0, -0.8434029999999382], [3.0, -0.85567199999997], [4.0, -0.7245230000000049], [4.0, -0.747263999999916], [4.0, -0.7478829999999164], [4.0, -0.7350069999999391], [4.0, -0.7361470000000168], [5.0, -0.6327879999999766], [5.0, -0.6462289999999484], [5.0, -0.6541319999999757], [1.0, -1.0418749999999761], [0.0, -1.1273439999999653]]}, "id": "el811604521466768"});
   }(mpld3);
}else if(typeof define === "function" &amp;&amp; define.amd){
   // require.js is available: use it to load d3/mpld3
   require.config({paths: {d3: "https://mpld3.github.io/js/d3.v3.min"}});
   require(["d3"], function(d3){
      window.d3 = d3;
      mpld3_load_lib("https://mpld3.github.io/js/mpld3.v0.2.js", function(){

    mpld3.register_plugin("htmltooltip", HtmlTooltipPlugin);
    HtmlTooltipPlugin.prototype = Object.create(mpld3.Plugin.prototype);
    HtmlTooltipPlugin.prototype.constructor = HtmlTooltipPlugin;
    HtmlTooltipPlugin.prototype.requiredProps = ["id"];
    HtmlTooltipPlugin.prototype.defaultProps = {labels:null, hoffset:0, voffset:10};
    function HtmlTooltipPlugin(fig, props){
        mpld3.Plugin.call(this, fig, props);
    };

    HtmlTooltipPlugin.prototype.draw = function(){
       var obj = mpld3.get_element(this.props.id);
       var labels = this.props.labels;
       var tooltip = d3.select("body").append("div")
                    .attr("class", "mpld3-tooltip")
                    .style("position", "absolute")
                    .style("z-index", "10")
                    .style("visibility", "hidden");

       obj.elements()
           .on("mouseover", function(d, i){
                              tooltip.html(labels[i])
                                     .style("visibility", "visible");})
           .on("mousemove", function(d, i){
                    tooltip
                      .style("top", d3.event.pageY + this.props.voffset + "px")
                      .style("left",d3.event.pageX + this.props.hoffset + "px");
                 }.bind(this))
           .on("mouseout",  function(d, i){
                           tooltip.style("visibility", "hidden");});
    };

         mpld3.draw_figure("fig_el8116045214667689201799167", {"axes": [{"xlim": [-0.10000000000000001, 5.0999999999999996], "yscale": "linear", "axesbg": "#FFFFFF", "texts": [{"v_baseline": "hanging", "h_anchor": "middle", "color": "#000000", "text": "# Cu Nearest neighbors", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [0.5, -0.059895833333333329], "rotation": -0.0, "id": "el811604301509136"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Cu 2p(3/2) Core Level Shift (eV)", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [-0.081149193548387094, 0.5], "rotation": -90.0, "id": "el811604590615056"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Hover over a point to see the calculation name", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 14.399999999999999, "position": [0.5, 1.0144675925925926], "rotation": -0.0, "id": "el811604590601360"}], "zoomable": true, "images": [], "xdomain": [-0.10000000000000001, 5.0999999999999996], "ylim": [-1.1499999999999999, -0.59999999999999998], "paths": [], "sharey": [], "sharex": [], "axesbgalpha": null, "axes": [{"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "bottom", "nticks": 8, "tickvalues": null}, {"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "left", "nticks": 8, "tickvalues": null}], "lines": [], "markers": [], "id": "el811604578565392", "ydomain": [-1.1499999999999999, -0.59999999999999998], "collections": [{"paths": [[[[0.0, -0.5], [0.13260155, -0.5], [0.25978993539242673, -0.44731684579412084], [0.3535533905932738, -0.3535533905932738], [0.44731684579412084, -0.25978993539242673], [0.5, -0.13260155], [0.5, 0.0], [0.5, 0.13260155], [0.44731684579412084, 0.25978993539242673], [0.3535533905932738, 0.3535533905932738], [0.25978993539242673, 0.44731684579412084], [0.13260155, 0.5], [0.0, 0.5], [-0.13260155, 0.5], [-0.25978993539242673, 0.44731684579412084], [-0.3535533905932738, 0.3535533905932738], [-0.44731684579412084, 0.25978993539242673], [-0.5, 0.13260155], [-0.5, 0.0], [-0.5, -0.13260155], [-0.44731684579412084, -0.25978993539242673], [-0.3535533905932738, -0.3535533905932738], [-0.25978993539242673, -0.44731684579412084], [-0.13260155, -0.5], [0.0, -0.5]], ["M", "C", "C", "C", "C", "C", "C", "C", "C", "Z"]]], "edgecolors": ["#000000"], "edgewidths": [1.0], "offsets": "data01", "yindex": 1, "id": "el811604578805904", "pathtransforms": [[5.555555555555555, 0.0, 0.0, 5.555555555555555, 0.0, 0.0]], "pathcoordinates": "display", "offsetcoordinates": "data", "zorder": 1, "xindex": 0, "alphas": [null], "facecolors": ["#007F00"]}], "xscale": "linear", "bbox": [0.125, 0.099999999999999978, 0.77500000000000002, 0.80000000000000004]}], "height": 480.0, "width": 640.0, "plugins": [{"type": "reset"}, {"enabled": false, "button": true, "type": "zoom"}, {"enabled": false, "button": true, "type": "boxzoom"}, {"voffset": 0, "labels": ["I2C0 (2, -0.935278)", "I2C1 (2, -0.946807)", "I2C2 (2, -0.943939)", "I3C0 (3, -0.833261)", "I3C1 (3, -0.843403)", "I3C2 (3, -0.855672)", "I4C0 (4, -0.724523)", "I4C1 (4, -0.747264)", "I4C2 (4, -0.747883)", "I4C3 (4, -0.735007)", "I4C4 (4, -0.736147)", "I5C0 (5, -0.632788)", "I5C1 (5, -0.646229)", "I5C2 (5, -0.654132)", "(1, -1.041875)", "(0, -1.127344)"], "type": "htmltooltip", "id": "el811604578805904", "hoffset": 10}], "data": {"data01": [[2.0, -0.9352779999999825], [2.0, -0.9468069999999216], [2.0, -0.9439389999999435], [3.0, -0.8332609999999363], [3.0, -0.8434029999999382], [3.0, -0.85567199999997], [4.0, -0.7245230000000049], [4.0, -0.747263999999916], [4.0, -0.7478829999999164], [4.0, -0.7350069999999391], [4.0, -0.7361470000000168], [5.0, -0.6327879999999766], [5.0, -0.6462289999999484], [5.0, -0.6541319999999757], [1.0, -1.0418749999999761], [0.0, -1.1273439999999653]]}, "id": "el811604521466768"});
      });
    });
}else{
    // require.js not available: dynamically load d3 &amp; mpld3
    mpld3_load_lib("https://mpld3.github.io/js/d3.v3.min.js", function(){
         mpld3_load_lib("https://mpld3.github.io/js/mpld3.v0.2.js", function(){

    mpld3.register_plugin("htmltooltip", HtmlTooltipPlugin);
    HtmlTooltipPlugin.prototype = Object.create(mpld3.Plugin.prototype);
    HtmlTooltipPlugin.prototype.constructor = HtmlTooltipPlugin;
    HtmlTooltipPlugin.prototype.requiredProps = ["id"];
    HtmlTooltipPlugin.prototype.defaultProps = {labels:null, hoffset:0, voffset:10};
    function HtmlTooltipPlugin(fig, props){
        mpld3.Plugin.call(this, fig, props);
    };

    HtmlTooltipPlugin.prototype.draw = function(){
       var obj = mpld3.get_element(this.props.id);
       var labels = this.props.labels;
       var tooltip = d3.select("body").append("div")
                    .attr("class", "mpld3-tooltip")
                    .style("position", "absolute")
                    .style("z-index", "10")
                    .style("visibility", "hidden");

       obj.elements()
           .on("mouseover", function(d, i){
                              tooltip.html(labels[i])
                                     .style("visibility", "visible");})
           .on("mousemove", function(d, i){
                    tooltip
                      .style("top", d3.event.pageY + this.props.voffset + "px")
                      .style("left",d3.event.pageX + this.props.hoffset + "px");
                 }.bind(this))
           .on("mouseout",  function(d, i){
                           tooltip.style("visibility", "hidden");});
    };

                 mpld3.draw_figure("fig_el8116045214667689201799167", {"axes": [{"xlim": [-0.10000000000000001, 5.0999999999999996], "yscale": "linear", "axesbg": "#FFFFFF", "texts": [{"v_baseline": "hanging", "h_anchor": "middle", "color": "#000000", "text": "# Cu Nearest neighbors", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [0.5, -0.059895833333333329], "rotation": -0.0, "id": "el811604301509136"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Cu 2p(3/2) Core Level Shift (eV)", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 12.0, "position": [-0.081149193548387094, 0.5], "rotation": -90.0, "id": "el811604590615056"}, {"v_baseline": "auto", "h_anchor": "middle", "color": "#000000", "text": "Hover over a point to see the calculation name", "coordinates": "axes", "zorder": 3, "alpha": 1, "fontsize": 14.399999999999999, "position": [0.5, 1.0144675925925926], "rotation": -0.0, "id": "el811604590601360"}], "zoomable": true, "images": [], "xdomain": [-0.10000000000000001, 5.0999999999999996], "ylim": [-1.1499999999999999, -0.59999999999999998], "paths": [], "sharey": [], "sharex": [], "axesbgalpha": null, "axes": [{"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "bottom", "nticks": 8, "tickvalues": null}, {"scale": "linear", "tickformat": null, "grid": {"gridOn": false}, "fontsize": 12.0, "position": "left", "nticks": 8, "tickvalues": null}], "lines": [], "markers": [], "id": "el811604578565392", "ydomain": [-1.1499999999999999, -0.59999999999999998], "collections": [{"paths": [[[[0.0, -0.5], [0.13260155, -0.5], [0.25978993539242673, -0.44731684579412084], [0.3535533905932738, -0.3535533905932738], [0.44731684579412084, -0.25978993539242673], [0.5, -0.13260155], [0.5, 0.0], [0.5, 0.13260155], [0.44731684579412084, 0.25978993539242673], [0.3535533905932738, 0.3535533905932738], [0.25978993539242673, 0.44731684579412084], [0.13260155, 0.5], [0.0, 0.5], [-0.13260155, 0.5], [-0.25978993539242673, 0.44731684579412084], [-0.3535533905932738, 0.3535533905932738], [-0.44731684579412084, 0.25978993539242673], [-0.5, 0.13260155], [-0.5, 0.0], [-0.5, -0.13260155], [-0.44731684579412084, -0.25978993539242673], [-0.3535533905932738, -0.3535533905932738], [-0.25978993539242673, -0.44731684579412084], [-0.13260155, -0.5], [0.0, -0.5]], ["M", "C", "C", "C", "C", "C", "C", "C", "C", "Z"]]], "edgecolors": ["#000000"], "edgewidths": [1.0], "offsets": "data01", "yindex": 1, "id": "el811604578805904", "pathtransforms": [[5.555555555555555, 0.0, 0.0, 5.555555555555555, 0.0, 0.0]], "pathcoordinates": "display", "offsetcoordinates": "data", "zorder": 1, "xindex": 0, "alphas": [null], "facecolors": ["#007F00"]}], "xscale": "linear", "bbox": [0.125, 0.099999999999999978, 0.77500000000000002, 0.80000000000000004]}], "height": 480.0, "width": 640.0, "plugins": [{"type": "reset"}, {"enabled": false, "button": true, "type": "zoom"}, {"enabled": false, "button": true, "type": "boxzoom"}, {"voffset": 0, "labels": ["I2C0 (2, -0.935278)", "I2C1 (2, -0.946807)", "I2C2 (2, -0.943939)", "I3C0 (3, -0.833261)", "I3C1 (3, -0.843403)", "I3C2 (3, -0.855672)", "I4C0 (4, -0.724523)", "I4C1 (4, -0.747264)", "I4C2 (4, -0.747883)", "I4C3 (4, -0.735007)", "I4C4 (4, -0.736147)", "I5C0 (5, -0.632788)", "I5C1 (5, -0.646229)", "I5C2 (5, -0.654132)", "(1, -1.041875)", "(0, -1.127344)"], "type": "htmltooltip", "id": "el811604578805904", "hoffset": 10}], "data": {"data01": [[2.0, -0.9352779999999825], [2.0, -0.9468069999999216], [2.0, -0.9439389999999435], [3.0, -0.8332609999999363], [3.0, -0.8434029999999382], [3.0, -0.85567199999997], [4.0, -0.7245230000000049], [4.0, -0.747263999999916], [4.0, -0.7478829999999164], [4.0, -0.7350069999999391], [4.0, -0.7361470000000168], [5.0, -0.6327879999999766], [5.0, -0.6462289999999484], [5.0, -0.6541319999999757], [1.0, -1.0418749999999761], [0.0, -1.1273439999999653]]}, "id": "el811604521466768"});
            })
         });
}
&lt;/script&gt;

&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;a id="ID-17D73543-F528-459D-95EF-B3AB3C4EEDC7" name="ID-17D73543-F528-459D-95EF-B3AB3C4EEDC7"&gt;&lt;/a&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; Data and code&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
You can check out our preprint at &lt;a href="https://github.com/KitchinHUB/kitchingroup-51"&gt;https://github.com/KitchinHUB/kitchingroup-51&lt;/a&gt; .  We are going to adapt the code to make Figure 6a in the manuscript interactive. The code needed a somewhat surprising amount of adaptation. Apparently the ase database interface has changed a lot since we write that paper, so the code here looks a bit different than what we published. The biggest difference is due to name-mangling so each key that started with a number now starts with _, and and periods are replaced by _ also. The rest of the script is nearly unchanged. At the end is the very small bit of mpld3 code that generates the figure for html. We will add tooltips onto datapoints to indicate what the name associated with each data point is. Here is the code.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python" id="mpld3-figure"&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; plt
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; ase.db &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; connect

&lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;loads the ASE database and select certain keywords&lt;/span&gt;
&lt;span style="color: #BA36A5;"&gt;db&lt;/span&gt; = connect(&lt;span style="color: #008000;"&gt;'~/Desktop/cappa/kitchingroup-51/supporting-information/data.json'&lt;/span&gt;)

&lt;span style="color: #BA36A5;"&gt;keys&lt;/span&gt; = [&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_54atom'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'ensam'&lt;/span&gt;]

&lt;span style="color: #BA36A5;"&gt;CLS&lt;/span&gt;, &lt;span style="color: #BA36A5;"&gt;IMP&lt;/span&gt;, &lt;span style="color: #BA36A5;"&gt;labels&lt;/span&gt; = [], [], []
&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; k &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; db.select(keys + [&lt;span style="color: #008000;"&gt;'_1cl'&lt;/span&gt;]):
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;name&lt;/span&gt; = k.keywords[-2]

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;Cu0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;'bcc,GS,_72atom,_0cl,_1_00Cu'&lt;/span&gt;).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;Cu1&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;'bcc,GS,_72atom,_1cl,_1_00Cu'&lt;/span&gt;).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;x0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join(keys + [name, &lt;span style="color: #008000;"&gt;'_0cl'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;x1&lt;/span&gt; = k.energy

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;cls0&lt;/span&gt; = x0 - Cu0
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;cls1&lt;/span&gt; = x1 - Cu1

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   IMP.append(&lt;span style="color: #006FE0;"&gt;int&lt;/span&gt;(name[1]))
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   CLS.append(cls1 - cls0)
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;labels&lt;/span&gt; += [&lt;span style="color: #008000;"&gt;'{0} ({1}, {2})'&lt;/span&gt;.&lt;span style="color: #006FE0;"&gt;format&lt;/span&gt;(name, &lt;span style="color: #006FE0;"&gt;int&lt;/span&gt;(name[1]), cls1 - cls0)]

&lt;span style="color: #BA36A5;"&gt;Cu0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_72atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'_0cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1_00Cu'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #BA36A5;"&gt;Cu1&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_72atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'_1cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1_00Cu'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy

&lt;span style="color: #BA36A5;"&gt;x0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_54atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'_0cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #BA36A5;"&gt;x1&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_54atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'_1cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy

&lt;span style="color: #BA36A5;"&gt;cls0&lt;/span&gt; = x0 - Cu0
&lt;span style="color: #BA36A5;"&gt;cls1&lt;/span&gt; = x1 - Cu1

IMP.append(1)
CLS.append(cls1 - cls0)
&lt;span style="color: #BA36A5;"&gt;labels&lt;/span&gt; += [&lt;span style="color: #008000;"&gt;'(1, {0})'&lt;/span&gt;.&lt;span style="color: #006FE0;"&gt;format&lt;/span&gt;(cls1 - cls0)]

&lt;span style="color: #BA36A5;"&gt;Cu0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_72atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'_0cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1_00Cu'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #BA36A5;"&gt;Cu1&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_72atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'_1cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_1_00Cu'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy

&lt;span style="color: #BA36A5;"&gt;x0&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_54atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'_0cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_0'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy
&lt;span style="color: #BA36A5;"&gt;x1&lt;/span&gt; = db.select(&lt;span style="color: #008000;"&gt;','&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'bcc'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'GS'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_54atom'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'_1cl'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'_0'&lt;/span&gt;])).&lt;span style="color: #006FE0;"&gt;next&lt;/span&gt;().energy

&lt;span style="color: #BA36A5;"&gt;cls0&lt;/span&gt; = x0 - Cu0
&lt;span style="color: #BA36A5;"&gt;cls1&lt;/span&gt; = x1 - Cu1

IMP.append(0)
CLS.append(cls1 - cls0)
&lt;span style="color: #BA36A5;"&gt;labels&lt;/span&gt; += [&lt;span style="color: #008000;"&gt;'(0, {0})'&lt;/span&gt;.&lt;span style="color: #006FE0;"&gt;format&lt;/span&gt;(cls1 - cls0)]

&lt;span style="color: #BA36A5;"&gt;fig&lt;/span&gt; = plt.figure()

&lt;span style="color: #BA36A5;"&gt;p&lt;/span&gt; = plt.scatter(IMP, CLS, c=&lt;span style="color: #008000;"&gt;'g'&lt;/span&gt;, marker=&lt;span style="color: #008000;"&gt;'o'&lt;/span&gt;, s=25)
&lt;span style="color: #BA36A5;"&gt;ax1&lt;/span&gt; = plt.gca()
ax1.set_ylim(-1.15, -0.6)
ax1.set_xlim(-0.1, 5.1)

ax1.set_xlabel(&lt;span style="color: #008000;"&gt;'# Cu Nearest neighbors'&lt;/span&gt;)
ax1.set_ylabel(&lt;span style="color: #008000;"&gt;'Cu 2p(3/2) Core Level Shift (eV)'&lt;/span&gt;)

ax1.set_title(&lt;span style="color: #008000;"&gt;'Hover over a point to see the calculation name'&lt;/span&gt;)

&lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;Now the mpld3 stuff.&lt;/span&gt;
&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; mpld3
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; mpld3 &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; plugins

&lt;span style="color: #BA36A5;"&gt;tooltip&lt;/span&gt; = plugins.PointHTMLTooltip(p, labels, voffset=0, hoffset=10)
plugins.connect(fig, tooltip)

&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt; mpld3.fig_to_html(fig)
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
I like this workflow pretty well. It seems less functional than plotly and Bokeh (e.g. it does not look like it you can export the data from the html here), but it is well integrated with Matplotlib, with my blogging style, and does not require a server, oran account. The code outputs html that is self-contained in the body of the html. The smooth integration with Matplotlib means I could have static images in org-mode, and dynamic images in HTML potentially. Overall, this is a nice tool for making interactive plots in blog posts.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-sec-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;&lt;span class="section-number-2"&gt;2&lt;/span&gt; References&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
&lt;h1 class='org-ref-bib-h1'&gt;Bibliography&lt;/h1&gt;
&lt;ul class='org-ref-bib'&gt;&lt;li&gt;&lt;a id="boes-2015-core-cu"&gt;[boes-2015-core-cu] Jacob Boes, Peter Kondratyuk, Chunrong Yin, James, Miller, Andrew Gellman &amp; John Kitchin, Core Level Shifts in Cu-Pd Alloys As a Function of Bulk  Composition and Structure, &lt;i&gt;Surface Science&lt;/i&gt;, &lt;b&gt;640&lt;/b&gt;, 127-132 (2015). &lt;a href="https://doi.org/10.1016/j.susc.2015.02.011"&gt;link&lt;/a&gt;. &lt;a href="https://doi.org/10.1016/j.susc.2015.02.011"&gt;doi&lt;/a&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2016 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2016/02/08/Interactive-figures-in-blog-posts-with-mpld3.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;
]]></content:encoded>
    </item>
    <item>
      <title>Interactive Bokeh plots in HTML</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2016/02/07/Interactive-Bokeh-plots-in-HTML</link>
      <pubDate>Sun, 07 Feb 2016 10:53:45 EST</pubDate>
      <category><![CDATA[plotting]]></category>
      <category><![CDATA[interactive]]></category>
      <category><![CDATA[python]]></category>
      <guid isPermaLink="false">CM9ctWbQgZjxBLQKmokTp2qMm6Y=</guid>
      <description>Interactive Bokeh plots in HTML</description>
      <content:encoded><![CDATA[


&lt;div id="table-of-contents"&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id="text-table-of-contents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#sec-1"&gt;1. The data and code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sec-2"&gt;2. References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
In our last &lt;a href="http://kitchingroup.cheme.cmu.edu/blog/2016/02/06/Interactive-plots-in-HTML-with-Plotly/"&gt;post&lt;/a&gt; we examined the use of &lt;a href="https://plot.ly/"&gt;plotly&lt;/a&gt; to generate interactive plots in HTML. Today we expand the idea, and use &lt;a href="http://bokeh.pydata.org/en/latest/"&gt;Bokeh&lt;/a&gt; . One potential issue with plotly is the need for an account and API-key, some limitations on how many times a graph can be viewed per day (although I should aspire to have my graphs viewed 1000+ times a day!), and who knows what happens to the graphs if plotly ever goes out of business. While the static images we usually use have limited utility, at least they stick around.
&lt;/p&gt;

&lt;p&gt;
So, today we look at &lt;a href="http://bokeh.pydata.org/en/latest/"&gt;Bokeh&lt;/a&gt; which allows you to embed some json data in your HTML, which is made interactive by your browser with more javascript magic. We get straight to the image here so you can see what this is all about. Briefly, this data shows trends (or lack of) in the adsorption energies of some atoms on the atop and fcc sites of several transition metals as a function of adsorbate coverage  &lt;a class='org-ref-reference' href="#xu-2014-probin-cover"&gt;xu-2014-probin-cover&lt;/a&gt;. The code to do this is found &lt;a href="#sec-1"&gt;here&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Using Bokeh does not integrate real smoothly with my blog workflow, which only generates the body of HTML posts. Bokeh needs some javascript injected into the header to work. To get around that, I show the plot in a frame here. You can see a full HTML version here: &lt;a href="/media/2016-02-07-Interactive-Bokeh-plots-in-HTML/bokeh-plot.html"&gt;bokeh-plot.html&lt;/a&gt; .
&lt;/p&gt;

&lt;iframe src="/media/2016-02-07-Interactive-Bokeh-plots-in-HTML/bokeh-plot.html#figure" width="800" height="700"&gt;&lt;/iframe&gt;

&lt;a name="figure"&gt;&lt;/a&gt;

&lt;div class="plotdiv" id="359fb6b4-4cda-408d-a6c6-4d38f4885edb"&gt;&lt;/div&gt;



&lt;p&gt;
This is somewhat similar to the plotly concept. The data is embedded in the html in this case, which is different. For very large plots, I actually had some trouble exporting the blog post (it was taking a long time to export and I killed it)! I suspect that is a limitation of the org-mode exporter though, because I could save the html files from Python and view them fine. I also noted that having all the javascript in the org-file make font-lock work very slow. It would be better to generate that only on export.
&lt;/p&gt;

&lt;p&gt;
Note to make this work, we need these lines in our HTML header:
&lt;/p&gt;
&lt;pre class="example"&gt;
#+HTML_HEAD: &amp;lt;link rel="stylesheet" href="http://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.css" type="text/css" /&amp;gt;
#+HTML_HEAD: &amp;lt;script type="text/javascript" src="http://cdn.pydata.org/bokeh/release/bokeh-0.11.1.min.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
Since we do not host those locally, if they ever disappear, our plots will not show ;(
&lt;/p&gt;

&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;a id="ID-47C13034-DBD8-4154-8004-5CABEA2CF1D2" name="ID-47C13034-DBD8-4154-8004-5CABEA2CF1D2"&gt;&lt;/a&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; The data and code&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
We will get the data from our paper on coverage dependent adsorption energies &lt;a class='org-ref-reference' href="#xu-2014-probin-cover"&gt;xu-2014-probin-cover&lt;/a&gt;. There are some data rich figures there that would benefit from some interactivity. You can get the data here: &lt;a href="http://pubs.acs.org/doi/suppl/10.1021/jp508805h"&gt;http://pubs.acs.org/doi/suppl/10.1021/jp508805h&lt;/a&gt; . Extract out the supporting-information.org and energies.json file to follow here. We will make Figure 2a in the SI document here, and make it interactive with hover tooltips.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python" id="bokeh-plot"&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; json

&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; collections &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; OrderedDict
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; bokeh &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; mpl
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; bokeh.plotting &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; *
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; bokeh.models &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; HoverTool
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; bokeh.embed &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; components

&lt;span style="color: #0000FF;"&gt;with&lt;/span&gt; &lt;span style="color: #006FE0;"&gt;open&lt;/span&gt;(&lt;span style="color: #008000;"&gt;'/users/jkitchin/Desktop/energies.json'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'r'&lt;/span&gt;) &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; f:
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;data&lt;/span&gt; = json.load(f)


&lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;color for metal&lt;/span&gt;
&lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;letter symbol for adsorbate&lt;/span&gt;
&lt;span style="color: #BA36A5;"&gt;colors&lt;/span&gt; = {&lt;span style="color: #008000;"&gt;'Cu'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Orange'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Ag'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Silver'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Au'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Yellow'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Pd'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Green'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Pt'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Red'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Rh'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Blue'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #008000;"&gt;'Ir'&lt;/span&gt;:&lt;span style="color: #008000;"&gt;'Purple'&lt;/span&gt;}

&lt;span style="color: #BA36A5;"&gt;all_ads&lt;/span&gt; = [&lt;span style="color: #008000;"&gt;'O'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'S'&lt;/span&gt;]

&lt;span style="color: #BA36A5;"&gt;TOOLS&lt;/span&gt;=&lt;span style="color: #008000;"&gt;"crosshair,pan,wheel_zoom,box_zoom,reset,hover,previewsave"&lt;/span&gt;
&lt;span style="color: #BA36A5;"&gt;p&lt;/span&gt; = figure(title=&lt;span style="color: #008000;"&gt;"Correlation between atop and fcc sites"&lt;/span&gt;, tools=TOOLS)

&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; metal &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; [&lt;span style="color: #008000;"&gt;'Rh'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'Pd'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'Cu'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'Ag'&lt;/span&gt;]:
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; adsorbate &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; all_ads:
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;E1&lt;/span&gt;, &lt;span style="color: #BA36A5;"&gt;E2&lt;/span&gt; = [], []
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; coverage &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; &lt;span style="color: #008000;"&gt;'0.25'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'0.5'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'0.75'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'1.0'&lt;/span&gt;:
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #0000FF;"&gt;if&lt;/span&gt; (&lt;span style="color: #006FE0;"&gt;isinstance&lt;/span&gt;(data[metal][adsorbate][&lt;span style="color: #008000;"&gt;'ontop'&lt;/span&gt;][coverage], &lt;span style="color: #006FE0;"&gt;float&lt;/span&gt;) &lt;span style="color: #0000FF;"&gt;and&lt;/span&gt;
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #006FE0;"&gt;isinstance&lt;/span&gt;(data[metal][adsorbate][&lt;span style="color: #008000;"&gt;'fcc'&lt;/span&gt;][coverage], &lt;span style="color: #006FE0;"&gt;float&lt;/span&gt;)):
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   E1.append(data[metal][adsorbate][&lt;span style="color: #008000;"&gt;'ontop'&lt;/span&gt;][coverage])
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   E2.append(data[metal][adsorbate][&lt;span style="color: #008000;"&gt;'fcc'&lt;/span&gt;][coverage])
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;labels&lt;/span&gt; = [&lt;span style="color: #008000;"&gt;'{0}-{1} {2} ML'&lt;/span&gt;.&lt;span style="color: #006FE0;"&gt;format&lt;/span&gt;(metal, adsorbate, x)
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; x &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; [&lt;span style="color: #008000;"&gt;'0.25'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'0.5'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'0.75'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'1.0'&lt;/span&gt;]]
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   p.line(&lt;span style="color: #008000;"&gt;'x'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'y'&lt;/span&gt;, color=colors[metal],
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  source=ColumnDataSource(data={&lt;span style="color: #008000;"&gt;'x'&lt;/span&gt;: E1,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'y'&lt;/span&gt;: E2,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'label'&lt;/span&gt;: labels}))
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   p.circle(&lt;span style="color: #008000;"&gt;'x'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'y'&lt;/span&gt;, color=colors[metal],
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  source=ColumnDataSource(data={&lt;span style="color: #008000;"&gt;'x'&lt;/span&gt;: E1,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'y'&lt;/span&gt;: E2,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;'label'&lt;/span&gt;: labels}))


&lt;span style="color: #BA36A5;"&gt;hover&lt;/span&gt; =p.select({&lt;span style="color: #008000;"&gt;'type'&lt;/span&gt;: HoverTool})
&lt;span style="color: #BA36A5;"&gt;hover.tooltips&lt;/span&gt; = OrderedDict([(&lt;span style="color: #008000;"&gt;"(atop,fcc)"&lt;/span&gt;, &lt;span style="color: #008000;"&gt;"(@x, @y)"&lt;/span&gt;),
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt; (&lt;span style="color: #008000;"&gt;"label"&lt;/span&gt;, &lt;span style="color: #008000;"&gt;"@label"&lt;/span&gt;)])

&lt;span style="color: #BA36A5;"&gt;p.xaxis.axis_label&lt;/span&gt; = &lt;span style="color: #008000;"&gt;'Adsorption energy on the atop site'&lt;/span&gt;
&lt;span style="color: #BA36A5;"&gt;p.yaxis.axis_label&lt;/span&gt; = &lt;span style="color: #008000;"&gt;'Adsorption energy on the fcc site'&lt;/span&gt;

&lt;span style="color: #BA36A5;"&gt;script&lt;/span&gt;, &lt;span style="color: #BA36A5;"&gt;div&lt;/span&gt; = components(p)
&lt;span style="color: #BA36A5;"&gt;script&lt;/span&gt; = &lt;span style="color: #008000;"&gt;'\n'&lt;/span&gt;.join([&lt;span style="color: #008000;"&gt;'#+HTML_HEAD_EXTRA: '&lt;/span&gt; + line &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; line &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; script.split(&lt;span style="color: #008000;"&gt;'\n'&lt;/span&gt;)])

&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt; &lt;span style="color: #008000;"&gt;'''{script}&lt;/span&gt;

&lt;span style="color: #008000;"&gt;#+BEGIN_HTML&lt;/span&gt;
&lt;span style="color: #008000;"&gt;&amp;lt;a name="figure"&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span style="color: #008000;"&gt;{div}&lt;/span&gt;
&lt;span style="color: #008000;"&gt;#+END_HTML&lt;/span&gt;
&lt;span style="color: #008000;"&gt;'''&lt;/span&gt;.&lt;span style="color: #006FE0;"&gt;format&lt;/span&gt;(script=script, div=div)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;div id="outline-container-sec-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;&lt;span class="section-number-2"&gt;2&lt;/span&gt; References&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
&lt;h1 class='org-ref-bib-h1'&gt;Bibliography&lt;/h1&gt;
&lt;ul class='org-ref-bib'&gt;&lt;li&gt;&lt;a id="xu-2014-probin-cover"&gt;[xu-2014-probin-cover] Zhongnan Xu &amp; John Kitchin, Probing the Coverage Dependence of Site and Adsorbate  Configurational Correlations on (111) Surfaces of Late  Transition Metals, &lt;i&gt;J. Phys. Chem. C&lt;/i&gt;, &lt;b&gt;118(44)&lt;/b&gt;, 25597-25602 (2014). &lt;a href="https://doi.org/10.1021/jp508805h"&gt;link&lt;/a&gt;. &lt;a href="https://doi.org/10.1021/jp508805h"&gt;doi&lt;/a&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2016 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2016/02/07/Interactive-Bokeh-plots-in-HTML.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;
]]></content:encoded>
    </item>
    <item>
      <title>Interactive plots in HTML with Plotly</title>
      <link>https://kitchingroup.cheme.cmu.edu/blog/2016/02/06/Interactive-plots-in-HTML-with-Plotly</link>
      <pubDate>Sat, 06 Feb 2016 12:44:53 EST</pubDate>
      <category><![CDATA[plotting]]></category>
      <category><![CDATA[interactive]]></category>
      <category><![CDATA[python]]></category>
      <guid isPermaLink="false">vqXGA3yIAkOdEnJx99Y-RLNzOSQ=</guid>
      <description>Interactive plots in HTML with Plotly</description>
      <content:encoded><![CDATA[



&lt;p&gt;
Most of the plots in this blog are static. Today, I look at making them interactive. I will use &lt;a href="https://plot.ly"&gt;https://plot.ly&lt;/a&gt; for this. I want to use some data from a paper we published on the relative stabilities of oxide polymorphs &lt;a class='org-ref-reference' href="#mehta-2015-ident-poten"&gt;mehta-2015-ident-poten&lt;/a&gt;. We will make an interactive figure showing the relative stabilities of the RuO&lt;sub&gt;2&lt;/sub&gt; 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!
&lt;/p&gt;

&lt;iframe id="igraph" scrolling="no" style="border:none;"seamless="seamless" src="https://plot.ly/~jkitchin/4.embed" height="525" width="100%"&gt;&lt;/iframe&gt;


&lt;p&gt;
We get our data source here: &lt;a href="http://pubs.acs.org/doi/suppl/10.1021/am4059149/suppl_file/am4059149_si_001.pdf"&gt;http://pubs.acs.org/doi/suppl/10.1021/am4059149/suppl_file/am4059149_si_001.pdf&lt;/a&gt; .
&lt;/p&gt;

&lt;p&gt;
Now, we extract the data files:
&lt;/p&gt;
&lt;div class="org-src-container"&gt;

&lt;pre class="src src-sh"&gt;pdftk ~/Desktop/am4059149_si_001.pdf  unpack_files
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
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 RuO&lt;sub&gt;2&lt;/sub&gt; for several polymorphs.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python" id="ruo2-html"&gt;&lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;coding=utf-8&lt;/span&gt;

&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; plotly.plotly &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; py
&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; plotly.graph_objs &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; go
&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; plotly.tools &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; tls
&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; numpy &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; np

&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; json
&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; matplotlib.pyplot &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; plt
&lt;span style="color: #0000FF;"&gt;from&lt;/span&gt; ase.utils.eos &lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; EquationOfState
&lt;span style="color: #0000FF;"&gt;with&lt;/span&gt; &lt;span style="color: #006FE0;"&gt;open&lt;/span&gt;(&lt;span style="color: #008000;"&gt;'supporting-information.json'&lt;/span&gt;, &lt;span style="color: #008000;"&gt;'rb'&lt;/span&gt;) &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; f:
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;d&lt;/span&gt; = json.loads(f.read())

&lt;span style="color: #BA36A5;"&gt;BO2&lt;/span&gt; = &lt;span style="color: #008000;"&gt;'RuO2'&lt;/span&gt;
&lt;span style="color: #BA36A5;"&gt;xc&lt;/span&gt; = &lt;span style="color: #008000;"&gt;'PBE'&lt;/span&gt;

&lt;span style="color: #BA36A5;"&gt;layout&lt;/span&gt; = go.Layout(title=&lt;span style="color: #008000;"&gt;'Energy vs. Volume for RuO&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; polymorphs'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  xaxis=&lt;span style="color: #006FE0;"&gt;dict&lt;/span&gt;(title=&lt;span style="color: #008000;"&gt;'Volume (&amp;#197;&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;)'&lt;/span&gt;),
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  yaxis=&lt;span style="color: #006FE0;"&gt;dict&lt;/span&gt;(title=&lt;span style="color: #008000;"&gt;'Energy (eV)'&lt;/span&gt;))

&lt;span style="color: #BA36A5;"&gt;traces&lt;/span&gt; = []

&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; polymorph &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt; [&lt;span style="color: #008000;"&gt;'rutile'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;'anatase'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;'brookite'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;'columbite'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;'pyrite'&lt;/span&gt;,&lt;span style="color: #008000;"&gt;'fluorite'&lt;/span&gt;]:

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #8D8D84;"&gt;# &lt;/span&gt;&lt;span style="color: #8D8D84; font-style: italic;"&gt;number of atoms in the unit cell - used to normalize&lt;/span&gt;
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;natoms&lt;/span&gt;= &lt;span style="color: #006FE0;"&gt;len&lt;/span&gt;(d[BO2][polymorph][xc][&lt;span style="color: #008000;"&gt;'EOS'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'calculations'&lt;/span&gt;]
                [0][&lt;span style="color: #008000;"&gt;'atoms'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'symbols'&lt;/span&gt;])
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;volumes&lt;/span&gt; = [entry[&lt;span style="color: #008000;"&gt;'data'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'volume'&lt;/span&gt;]*3./natoms &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; entry &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;
               d[BO2][polymorph][xc][&lt;span style="color: #008000;"&gt;'EOS'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'calculations'&lt;/span&gt;]]
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;energies&lt;/span&gt; =  [entry[&lt;span style="color: #008000;"&gt;'data'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'total_energy'&lt;/span&gt;]*3./natoms &lt;span style="color: #0000FF;"&gt;for&lt;/span&gt; entry &lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;
                 d[BO2][polymorph][xc][&lt;span style="color: #008000;"&gt;'EOS'&lt;/span&gt;][&lt;span style="color: #008000;"&gt;'calculations'&lt;/span&gt;]]

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;trace&lt;/span&gt; = go.Scatter(x=np.array(volumes),
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  y=np.array(energies),
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  mode=&lt;span style="color: #008000;"&gt;'lines+markers'&lt;/span&gt;,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  name=polymorph,
&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;  text=polymorph)

&lt;span style="color: #9B9B9B; background-color: #EDEDED;"&gt; &lt;/span&gt;   &lt;span style="color: #BA36A5;"&gt;traces&lt;/span&gt; += [trace]

&lt;span style="color: #BA36A5;"&gt;fig&lt;/span&gt; = go.Figure(data=traces, layout=layout)
&lt;span style="color: #BA36A5;"&gt;plot_url&lt;/span&gt; = py.plot(fig, filename=&lt;span style="color: #008000;"&gt;'ruo2-2'&lt;/span&gt;)

&lt;span style="color: #0000FF;"&gt;print&lt;/span&gt; tls.get_embed(plot_url)
&lt;/pre&gt;
&lt;/div&gt;




&lt;p&gt;
Pretty nice, now we should have an interactive plot in our browser with the data points labeled with tags, zooming, etc&amp;#x2026; 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.
&lt;/p&gt;

&lt;div id="outline-container-sec-1" class="outline-2"&gt;
&lt;h2 id="sec-1"&gt;&lt;span class="section-number-2"&gt;1&lt;/span&gt; Using Plotly yourself&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-1"&gt;
&lt;p&gt;
First, go to &lt;a href="https://plot.ly"&gt;https://plot.ly&lt;/a&gt; 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.
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt; plotly.tools &lt;span style="color: #0000FF;"&gt;as&lt;/span&gt; tls
tls.set_credentials_file(username=&lt;span style="color: #008000;"&gt;'jkitchin'&lt;/span&gt;, api_key=&lt;span style="color: #008000;"&gt;'xxxxxxx'&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-sec-2" class="outline-2"&gt;
&lt;h2 id="sec-2"&gt;&lt;span class="section-number-2"&gt;2&lt;/span&gt; References&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-2"&gt;
&lt;p&gt;
&lt;h1 class='org-ref-bib-h1'&gt;Bibliography&lt;/h1&gt;
&lt;ul class='org-ref-bib'&gt;&lt;li&gt;&lt;a id="mehta-2015-ident-poten"&gt;[mehta-2015-ident-poten] Prateek Mehta, Paul Salvador &amp; John Kitchin, Identifying Potential \ceBO2 Oxide Polymorphs for Epitaxial  Growth Candidates, &lt;i&gt;ACS Appl. Mater. Interfaces&lt;/i&gt;, &lt;b&gt;6(5)&lt;/b&gt;, 3630-3639 (2015). &lt;a href="https://doi.org/10.1021/am4059149"&gt;link&lt;/a&gt;. &lt;a href="https://doi.org/10.1021/am4059149"&gt;doi&lt;/a&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Copyright (C) 2016 by John Kitchin. See the &lt;a href="/copying.html"&gt;License&lt;/a&gt; for information about copying.&lt;p&gt;&lt;p&gt;&lt;a href="/org/2016/02/06/Interactive-plots-in-HTML-with-Plotly.org"&gt;org-mode source&lt;/a&gt;&lt;p&gt;&lt;p&gt;Org-mode version = 8.2.10&lt;/p&gt;
]]></content:encoded>
    </item>
  </channel>
</rss>
