<?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[Art on Blog]]></title>
    
    
    
            <link href="https://blog.scientific-python.org/tags/art/" rel="alternate" type="text/html" title="html" />
            <link href="https://blog.scientific-python.org/tags/art/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/art/</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[Emoji Mosaic Art]]></title>
            <link href="https://blog.scientific-python.org/matplotlib/emoji-mosaic-art/?utm_source=atom_feed" rel="alternate" type="text/html" />
            
                <link href="https://blog.scientific-python.org/matplotlib/draw-all-graphs-of-n-nodes/?utm_source=atom_feed" rel="related" type="text/html" title="Draw all graphs of N nodes" />
                <link href="https://blog.scientific-python.org/matplotlib/matplotlib-cyberpunk-style/?utm_source=atom_feed" rel="related" type="text/html" title="Matplotlib Cyberpunk Style" />
                <link href="https://blog.scientific-python.org/matplotlib/mpl-for-making-diagrams/?utm_source=atom_feed" rel="related" type="text/html" title="Matplotlib for Making Diagrams" />
                <link href="https://blog.scientific-python.org/matplotlib/create-ridgeplots-in-matplotlib/?utm_source=atom_feed" rel="related" type="text/html" title="Create Ridgeplots in Matplotlib" />
                <link href="https://blog.scientific-python.org/matplotlib/create-a-tesla-cybertruck-that-drives/?utm_source=atom_feed" rel="related" type="text/html" title="Create a Tesla Cybertruck That Drives" />
            
                <id>https://blog.scientific-python.org/matplotlib/emoji-mosaic-art/</id>
            
            
            <published>2020-05-24T19:11:01+05:30</published>
            <updated>2020-05-24T19:11:01+05:30</updated>
            
            
            <content type="html"><![CDATA[<blockquote>Applied image manipulation to create procedural art.</blockquote><p>A while back, I came across this cool <a href="https://github.com/willdady/emosaic">repository</a> to create emoji-art from images. I wanted to use it to transform my mundane Facebook profile picture to something more snazzy. The only trouble? It was written in Rust.</p>
<p>So instead of going through the process of installing Rust, I decided to take the easy route and spin up some code to do the same in Python using <a href="https://matplotlib.org/">matplotlib</a>.</p>
<p><del>Because that&rsquo;s what anyone sane would do, right?</del></p>
<p>In this post, I&rsquo;ll try to explain my process as we attempt to recreate similar mosaics as this one below. I&rsquo;ve aimed this post at people who&rsquo;ve worked with <em>some</em> sort of image data before; but really, anyone can follow along.</p>
<p><img src="/matplotlib/emoji-mosaic-art/warhol.png" alt="Emoji mosaic by Will Dady based on Andy Warhol’s Multiple Marilyns."></p>
<h2 id="packages">Packages<a class="headerlink" href="#packages" title="Link to this heading">#</a></h2>


<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">from</span> <span class="nn">tqdm</span> <span class="kn">import</span> <span class="n">tqdm</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">scipy</span> <span class="kn">import</span> <span class="n">spatial</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">cm</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 class="kn">import</span> <span class="nn">matplotlib</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">scipy</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Matplotlib:</span><span class="si">{</span><span class="n">matplotlib</span><span class="o">.</span><span class="n">__version__</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Numpy:</span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">__version__</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Scipy: </span><span class="si">{</span><span class="n">scipy</span><span class="o">.</span><span class="n">__version__</span><span class="si">}</span><span class="s2">&#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">## Matplotlib: &#39;3.2.1&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1">## Numpy: &#39;1.18.1&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1">## Scipy: &#39;1.4.1&#39;</span></span></span></code></pre>
</div>
<p>Let&rsquo;s read in our image:</p>

<div class="highlight">
  <pre>img = plt.imread(r&#34;naomi_32.png&#34;, 1)
dim = img.shape[0] ##we&#39;ll need this later
plt.imshow(img)</pre>
</div>

<p><img src="/matplotlib/emoji-mosaic-art/save_100.png" alt="Naomi Watts Cannes (2014) Licensed under Creative Commons attributed to Georges Biard"></p>
<p><strong>Note</strong>: <em>The image displayed above is 100x100 but we&rsquo;ll use a 32x32 from here on since that&rsquo;s gonna suffice all our needs.</em></p>
<p>So really, what <em>is</em> an image? To numpy and matplotlib (and for almost every image processing library out there), it is, essentially, just a matrix (say A), where every individual pixel (p) is an element of A. If it&rsquo;s a grayscale image, every pixel (p) is just a single number (or a scalar) - in the range [0,1] if float, or [0,255] if integer. If it&rsquo;s not grayscale - like in our case - every pixel is a vector of either dimension 3 - <strong>Red</strong> (R), <strong>Green</strong> (G), and <strong>Blue</strong> (B), or dimension 4 - RGBA (A stands for <strong>Alpha</strong>, which is basically transparency).</p>
<p>If anything is unclear so far, I&rsquo;d strongly suggest going through a post like <a href="https://matplotlib.org/3.1.1/tutorials/introductory/images.html">this</a> or <a href="http://scipy-lectures.org/advanced/image_processing/">this</a>. Knowing that an image can be represented as a matrix (or a <code>numpy array</code>) greatly helps us as almost every transformation of the image can be represented in terms of matrix maths.</p>
<p>To prove my point, let&rsquo;s look at <code>img</code> a little.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="c1">## Let&#39;s check the type of img</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">img</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1"># &lt;class &#39;numpy.ndarray&#39;&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## The shape of the array img</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># (32, 32, 4)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## The value of the first pixel of img</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">img</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="c1"># [128 144 117 255]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## Let&#39;s view the color of the first pixel</span>
</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></span><span class="line"><span class="cl"><span class="n">color</span> <span class="o">=</span> <span class="n">img</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="o">/</span> <span class="mf">255.0</span>  <span class="c1">##RGBA only accepts values in the 0-1 range</span>
</span></span><span class="line"><span class="cl"><span class="n">ax</span><span class="o">.</span><span class="n">fill</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="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="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">)</span></span></span></code></pre>
</div>
<p>That should give you a square filled with the color of the first pixel of <code>img</code>.</p>
<p><img src="/matplotlib/emoji-mosaic-art/first_pixel.png" alt="img[0][0]" title="The first pixel of the image we read in"></p>
<h2 id="methodology">Methodology<a class="headerlink" href="#methodology" title="Link to this heading">#</a></h2>
<p>We want to go from a plain image to an image full of emojis - or in other words, <strong>an image of images</strong>. Essentially, we&rsquo;re going to replace all pixels with emojis. However, to ensure that our new emoji-image looks like the original image and not just random smiley faces, the trick is to make sure that <em>every pixel is replaced my an emoji which has similar color to that pixel</em>. That&rsquo;s what gives the result the look of a mosaic.</p>
<p>&lsquo;Similar&rsquo; really just means that the <strong>mean</strong> (median is also worth trying) color of the emoji should be close to the pixel it replaces.</p>
<p>So how do you find the mean color of an entire image? Easy. We just take all the RGBA arrays and average the Rs together, and then the Gs together, and then the Bs together, and then the As together (the As, by the way, are just all 1 in our case, so the mean is also going to be 1). Here&rsquo;s that idea expressed formally:</p>
<p>\[ (r, g, b){\mu}=\left(\frac{\left(r{1}+r_{2}+\ldots+r_{N}\right)}{N}, \frac{\left(g_{1}+g_{2}+\ldots+g_{N}\right)}{N}, \frac{\left(b_{1}+b_{2}+\ldots+b_{N}\right)}{N}\right) \]</p>
<p>The resulting color would be single array of RGBA values: \[ [r_{\mu}, g_{\mu}, b_{\mu}, 1] \]</p>
<p>So now our steps become somewhat like this:</p>
<p><strong>Part I</strong> - Get emoji matches</p>
<ol>
<li>Find a bunch of emojis.</li>
<li>Find the mean of the emojis.</li>
<li>For each pixel in the image, find the emoji closest to it (wrt color), and replace pixel with that emoji (say, E).</li>
</ol>
<p><strong>Part II</strong> - Reshape emojis to image</p>
<ol>
<li>Reshape the flattened array of all Es back to the shape of our image.</li>
<li>Concatenate all emojis into a single array (reduce dimensions).</li>
</ol>
<p>That&rsquo;s pretty much it!</p>
<h3 id="step-i1---our-emoji-bank">Step I.1 - Our Emoji bank<a class="headerlink" href="#step-i1---our-emoji-bank" title="Link to this heading">#</a></h3>
<p>I took care of this for you beforehand with a bit of BeautifulSoup and requests magic. Our emoji collection is a numpy array of shape <code>1506, 16, 16, 4</code> - that&rsquo;s 1506 emojis with each being a 16x16 array of RGBA values. You can find it <a href="https://github.com/sharmaabhishekk/emoji-mosaic-mpl">here</a>.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">emoji_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s2">&#34;emojis_16.npy&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">emoji_array</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">## 1506, 16, 16, 4</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">##plt.imshow(emoji_array[0]) ##to view the first emoji</span></span></span></code></pre>
</div>
<h3 id="step-i2---calculate-the-mean-rgba-value-of-all-emojis">Step I.2 - Calculate the mean RGBA value of all emojis.<a class="headerlink" href="#step-i2---calculate-the-mean-rgba-value-of-all-emojis" title="Link to this heading">#</a></h3>
<p>We&rsquo;ve seen the formula above; here&rsquo;s the numpy code for it. We&rsquo;re gonna iterate over all all the 1506 emojis and create an array <code>emoji_mean_array</code> out of them.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">emoji_mean_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">[</span><span class="n">ar</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="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="k">for</span> <span class="n">ar</span> <span class="ow">in</span> <span class="n">emoji_array</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>  <span class="c1">##`np.median(ar, axis=(0,1))` for median instead of mean</span></span></span></code></pre>
</div>
<h3 id="step-i3---finding-closest-emoji-match-for-all-pixels">Step I.3 - finding closest emoji match for all pixels<a class="headerlink" href="#step-i3---finding-closest-emoji-match-for-all-pixels" title="Link to this heading">#</a></h3>
<p>The easiest way to do that would be use Scipy&rsquo;s <strong><code>KDTree</code></strong> to create a <code>tree</code> object of all average RGBA values we calculated in #2. This enables us to perform fast lookup for every pixel using the <code>query</code> method. Here&rsquo;s how the code for that looks -</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">tree</span> <span class="o">=</span> <span class="n">spatial</span><span class="o">.</span><span class="n">KDTree</span><span class="p">(</span><span class="n">emoji_mean_array</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">indices</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"><span class="n">flattened_img</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">img</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>  <span class="c1">##shape = [1024, 16, 16, 4]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">pixel</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="n">flattened_img</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s2">&#34;Matching emojis&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">_</span><span class="p">,</span> <span class="n">index</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">pixel</span><span class="p">)</span>  <span class="c1">##returns distance and index of closest match.</span>
</span></span><span class="line"><span class="cl">    <span class="n">indices</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">emoji_matches</span> <span class="o">=</span> <span class="n">emoji_array</span><span class="p">[</span><span class="n">indices</span><span class="p">]</span>  <span class="c1">##our emoji_matches</span></span></span></code></pre>
</div>
<h3 id="step-ii1">Step II.1<a class="headerlink" href="#step-ii1" title="Link to this heading">#</a></h3>
<p>The final step is to reshape the array a little more to enable us to plot it using the imshow function. As you can see above, to loop over the pixels we had to flatten the image out into the <code>flattened_img</code>. Now we have to sort of un-flatten it back; to make sure it&rsquo;s back in the form of an image. Fortunately, using numpy&rsquo;s <code>reshape</code> function makes this easy.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">resized_ar</span> <span class="o">=</span> <span class="n">emoji_matches</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="n">dim</span><span class="p">,</span> <span class="n">dim</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>  <span class="c1">##dim is what we got earlier when we read in the image</span></span></span></code></pre>
</div>
<h3 id="step-ii2">Step II.2<a class="headerlink" href="#step-ii2" title="Link to this heading">#</a></h3>
<p>The last bit is the trickiest. The problem with the output we&rsquo;ve got so far is that it&rsquo;s too nested. Or in simpler terms, what we have is a image where every individual pixel is itself an image. That&rsquo;s all fine but it&rsquo;s not valid input for imshow and if we try to pass it in, it tells us exactly that.</p>

<div class="highlight">
  <pre>TypeError: Invalid shape (32, 32, 16, 16, 4) for image data</pre>
</div>

<p>To grasp our problem intuitively, think about it this way. What we have right now are lots of images like these:</p>
<p><img src="/matplotlib/emoji-mosaic-art/chopped_face.png" alt="“Chopped raccoon img”" title="Image from Scipy under BSD License"></p>
<p>What we want is to merge them all together. Like so:</p>
<p><img src="/matplotlib/emoji-mosaic-art/rejoined_face.png" alt="“Rejoined raccoon img”"></p>
<p>To think about it slightly more technically, what we have right now is a <em>five</em> dimensional array. What we need is to rehshape it in such a way that it&rsquo;s - at maximum - <em>three</em> dimensional. However, it&rsquo;s not as easy as a simple <code>np.reshape</code> (I&rsquo;d suggest you go ahead and try that anyway).</p>
<p>Don&rsquo;t worry though, we have Stack Overflow to the rescue! This excellent <a href="https://stackoverflow.com/questions/52730668/concatenating-multiple-images-into-one/52733370#52733370">answer</a> does exactly that. You don&rsquo;t have to go through it, I have copied the relevant code in here.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">np_block_2D</span><span class="p">(</span><span class="n">chops</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Converts list of chopped images to one single image&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">block</span><span class="p">([[[</span><span class="n">x</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">row</span><span class="p">]</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">chops</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">final_img</span> <span class="o">=</span> <span class="n">np_block_2D</span><span class="p">(</span><span class="n">resized_ar</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">final_img</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">## (512, 512, 4)</span></span></span></code></pre>
</div>
<p>The shape looks correct enough. Let&rsquo;s try to plot it.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">final_img</span><span class="p">)</span></span></span></code></pre>
</div>
<p><img src="/matplotlib/emoji-mosaic-art/final_image.png" alt="“Emoji Mosaic final_img”"></p>
<p><strong>Et Voilà</strong></p>
<p>Of course, the result looks a little <em>meh</em> but that&rsquo;s because we only used 32x32 emojis. Here&rsquo;s what the same code would do with 10000 emojis (100x100).</p>
<p><img src="/matplotlib/emoji-mosaic-art/final_image_100.png" alt="“Emoji Mosaic full_size”"></p>
<p>Better?</p>
<p>Now, let&rsquo;s try and create nine of these emoji-images and grid them together.</p>


<div class="highlight">
  <pre class="chroma"><code><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">canvas</span><span class="p">(</span><span class="n">gray_scale_img</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Plot a 3x3 matrix of the images using different colormaps
</span></span></span><span class="line"><span class="cl"><span class="s2">        param gray_scale_img: a square gray_scale_image
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">fig</span><span class="p">,</span> <span class="n">axes</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">nrows</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">ncols</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">13</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">axes</span> <span class="o">=</span> <span class="n">axes</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">cmaps</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;BuPu_r&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;bone&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;CMRmap&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;magma&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;afmhot&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;ocean&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;inferno&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;PuRd_r&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;gist_gray&#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="k">for</span> <span class="n">cmap</span><span class="p">,</span> <span class="n">ax</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">cmaps</span><span class="p">,</span> <span class="n">axes</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">cmapper</span> <span class="o">=</span> <span class="n">cm</span><span class="o">.</span><span class="n">get_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">rgba_image</span> <span class="o">=</span> <span class="n">cmapper</span><span class="p">(</span><span class="n">gray_scale_img</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">single_plot</span><span class="p">(</span><span class="n">rgba_image</span><span class="p">,</span> <span class="n">ax</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># ax.imshow(rgba_image) ##try this if you just want to plot the plain image in different color spaces, comment the single_plot call above</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><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">subplots_adjust</span><span class="p">(</span><span class="n">hspace</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">wspace</span><span class="o">=-</span><span class="mf">0.2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">axes</span></span></span></code></pre>
</div>
<p>The code does mostly the same stuff as before. To get the different colours, I used a simple hack. I first converted the image to grayscale and then used 9 different colormaps on it. Then I used the RGB values returned by the colormap to get the absolute values for our new input image. After that, the only part left is to just feed the new input image through the pipeline we&rsquo;ve discussed so far and that gives us our emoji-image.</p>
<p>Here&rsquo;s what that looks like:</p>
<p><img src="/matplotlib/emoji-mosaic-art/final_3x3_tile.png" alt="“Emoji Mosaic 3x3_grid”"></p>
<p><em>Pretty</em></p>
<h2 id="conclusion">Conclusion<a class="headerlink" href="#conclusion" title="Link to this heading">#</a></h2>
<p>Some final thoughts to wrap this up.</p>
<ul>
<li>
<p>I&rsquo;m not sure if my way to get different colours using different cmaps is what people usually do. I&rsquo;m almost certain there&rsquo;s a better way and if you know one, please submit a PR to the repo (link below).</p>
</li>
<li>
<p>Iterating over every pixel is not really the best idea. We got away with it since it&rsquo;s just 1024 (32x32) pixels but for images with higher resolution, we&rsquo;d have to either iterate over grids of images at once (say a 3x3 or 2x2 window) or resize the image itself to a more workable shape. I prefer the latter since that way we can also just resize it to a square shape in the same call which also has the additional advantage of fitting in nicely in our 3x3 mosaic. I&rsquo;ll leave the readers to work that out themselves using numpy (and, no, please don&rsquo;t use <code>cv2.resize</code>).</p>
</li>
<li>
<p>The <code>KDTree</code> was not part of my initial code. Initially, I&rsquo;d just looped over every emoji for every pixel and then calculated the Euclidean distance (using <code>np.linalg.norm(a-b)</code>). As you can probably imagine, the nested loop in there slowed down the code tremendously - even a 32x32 emoji-image took around 10 minutes to run - right now the same code takes ~19 seconds. Guess that&rsquo;s the power of vectorization for you all.</p>
</li>
<li>
<p>It&rsquo;s worth messing around with median instead of mean to get the RGBA values of the emojis. Most emojis are circular in shape and hence there&rsquo;s a lot of space left outside the area of the circular region which sort of waters down the average color in turn watering down the end result. Considering the median might sort out this problem for some images which aren&rsquo;t very rich.</p>
</li>
<li>
<p>While I&rsquo;ve tried to go in a linear manner with (what I hope was) a good mix of explanation and code, I&rsquo;d strongly suggest looking at the full code in the repository <a href="https://github.com/sharmaabhishekk/emoji-mosaic-mpl">here</a> in case you feel like I sprung anything on you.</p>
</li>
</ul>
<hr>
<p>I hope you enjoyed this post and learned something from it. If you have any feedback, criticism, questions, please feel free to DM me on <a href="https://twitter.com/abhisheksh_98">Twitter</a> or email me (preferably the former since I&rsquo;m almost always on there). Thank you, and take care!</p>
]]></content>
            
                 
                    
                 
                    
                         
                        
                            
                             
                                <category scheme="taxonomy:Tags" term="tutorials" label="tutorials" />
                             
                                <category scheme="taxonomy:Tags" term="art" label="art" />
                             
                                <category scheme="taxonomy:Tags" term="matplotlib" label="matplotlib" />
                            
                        
                    
                
            
        </entry>
    
</feed>
