<?xml version="1.0" encoding="utf-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us">
    <generator uri="https://gohugo.io/" version="0.152.2">Hugo</generator><title type="html"><![CDATA[Academia on Blog]]></title>
    
    
    
            <link href="https://blog.scientific-python.org/tags/academia/" rel="alternate" type="text/html" title="html" />
            <link href="https://blog.scientific-python.org/tags/academia/atom.xml" rel="self" type="application/atom" title="atom" />
    <updated>2026-04-04T04:32:36+00:00</updated>
    
    
    
    
        <id>https://blog.scientific-python.org/tags/academia/</id>
    
        
        <entry>
            <title type="html"><![CDATA[Art from UNC BIOL222]]></title>
            <link href="https://blog.scientific-python.org/matplotlib/unc-biol222/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
                <link href="https://blog.scientific-python.org/matplotlib/ipcc-sr15/?utm_source=atom_feed" rel="related" type="text/html" title="Figures in the IPCC Special Report on Global Warming of 1.5°C (SR15)" />
                <link href="https://blog.scientific-python.org/matplotlib/emoji-mosaic-art/?utm_source=atom_feed" rel="related" type="text/html" title="Emoji Mosaic Art" />
                <link href="https://blog.scientific-python.org/matplotlib/warming-stripes/?utm_source=atom_feed" rel="related" type="text/html" title="Creating the Warming Stripes in Matplotlib" />
                <link href="https://blog.scientific-python.org/matplotlib/using-matplotlib-to-advocate-for-postdocs/?utm_source=atom_feed" rel="related" type="text/html" title="Using Matplotlib to Advocate for Postdocs" />
                <link href="https://blog.scientific-python.org/matplotlib/book/?utm_source=atom_feed" rel="related" type="text/html" title="Newly released open access book" />
            
                <id>https://blog.scientific-python.org/matplotlib/unc-biol222/</id>
            
            
            <published>2021-11-19T08:46:00-08:00</published>
            <updated>2021-11-19T08:46:00-08:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>UNC BIOL222: Art created with Matplotlib</blockquote><p>As part of the University of North Carolina BIOL222 class, <a href="https://twitter.com/tylikcat">Dr. Catherine Kehl</a> asked her students to &ldquo;use <code>matplotlib.pyplot</code> to make art.&rdquo; BIOL222 is Introduction to Programming, aimed at students with no programming background. The emphasis is on practical, hands-on active learning.</p>
<p>The students completed the assignment with festive enthusiasm around Halloween. Here are some great examples:</p>
<p>Harris Davis showed an affinity for pumpkins, opting to go 3D!
<img src="/matplotlib/unc-biol222/pumpkin.png" alt="3D Pumpkin"></p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="c1"># get library for 3d plotting</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">mpl_toolkits.mplot3d</span> <span class="kn">import</span> <span class="n">Axes3D</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># make a pumpkin :)</span>
</span></span><span class="line"><span class="cl"><span class="n">rho</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="mi">32</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">theta</span><span class="p">,</span> <span class="n">phi</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">rho</span><span class="p">,</span> <span class="n">rho</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span><span class="p">,</span> <span class="n">R</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span>
</span></span><span class="line"><span class="cl"><span class="n">X</span> <span class="o">=</span> <span class="p">(</span><span class="n">R</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">phi</span><span class="p">))</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Y</span> <span class="o">=</span> <span class="p">(</span><span class="n">R</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">phi</span><span class="p">))</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Z</span> <span class="o">=</span> <span class="n">r</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">phi</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># make the stem</span>
</span></span><span class="line"><span class="cl"><span class="n">theta1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="mi">90</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">r1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">T1</span><span class="p">,</span> <span class="n">R1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">theta1</span><span class="p">,</span> <span class="n">r1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">X1</span> <span class="o">=</span> <span class="n">R1</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">T1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Y1</span> <span class="o">=</span> <span class="n">R1</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">T1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Z1</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">X1</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">Y1</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">Z1</span><span class="p">[</span><span class="n">Z1</span> <span class="o">&lt;</span> <span class="mf">0.3</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
</span></span><span class="line"><span class="cl"><span class="n">Z1</span><span class="p">[</span><span class="n">Z1</span> <span class="o">&gt;</span> <span class="mf">0.7</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">nan</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Display the pumpkin &amp; stem</span>
</span></span><span class="line"><span class="cl"><span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">gca</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="s2">&#34;3d&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_xlim3d</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_ylim3d</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_zlim3d</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">plot_surface</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;tab:orange&#34;</span><span class="p">,</span> <span class="n">rstride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">cstride</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">plot_surface</span><span class="p">(</span><span class="n">X1</span><span class="p">,</span> <span class="n">Y1</span><span class="p">,</span> <span class="n">Z1</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;tab:green&#34;</span><span class="p">,</span> <span class="n">rstride</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">cstride</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></span></span></code></pre>
</div>
<p>Bryce Desantis stuck to the biological theme and demonstrated <a href="https://en.wikipedia.org/wiki/Fractal">fractal</a> art.
<img src="/matplotlib/unc-biol222/leaf.png" alt="Bryce Fern"></p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Barnsley&#39;s Fern - Fractal; en.wikipedia.org/wiki/Barnsley_…</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># functions for each part of fern:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># stem</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">stem</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.16</span> <span class="o">*</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># smaller leaflets</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">smallLeaf</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="mf">0.85</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mf">0.04</span> <span class="o">*</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.04</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mf">0.85</span> <span class="o">*</span> <span class="n">y</span> <span class="o">+</span> <span class="mf">1.6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># large left leaflets</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">leftLarge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="mf">0.2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">-</span> <span class="mf">0.26</span> <span class="o">*</span> <span class="n">y</span><span class="p">,</span> <span class="mf">0.23</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mf">0.22</span> <span class="o">*</span> <span class="n">y</span> <span class="o">+</span> <span class="mf">1.6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># large right leftlets</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">rightLarge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(</span><span class="o">-</span><span class="mf">0.15</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mf">0.28</span> <span class="o">*</span> <span class="n">y</span><span class="p">,</span> <span class="mf">0.26</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mf">0.24</span> <span class="o">*</span> <span class="n">y</span> <span class="o">+</span> <span class="mf">0.44</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">componentFunctions</span> <span class="o">=</span> <span class="p">[</span><span class="n">stem</span><span class="p">,</span> <span class="n">smallLeaf</span><span class="p">,</span> <span class="n">leftLarge</span><span class="p">,</span> <span class="n">rightLarge</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># number of data points and frequencies for parts of fern generated:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># lists with all 75000 datapoints</span>
</span></span><span class="line"><span class="cl"><span class="n">datapoints</span> <span class="o">=</span> <span class="mi">75000</span>
</span></span><span class="line"><span class="cl"><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="n">datapointsX</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">datapointsY</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># For 75,000 datapoints</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">datapoints</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">FrequencyFunction</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">componentFunctions</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="p">[</span><span class="mf">0.01</span><span class="p">,</span> <span class="mf">0.85</span><span class="p">,</span> <span class="mf">0.07</span><span class="p">,</span> <span class="mf">0.07</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">    <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">FrequencyFunction</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">datapointsX</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">datapointsY</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Scatter plot &amp; scaled down to 0.1 to show more definition:</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">datapointsX</span><span class="p">,</span> <span class="n">datapointsY</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;g&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Title of Figure</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">&#34;Barnsley&#39;s Fern - Assignment 3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Changing background color</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">axes</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_facecolor</span><span class="p">(</span><span class="s2">&#34;#d8d7bf&#34;</span><span class="p">)</span></span></span></code></pre>
</div>
<p>Grace Bell got a little trippy with this rotationally semetric art. It&rsquo;s pretty cool how she captured mouse events. It reminds us of a flower. What do you see?
<img src="/matplotlib/unc-biol222/rotations.png" alt="Rotations"></p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib.tri</span> <span class="kn">import</span> <span class="n">Triangulation</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib.patches</span> <span class="kn">import</span> <span class="n">Polygon</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># I found this sample code online and manipulated it to make the art piece!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># was interested in because it combined what we used for functions as well as what we used for plotting with (x,y)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">update_polygon</span><span class="p">(</span><span class="n">tri</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">tri</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">points</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">points</span> <span class="o">=</span> <span class="n">triang</span><span class="o">.</span><span class="n">triangles</span><span class="p">[</span><span class="n">tri</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">xs</span> <span class="o">=</span> <span class="n">triang</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">points</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">ys</span> <span class="o">=</span> <span class="n">triang</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">points</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">polygon</span><span class="o">.</span><span class="n">set_xy</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">column_stack</span><span class="p">([</span><span class="n">xs</span><span class="p">,</span> <span class="n">ys</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">on_mouse_move</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">inaxes</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">tri</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">tri</span> <span class="o">=</span> <span class="n">trifinder</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">xdata</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">ydata</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">update_polygon</span><span class="p">(</span><span class="n">tri</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;In triangle </span><span class="si">{</span><span class="n">tri</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">event</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># this is the info that creates the angles</span>
</span></span><span class="line"><span class="cl"><span class="n">n_angles</span> <span class="o">=</span> <span class="mi">14</span>
</span></span><span class="line"><span class="cl"><span class="n">n_radii</span> <span class="o">=</span> <span class="mi">7</span>
</span></span><span class="line"><span class="cl"><span class="n">min_radius</span> <span class="o">=</span> <span class="mf">0.1</span>  <span class="c1"># the radius of the middle circle can move with this variable</span>
</span></span><span class="line"><span class="cl"><span class="n">radii</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">min_radius</span><span class="p">,</span> <span class="mf">0.95</span><span class="p">,</span> <span class="n">n_radii</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">angles</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">n_angles</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">angles</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">angles</span><span class="p">[</span><span class="o">...</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">],</span> <span class="n">n_radii</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">angles</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">]</span> <span class="o">+=</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="n">n_angles</span>
</span></span><span class="line"><span class="cl"><span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">radii</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">angles</span><span class="p">))</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">y</span> <span class="o">=</span> <span class="p">(</span><span class="n">radii</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">angles</span><span class="p">))</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">triang</span> <span class="o">=</span> <span class="n">Triangulation</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">triang</span><span class="o">.</span><span class="n">set_mask</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">np</span><span class="o">.</span><span class="n">hypot</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">triang</span><span class="o">.</span><span class="n">triangles</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span> <span class="n">y</span><span class="p">[</span><span class="n">triang</span><span class="o">.</span><span class="n">triangles</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;</span> <span class="n">min_radius</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">trifinder</span> <span class="o">=</span> <span class="n">triang</span><span class="o">.</span><span class="n">get_trifinder</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">subplot_kw</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;aspect&#34;</span><span class="p">:</span> <span class="s2">&#34;equal&#34;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">triplot</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">triang</span><span class="p">,</span> <span class="s2">&#34;y+-&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>  <span class="c1"># made the color of the plot yellow and there are &#34;+&#34; for the data points but you can&#39;t really see them because of the lines crossing</span>
</span></span><span class="line"><span class="cl"><span class="n">polygon</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]],</span> <span class="n">facecolor</span><span class="o">=</span><span class="s2">&#34;y&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">update_polygon</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">add_patch</span><span class="p">(</span><span class="n">polygon</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">fig</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s2">&#34;motion_notify_event&#34;</span><span class="p">,</span> <span class="n">on_mouse_move</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></span></span></code></pre>
</div>
<p>As a bonus, did you like that fox in the banner? That was created (and well documented) by Emily Foster!</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">axis</span><span class="p">(</span><span class="s2">&#34;off&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># head</span>
</span></span><span class="line"><span class="cl"><span class="n">xhead</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">yhead</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.007</span> <span class="o">*</span> <span class="p">(</span><span class="n">xhead</span> <span class="o">*</span> <span class="n">xhead</span><span class="p">)</span> <span class="o">+</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xhead</span><span class="p">,</span> <span class="n">yhead</span><span class="p">,</span> <span class="s2">&#34;darkorange&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># outer ears</span>
</span></span><span class="line"><span class="cl"><span class="n">xearL</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mf">45.8</span><span class="p">,</span> <span class="o">-</span><span class="mi">9</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">yearL</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.08</span> <span class="o">*</span> <span class="p">(</span><span class="n">xearL</span> <span class="o">*</span> <span class="n">xearL</span><span class="p">)</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">xearL</span> <span class="o">+</span> <span class="mi">70</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">xearR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span> <span class="mf">45.8</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">yearR</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.08</span> <span class="o">*</span> <span class="p">(</span><span class="n">xearR</span> <span class="o">*</span> <span class="n">xearR</span><span class="p">)</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">xearR</span> <span class="o">+</span> <span class="mi">70</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xearL</span><span class="p">,</span> <span class="n">yearL</span><span class="p">,</span> <span class="s2">&#34;black&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xearR</span><span class="p">,</span> <span class="n">yearR</span><span class="p">,</span> <span class="s2">&#34;black&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># inner ears</span>
</span></span><span class="line"><span class="cl"><span class="n">xinL</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mf">41.1</span><span class="p">,</span> <span class="o">-</span><span class="mf">13.7</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">yinL</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.08</span> <span class="o">*</span> <span class="p">(</span><span class="n">xinL</span> <span class="o">*</span> <span class="n">xinL</span><span class="p">)</span> <span class="o">-</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">xinL</span> <span class="o">+</span> <span class="mi">59</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">xinR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mf">13.7</span><span class="p">,</span> <span class="mf">41.1</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">yinR</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.08</span> <span class="o">*</span> <span class="p">(</span><span class="n">xinR</span> <span class="o">*</span> <span class="n">xinR</span><span class="p">)</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">xinR</span> <span class="o">+</span> <span class="mi">59</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xinL</span><span class="p">,</span> <span class="n">yinL</span><span class="p">,</span> <span class="s2">&#34;salmon&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xinR</span><span class="p">,</span> <span class="n">yinR</span><span class="p">,</span> <span class="s2">&#34;salmon&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># bottom of face</span>
</span></span><span class="line"><span class="cl"><span class="n">xfaceL</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mf">49.6</span><span class="p">,</span> <span class="o">-</span><span class="mi">14</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">xfaceR</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">14</span><span class="p">,</span> <span class="mf">49.3</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">xfaceM</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mi">14</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xfaceL</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">xfaceL</span><span class="p">),</span> <span class="s2">&#34;darkorange&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xfaceR</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">xfaceR</span><span class="p">),</span> <span class="s2">&#34;darkorange&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xfaceM</span><span class="p">,</span> <span class="nb">abs</span><span class="p">(</span><span class="n">xfaceM</span><span class="p">),</span> <span class="s2">&#34;black&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># nose</span>
</span></span><span class="line"><span class="cl"><span class="n">xnose</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="o">-</span><span class="mi">14</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ynose</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.03</span> <span class="o">*</span> <span class="p">(</span><span class="n">xnose</span> <span class="o">*</span> <span class="n">xnose</span><span class="p">)</span> <span class="o">+</span> <span class="mi">20</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xnose</span><span class="p">,</span> <span class="n">ynose</span><span class="p">,</span> <span class="s2">&#34;black&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># whiskers</span>
</span></span><span class="line"><span class="cl"><span class="n">xwhiskR</span> <span class="o">=</span> <span class="p">[</span><span class="mi">50</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mf">49.3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">xwhiskL</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span> <span class="o">-</span><span class="mi">70</span><span class="p">,</span> <span class="o">-</span><span class="mi">55</span><span class="p">,</span> <span class="o">-</span><span class="mi">70</span><span class="p">,</span> <span class="o">-</span><span class="mi">55</span><span class="p">,</span> <span class="o">-</span><span class="mi">70</span><span class="p">,</span> <span class="o">-</span><span class="mf">49.3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">ywhisk</span> <span class="o">=</span> <span class="p">[</span><span class="mf">82.6</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mf">49.3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xwhiskR</span><span class="p">,</span> <span class="n">ywhisk</span><span class="p">,</span> <span class="s2">&#34;darkorange&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xwhiskL</span><span class="p">,</span> <span class="n">ywhisk</span><span class="p">,</span> <span class="s2">&#34;darkorange&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># eyes</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;black&#34;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&#34;o&#34;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="o">-</span><span class="mi">20</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;black&#34;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&#34;o&#34;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">15</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="mi">22</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;white&#34;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&#34;o&#34;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="o">-</span><span class="mi">18</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">&#34;white&#34;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&#34;o&#34;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span></span></span></code></pre>
</div>
<p>We look forward to seeing these students continue in their plotting and scientific adventures!</p>
]]></content>
            
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="taxonomy:Tags" term="art" label="art" />
                             
                                <category scheme="taxonomy:Tags" term="academia" label="academia" />
                             
                                <category scheme="taxonomy:Tags" term="matplotlib" label="matplotlib" />
                            
                        
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Figures in the IPCC Special Report on Global Warming of 1.5°C (SR15)]]></title>
            <link href="https://blog.scientific-python.org/matplotlib/ipcc-sr15/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
                <link href="https://blog.scientific-python.org/matplotlib/warming-stripes/?utm_source=atom_feed" rel="related" type="text/html" title="Creating the Warming Stripes in Matplotlib" />
                <link href="https://blog.scientific-python.org/matplotlib/codeswitching-visualization/?utm_source=atom_feed" rel="related" type="text/html" title="Visualizing Code-Switching with Step Charts" />
                <link href="https://blog.scientific-python.org/matplotlib/elementary-cellular-automata/?utm_source=atom_feed" rel="related" type="text/html" title="Elementary Cellular Automata" />
                <link href="https://blog.scientific-python.org/matplotlib/animated-fractals/?utm_source=atom_feed" rel="related" type="text/html" title="Animate Your Own Fractals in Python with Matplotlib" />
                <link href="https://blog.scientific-python.org/matplotlib/animated-polar-plot/?utm_source=atom_feed" rel="related" type="text/html" title="Animated polar plot with oceanographic data" />
            
                <id>https://blog.scientific-python.org/matplotlib/ipcc-sr15/</id>
            
            
            <published>2020-12-31T08:32:45+01:00</published>
            <updated>2020-12-31T08:32:45+01:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Many figures in the IPCC SR15 were generated using Matplotlib.
The data and open-source notebooks were published to increase the transparency and reproducibility of the analysis.</blockquote><h2 id="background">Background<a class="headerlink" href="#background" title="Link to this heading">#</a></h2>
<figure style="float: right; ">
  <a href="https://www.ipcc.ch/sr15">
  <img src="IPCC-SR15-cover.jpg" style="width: 180px; "/>
  <figcaption style="text-align: center; color: grey; font-size: small">
  Cover of the IPCC SR15</figcaption></a>
</figure>
<p>The IPCC&rsquo;s <em>Special Report on Global Warming of 1.5°C</em> (SR15), published in October 2018,
presented the latest research on anthropogenic climate change.
It was written in response to the 2015 UNFCCC&rsquo;s &ldquo;Paris Agreement&rdquo; of</p>
<blockquote>
<p>holding the increase in the global average temperature to well below 2 °C
above pre-industrial levels and to pursue efforts to limit the temperature increase to 1.5 °C [&hellip;]&quot;.</p>
</blockquote>
<p>cf. <a href="https://unfccc.int/process-and-meetings/the-paris-agreement/the-paris-agreement">Article 2.1.a of the Paris Agreement</a></p>
<p>As part of the SR15 assessment, an ensemble of quantitative, model-based scenarios
was compiled to underpin the scientific analysis.
Many of the headline statements widely reported by media
are based on this scenario ensemble, including the finding that</p>
<blockquote>
<p>global net anthropogenic CO2 emissions decline by ~45% from 2010 levels by 2030</p>
</blockquote>
<p>in all pathways limiting global warming to 1.5°C
(cf. <a href="https://www.ipcc.ch/sr15/chapter/spm/">statement C.1</a> in the <em>Summary For Policymakers</em>).</p>
<h2 id="open-source-notebooks-for-transparency-and-reproducibility-of-the-assessment">Open-source notebooks for transparency and reproducibility of the assessment<a class="headerlink" href="#open-source-notebooks-for-transparency-and-reproducibility-of-the-assessment" title="Link to this heading">#</a></h2>
<p>When preparing the SR15, the authors wanted to go beyond previous reports
not just regarding the scientific rigor and scope of the analysis,
but also establish new standards in terms of openness, transparency and reproducibility.</p>
<p>The scenario ensemble was made accessible via an interactive <em>IAMC 1.5°C Scenario Explorer</em>
(<a href="http://data.ene.iiasa.ac.at/iamc-1.5c-explorer/#/workspaces">link</a>) in line with the
<a href="https://www.go-fair.org/fair-principles/">FAIR principles for scientific data management and stewardship</a>.
The process for compiling, validating and analyzing the scenario ensemble
was described in an open-access manuscript published in <em>Nature Climate Change</em>
(doi: <a href="https://doi.org/10.1038/s41558-018-0317-4">10.1038/s41558-018-0317-4</a>).</p>
<p>In addition, the Jupyter notebooks generating many of the headline statements,
tables and figures (using Matplotlib) were released under an open-source license
to facilitate a better understanding of the analysis
and enable reuse for subsequent research.
The notebooks are available in <a href="https://data.ene.iiasa.ac.at/sr15_scenario_analysis">rendered format</a>
and on <a href="https://github.com/iiasa/ipcc_sr15_scenario_analysis">GitHub</a>.</p>
<figure style="width: 600px ">
  <img src="sr15-fig2.4.png" style="width: 600px; "/>
  <figcaption style="text-align: center; color: grey; font-size: small">
  Figure 2.4 of the IPCC SR15, showing the range of assumptions of socioeconomic drivers<br />
  across the IAMC 1.5°C Scenario Ensemble<br />
  Drawn with Matplotlib, source code available <a href="https://data.ene.iiasa.ac.at/sr15_scenario_analysis/assessment/sr15_2.3.1_range_of_assumptions.html">here</a>
  </figcaption>
</figure>
<figure style="width: 600px ">
  <img src="sr15-fig2.15.png" style="width: 600px; "/>
  <figcaption style="text-align: center; color: grey; font-size: small">
  Figure 2.15 of the IPCC SR15, showing the primary energy development in illustrative pathways<br />
  Drawn with Matplotlib, source code available <a href="https://data.ene.iiasa.ac.at/sr15_scenario_analysis/assessment/sr15_2.4.2.1_primary_energy_marker-scenarios.html">here</a>
  </figcaption>
</figure>
<h2 id="a-package-for-scenario-analysis--visualization">A package for scenario analysis &amp; visualization<a class="headerlink" href="#a-package-for-scenario-analysis--visualization" title="Link to this heading">#</a></h2>
<p>To facilitate reusability of the scripts and plotting utilities
developed for the SR15 analysis, we started the open-source Python package <strong>pyam</strong>
as a toolbox for working with scenarios from integrated-assessment and energy system models.</p>
<p>The package is a wrapper for <a href="https://pandas.pydata.org">pandas</a> and Matplotlib
geared for several data formats commonly used in energy modelling.
<a href="https://pyam-iamc.readthedocs.io">Read the docs!</a></p>
<p><a href="https://pyam-iamc.readthedocs.io"><img src="pyam-header.png"></a></p>
]]></content>
            
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="taxonomy:Tags" term="academia" label="academia" />
                             
                                <category scheme="taxonomy:Tags" term="tutorials" label="tutorials" />
                             
                                <category scheme="taxonomy:Tags" term="matplotlib" label="matplotlib" />
                            
                        
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Creating the Warming Stripes in Matplotlib]]></title>
            <link href="https://blog.scientific-python.org/matplotlib/warming-stripes/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
                <link href="https://blog.scientific-python.org/matplotlib/using-matplotlib-to-advocate-for-postdocs/?utm_source=atom_feed" rel="related" type="text/html" title="Using Matplotlib to Advocate for Postdocs" />
            
                <id>https://blog.scientific-python.org/matplotlib/warming-stripes/</id>
            
            
            <published>2019-11-11T09:21:28+01:00</published>
            <updated>2019-11-11T09:21:28+01:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Ed Hawkins made this impressively simple plot to show how global temperatures have risen since 1880. Here is how to recreate it using Matplotlib.</blockquote><p><img src="/matplotlib/warming-stripes/warming-stripes.png" alt="A horizontal bar divided into stripes with colors ranging from white to shades of blue and shades of red. There is a clear tendency of shades of blue on the left side of the bar, and shades of red on the right side of the bar."></p>
<p>Earth&rsquo;s temperatures are rising and nothing shows this in a simpler,
more approachable graphic than the “Warming Stripes”.
Introduced by Prof. Ed Hawkins they show the temperatures either for
the global average or for your region as colored bars from blue to red for the last 170 years, available at <a href="https://showyourstripes.info">#ShowYourStripes</a>.</p>
<p>The stripes have since become the logo of the <a href="https://scientistsforfuture.org">Scientists for Future</a>.
Here is how you can recreate this yourself using Matplotlib.</p>
<p>We are going to use the <a href="https://www.metoffice.gov.uk/hadobs/hadcrut4/index.html">HadCRUT4</a> dataset, published by the Met Office.
It uses combined sea and land surface temperatures.
The dataset used for the warming stripes is the annual global average.</p>
<p>First, let&rsquo;s import everything we are going to use.
The plot will consist of a bar for each year, colored using a custom
color map.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib.patches</span> <span class="kn">import</span> <span class="n">Rectangle</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib.collections</span> <span class="kn">import</span> <span class="n">PatchCollection</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib.colors</span> <span class="kn">import</span> <span class="n">ListedColormap</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span></span></span></code></pre>
</div>
<p>Then we define our time limits, our reference period for
the neutral color and the range around it for maximum saturation.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">FIRST</span> <span class="o">=</span> <span class="mi">1850</span>
</span></span><span class="line"><span class="cl"><span class="n">LAST</span> <span class="o">=</span> <span class="mi">2018</span>  <span class="c1"># inclusive</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Reference period for the center of the color scale</span>
</span></span><span class="line"><span class="cl"><span class="n">FIRST_REFERENCE</span> <span class="o">=</span> <span class="mi">1971</span>
</span></span><span class="line"><span class="cl"><span class="n">LAST_REFERENCE</span> <span class="o">=</span> <span class="mi">2000</span>
</span></span><span class="line"><span class="cl"><span class="n">LIM</span> <span class="o">=</span> <span class="mf">0.7</span>  <span class="c1"># degrees</span></span></span></code></pre>
</div>
<p>Here we use pandas to read the fixed width text file, only the
first two columns, which are the year and the deviation from the
mean from 1961 to 1990.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="c1"># data from</span>
</span></span><span class="line"><span class="cl"><span class="c1"># https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/time_series/HadCRUT.4.6.0.0.annual_ns_avg.txt</span>
</span></span><span class="line"><span class="cl"><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_fwf</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;HadCRUT.4.6.0.0.annual_ns_avg.txt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">index_col</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">usecols</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">    <span class="n">names</span><span class="o">=</span><span class="p">[</span><span class="s2">&#34;year&#34;</span><span class="p">,</span> <span class="s2">&#34;anomaly&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="n">header</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">anomaly</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">FIRST</span><span class="p">:</span><span class="n">LAST</span><span class="p">,</span> <span class="s2">&#34;anomaly&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">dropna</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">reference</span> <span class="o">=</span> <span class="n">anomaly</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">FIRST_REFERENCE</span><span class="p">:</span><span class="n">LAST_REFERENCE</span><span class="p">]</span><span class="o">.</span><span class="n">mean</span><span class="p">()</span></span></span></code></pre>
</div>
<p>This is our custom colormap, we could also use one of
the <a href="https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html">colormaps</a> that come with <code>matplotlib</code>, e.g. <code>coolwarm</code> or <code>RdBu</code>.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="c1"># the colors in this colormap come from http://colorbrewer2.org</span>
</span></span><span class="line"><span class="cl"><span class="c1"># the 8 more saturated colors from the 9 blues / 9 reds</span>
</span></span><span class="line"><span class="cl"><span class="n">cmap</span> <span class="o">=</span> <span class="n">ListedColormap</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#08306b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#08519c&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#2171b5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#4292c6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#6baed6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#9ecae1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#c6dbef&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#deebf7&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#fee0d2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#fcbba1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#fc9272&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#fb6a4a&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#ef3b2c&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#cb181d&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#a50f15&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;#67000d&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre>
</div>
<p>We create a figure with a single axes object that fills the full area
of the figure and does not have any axis ticks or labels.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">ax</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">add_axes</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_axis_off</span><span class="p">()</span></span></span></code></pre>
</div>
<p>Finally, we create bars for each year, assign the
data, colormap and color limits and add it to the axes.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="c1"># create a collection with a rectangle for each year</span>
</span></span><span class="line"><span class="cl"><span class="n">col</span> <span class="o">=</span> <span class="n">PatchCollection</span><span class="p">([</span><span class="n">Rectangle</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">FIRST</span><span class="p">,</span> <span class="n">LAST</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># set data, colormap and color limits</span>
</span></span><span class="line"><span class="cl"><span class="n">col</span><span class="o">.</span><span class="n">set_array</span><span class="p">(</span><span class="n">anomaly</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">col</span><span class="o">.</span><span class="n">set_cmap</span><span class="p">(</span><span class="n">cmap</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">col</span><span class="o">.</span><span class="n">set_clim</span><span class="p">(</span><span class="n">reference</span> <span class="o">-</span> <span class="n">LIM</span><span class="p">,</span> <span class="n">reference</span> <span class="o">+</span> <span class="n">LIM</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">add_collection</span><span class="p">(</span><span class="n">col</span><span class="p">)</span></span></span></code></pre>
</div>
<p>Make sure the axes limits are correct and save the figure.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="n">FIRST</span><span class="p">,</span> <span class="n">LAST</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">fig</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s2">&#34;warming-stripes.png&#34;</span><span class="p">)</span></span></span></code></pre>
</div>
<p><img src="/matplotlib/warming-stripes/warming-stripes.png" alt="Warming Stripes"></p>
]]></content>
            
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="taxonomy:Tags" term="tutorials" label="tutorials" />
                             
                                <category scheme="taxonomy:Tags" term="academia" label="academia" />
                             
                                <category scheme="taxonomy:Tags" term="matplotlib" label="matplotlib" />
                            
                        
                    
                
            
        </entry>
    
        
        <entry>
            <title type="html"><![CDATA[Using Matplotlib to Advocate for Postdocs]]></title>
            <link href="https://blog.scientific-python.org/matplotlib/using-matplotlib-to-advocate-for-postdocs/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
            
                <id>https://blog.scientific-python.org/matplotlib/using-matplotlib-to-advocate-for-postdocs/</id>
            
            
            <published>2019-10-23T12:43:23-04:00</published>
            <updated>2019-10-23T12:43:23-04:00</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Advocating is all about communicating facts clearly. I used Matplotlib to show the financial struggles of postdocs in the Boston area.</blockquote><p>Postdocs are the <a href="https://en.wikipedia.org/wiki/Postdoctoral_researcher">workers of academia</a>.
They are the main players beyond the majority of scientific papers published in
journals and conferences. Yet, their effort is often not recognized in terms of
salary and benefits.</p>
<p>A few years ago, the NIH has established stipend levels for undergraduate,
predoctoral and postdoctoral trainees and fellows, the so-called NIH guidelines.
Many universities and research institutes currently adopt these guidelines for
deciding how much to pay postdocs.</p>
<p>One of the key problem of the NIH guidelines is that they are established at a
national level. This means that a postdoc in Buffalo is paid the same than a postdoc in Boston,
despite <a href="https://www.mentalfloss.com/article/85668/11-most-affordable-cities-us">Buffalo is one of the most affordable city to live in the USA</a>,
while <a href="https://www.investopedia.com/articles/personal-finance/080916/top-10-most-expensive-cities-us.asp">Boston is one of the most expensive</a>.
Every year, the NIH releases new guidelines, where the stipends are slightly
increased. <strong>Do these adjustments help a postdoc in the Boston area
take home a bit more money?</strong></p>
<p>I have used <a href="https://matplotlib.org">Matplotlib</a> to plot the NIH stipend levels
(y axis) for each year of postdoctoral experience (x axis) for the past 4 years
of NIH guidelines (color). I have also looked at the inflation of years 2017&ndash;2019
and increased the salaries of the previous year by that percentage (dashed lines).
<img src="/matplotlib/using-matplotlib-to-advocate-for-postdocs/gross_salary.png" alt="Plot of the NIH stipend level for postdoc versus the number of years of postdoc experience for every year from 2016 to 2019 inclusive. The x-axis ranges from 0 to 7 years of experience. The y-axis ranges from $45,000 USD to $60,000 USD. The plot also shows how these salaries would increase according to the rate of inflation during the same years. The overall message is that postdoc salaries are adjusted for inflation nationally."></p>
<p>The data revealed that the salaries of 2017 were just increased by the
inflation rate for the most senior postdocs, while junior postdocs (up to 1 year
of experience) received an increase more than 2.5 times of the inflation. In
2018, all salaries were just adjusted to the inflation. In 2019, the increase was
slightly higher than the inflation level. So, overall, every year the NIH makes
sure that the postdoc salaries are, at least, adjusted to the inflation. Great!</p>
<p>As mentioned earlier, there are cities in the US that are more expensive than
others, for example Boston. To partially account for such differences when
looking at the postdoc salaries, I subtracted from each salary the average rent
for a one-bedroom apartment in Boston.
Of course, it also increases every year, but, unfortunately for postdocs, <strong>rent
increases way more than the inflation</strong>. The results are below.
<img src="/matplotlib/using-matplotlib-to-advocate-for-postdocs/gross_salary_minus_rent.png" alt="This plot is similar to the previous plot, but has adjusted the y-axis by subtracting the cost of rent in Boston. Plot of the NIH stipend level for postdocs minus the average rent in Boston versus the number of years of postdoc experience for every year from 2016 to 2019 inclusive. The x-axis ranges from 0 to 7 years of experience. The y-axis ranges from $8,000 USD to $22,000 USD. The overall message is that increases in rent in Boston have outpaced increases in NIH stipends."></p>
<p>It turns out that the best year for postdocs with at least one year of experience
was actually 2016. In the subsequent years, the real estate has eaten larger and
larger portions of the postdoc salary, resulting in 2019-paid postdocs taking home
<strong>20% less money</strong> than 2016-paid postdocs with the same experience.</p>
<p>In the end, life is financially harder and harder for postdocs in the Boston area.
These data should be taken into account by research institutes and universities,
which have the freedom of topping up postdocs&rsquo; salaries to reflect the real cost
of living of different cities.</p>
<p>You can download the Jupyter notebook [here](Postdoc salary Analysis.ipynb).</p>
]]></content>
            
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="taxonomy:Tags" term="academia" label="academia" />
                             
                                <category scheme="taxonomy:Tags" term="matplotlib" label="matplotlib" />
                            
                        
                    
                
            
        </entry>
    
</feed>
