<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>gallery on 🥦 🥩</title>
    <link>https://robiwright.de/blog/</link>
    <description>Recent content in gallery on 🥦 🥩</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <copyright>© 2026 Robert W.</copyright>
    <lastBuildDate>Mon, 18 May 2026 18:56:08 +0200</lastBuildDate>
    <atom:link href="https://robiwright.de/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ICON-ART</title>
      <link>https://robiwright.de/blog/stumeta/</link>
      <pubDate>Mon, 18 May 2026 18:56:08 +0200</pubDate>
      <guid>https://robiwright.de/blog/stumeta/</guid>
      <description>At this year&amp;rsquo;s StuMeTa in Karlsruhe, I had the opportunity to attend an ICON-ART workshop. The ART-extension describes an atmospheric component of ICON to model aerosols and reactive gases. The DWD uses it, for example, to predict pollen exposure in Germany.&#xA;Using auto-icon to streamline the setup process, we, led by Dr. Rumeng Li, ran 1-day global ICON-ART simulations, obviously focussing on aerosol-related stuff, like dust concentration: The spike in dust concentration above the Saharian desert is clearly visible.</description>
      <content:encoded><![CDATA[<p>At this year&rsquo;s StuMeTa in Karlsruhe, I had the opportunity to attend an <a href="https://www.icon-art.kit.edu/">ICON-ART</a> workshop. The ART-extension describes an atmospheric component of ICON to model aerosols and reactive gases. The <em>DWD</em> uses it, for example, to predict pollen exposure in Germany.</p>
<p>Using <a href="https://auto-icon.gitlab-pages.dkrz.de/auto-icon/Introductory-guides/Shortest-guide-to-success.html"><code>auto-icon</code></a> to streamline the setup process, we, led by Dr. Rumeng Li, ran 1-day global ICON-ART simulations, obviously focussing on aerosol-related stuff, like dust concentration:
<img alt="dusta-mixing-ratio" src="/plots/dusta_mixing-ratio.png">
The spike in dust concentration above the Saharian desert is clearly visible.</p>
<p>Later, we evaluated the model prediction by comparing it to MODIS satellite data:
<img alt="aerosol-optical-depth" src="/plots/aod.png">
However, since we just ran the model for a single day, its spin-up period wasn&rsquo;t over yet, so there&rsquo;re still some visible artefacts, such as the columns south of strong emission zones in North Africa.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Search &amp; sort</title>
      <link>https://robiwright.de/blog/search-sort/</link>
      <pubDate>Tue, 17 Mar 2026 21:05:27 +0100</pubDate>
      <guid>https://robiwright.de/blog/search-sort/</guid>
      <description>Let&amp;rsquo;s test the display of jupyter notebooks in my blog. I&amp;rsquo;m programming several searching and sorting algorithms and compare their runtimes.&#xA;import random import timeit from tqdm import tqdm import seaborn as sns import matplotlib.pyplot as plt sns.set_theme(style=&amp;#34;ticks&amp;#34;, rc={&amp;#34;font.sans-serif&amp;#34;: &amp;#34;Inter&amp;#34;}) random.seed(42)Searching algorithms # linear search | O(n) def linear_search(unordered_list, search_value): for index in range(len(unordered_list)): if unordered_list[index] == search_value: return True return False # binary search (only applies to ordered lists) | O(logn) def binary_search(ordered_list, search_value): first = 0 last = len(ordered_list) - 1 while first &amp;lt;= last: middle = (first + last)//2 if search_value == ordered_list[middle]: return True elif search_value &amp;lt; ordered_list[middle]: last = middle - 1 else: first = middle + 1Actually, I like the recursive implementation even more:</description>
      <content:encoded><![CDATA[<p>Let&rsquo;s test the display of jupyter notebooks in my blog. I&rsquo;m programming several searching and sorting algorithms and compare their runtimes.</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">random</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">timeit</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">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="nn">sns</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">sns</span><span class="o">.</span><span class="n">set_theme</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="s2">&#34;ticks&#34;</span><span class="p">,</span> <span class="n">rc</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;font.sans-serif&#34;</span><span class="p">:</span> <span class="s2">&#34;Inter&#34;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span></span></span></code></pre></div><h3 id="searching-algorithms">Searching algorithms</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># linear search | O(n)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">linear_search</span><span class="p">(</span><span class="n">unordered_list</span><span class="p">,</span> <span class="n">search_value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">unordered_list</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">unordered_list</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">==</span> <span class="n">search_value</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">False</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># binary search (only applies to ordered lists) | O(logn)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">binary_search</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">,</span> <span class="n">search_value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">first</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">last</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">first</span> <span class="o">&lt;=</span> <span class="n">last</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">middle</span> <span class="o">=</span> <span class="p">(</span><span class="n">first</span> <span class="o">+</span> <span class="n">last</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">search_value</span> <span class="o">==</span> <span class="n">ordered_list</span><span class="p">[</span><span class="n">middle</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">search_value</span> <span class="o">&lt;</span> <span class="n">ordered_list</span><span class="p">[</span><span class="n">middle</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">last</span> <span class="o">=</span> <span class="n">middle</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">first</span> <span class="o">=</span> <span class="n">middle</span> <span class="o">+</span> <span class="mi">1</span></span></span></code></pre></div><p>Actually, I like the recursive implementation even more:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">binary_search_recursive</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">,</span> <span class="n">search_value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># define the base case</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="kc">False</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">middle</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># check whether the search value equals the value in the middle</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">search_value</span> <span class="o">==</span> <span class="n">ordered_list</span><span class="p">[</span><span class="n">middle</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">search_value</span> <span class="o">&lt;</span> <span class="n">ordered_list</span><span class="p">[</span><span class="n">middle</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># call recursively with the left half of the list</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">binary_search_recursive</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">[:</span><span class="n">middle</span><span class="p">],</span> <span class="n">search_value</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="c1"># call recursively with the right half of the list</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">binary_search_recursive</span><span class="p">(</span><span class="n">ordered_list</span><span class="p">[</span><span class="n">middle</span><span class="o">+</span><span class="mi">1</span><span class="p">:],</span> <span class="n">search_value</span><span class="p">)</span></span></span></code></pre></div><h3 id="sorting-algorithms">Sorting algorithms</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># bubble sort | O(n²)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">bubble_sort</span><span class="p">(</span><span class="n">my_list</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">list_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">is_sorted</span> <span class="o">=</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="ow">not</span> <span class="n">is_sorted</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">is_sorted</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">list_length</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</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">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="n">is_sorted</span> <span class="o">=</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl">        <span class="n">list_length</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">my_list</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># selection sort | O(n²)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">selection_sort</span><span class="p">(</span><span class="n">my_list</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">list_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">list_length</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">lowest</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">index</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">list_length</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">lowest</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">lowest</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="n">index</span> <span class="o">=</span> <span class="n">j</span>
</span></span><span class="line"><span class="cl">        <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">index</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">my_list</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># insertion sort | O(n²)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">insertion_sort</span><span class="p">(</span><span class="n">my_list</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">        <span class="n">number_to_order</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">number_to_order</span> <span class="o">&lt;</span> <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">            <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">j</span> <span class="o">-=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="n">my_list</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">number_to_order</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">my_list</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># merge sort | O(n logn)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">my_list</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">mid</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span><span class="o">//</span><span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="n">left_half</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[:</span><span class="n">mid</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">right_half</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">mid</span><span class="p">:]</span>
</span></span><span class="line"><span class="cl">        <span class="n">merge_sort</span><span class="p">(</span><span class="n">left_half</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">merge_sort</span><span class="p">(</span><span class="n">right_half</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">i</span> <span class="o">=</span> <span class="n">j</span> <span class="o">=</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">left_half</span><span class="p">)</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">right_half</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">left_half</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">right_half</span><span class="p">[</span><span class="n">j</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">                <span class="n">my_list</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">left_half</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="n">i</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">my_list</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">right_half</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="n">j</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">left_half</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">my_list</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">left_half</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">while</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">right_half</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">my_list</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">right_half</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="n">j</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">            <span class="n">k</span> <span class="o">+=</span> <span class="mi">1</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># quicksort (Hoare&#39;s partition) | O(n²)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="n">my_list</span><span class="p">,</span> <span class="n">first_index</span><span class="p">,</span> <span class="n">last_index</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">  <span class="n">pivot</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">first_index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="n">left_pointer</span> <span class="o">=</span> <span class="n">first_index</span> <span class="o">+</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">  <span class="n">right_pointer</span> <span class="o">=</span> <span class="n">last_index</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">  <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">my_list</span><span class="p">[</span><span class="n">left_pointer</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">pivot</span> <span class="ow">and</span> <span class="n">left_pointer</span> <span class="o">&lt;</span> <span class="n">last_index</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">      <span class="n">left_pointer</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="n">my_list</span><span class="p">[</span><span class="n">right_pointer</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">pivot</span> <span class="ow">and</span> <span class="n">right_pointer</span> <span class="o">&gt;=</span> <span class="n">first_index</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">      <span class="n">right_pointer</span> <span class="o">-=</span> <span class="mi">1</span> 
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">left_pointer</span> <span class="o">&gt;=</span> <span class="n">right_pointer</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="cl">    <span class="n">my_list</span><span class="p">[</span><span class="n">left_pointer</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">right_pointer</span><span class="p">]</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">right_pointer</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">left_pointer</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">my_list</span><span class="p">[</span><span class="n">first_index</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">right_pointer</span><span class="p">]</span> <span class="o">=</span> <span class="n">my_list</span><span class="p">[</span><span class="n">right_pointer</span><span class="p">],</span> <span class="n">my_list</span><span class="p">[</span><span class="n">first_index</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">right_pointer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">quicksort</span><span class="p">(</span><span class="n">my_list</span><span class="p">,</span> <span class="n">first_index</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">last_index</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="n">last_index</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">last_index</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="n">first_index</span> <span class="o">&lt;</span> <span class="n">last_index</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">partition_index</span> <span class="o">=</span> <span class="n">partition</span><span class="p">(</span><span class="n">my_list</span><span class="p">,</span> <span class="n">first_index</span><span class="p">,</span> <span class="n">last_index</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">quicksort</span><span class="p">(</span><span class="n">my_list</span><span class="p">,</span> <span class="n">first_index</span><span class="p">,</span> <span class="n">partition_index</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">quicksort</span><span class="p">(</span><span class="n">my_list</span><span class="p">,</span> <span class="n">partition_index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last_index</span><span class="p">)</span></span></span></code></pre></div><h3 id="compare-runtime">Compare runtime</h3>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">evaluate_search_algorithm</span><span class="p">(</span><span class="n">algorithm</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">sizes</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">2000</span><span class="p">,</span> <span class="mi">5000</span><span class="p">,</span> <span class="mi">10000</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">times</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">size</span> <span class="ow">in</span> <span class="n">sizes</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># generate data</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">size</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="n">times</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span>  <span class="c1"># output in seconds</span>
</span></span><span class="line"><span class="cl">                <span class="n">stmt</span><span class="o">=</span><span class="k">lambda</span><span class="p">:</span> <span class="n">algorithm</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="n">size</span><span class="p">)),</span>  <span class="c1"># always search for different integer</span>
</span></span><span class="line"><span class="cl">                <span class="n">number</span><span class="o">=</span><span class="mi">1</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><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">times</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">evaluate_sort_algorithms</span><span class="p">(</span><span class="n">algorithm</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">sizes</span> <span class="o">=</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">times</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">size</span> <span class="ow">in</span> <span class="n">sizes</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># generate data</span>
</span></span><span class="line"><span class="cl">        <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1000</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">size</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">        <span class="n">times</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="n">stmt</span><span class="o">=</span><span class="k">lambda</span><span class="p">:</span> <span class="n">algorithm</span><span class="p">(</span><span class="n">data</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="n">number</span><span class="o">=</span><span class="mi">1</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><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">times</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">runtime_search</span><span class="p">,</span> <span class="n">runtime_sort</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">algorithm</span> <span class="ow">in</span> <span class="p">[</span><span class="n">linear_search</span><span class="p">,</span> <span class="n">binary_search_recursive</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="n">runtime_search</span><span class="p">[</span><span class="n">algorithm</span><span class="o">.</span><span class="vm">__name__</span><span class="p">]</span> <span class="o">=</span> <span class="n">evaluate_search_algorithm</span><span class="p">(</span><span class="n">algorithm</span><span class="p">)</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">for</span> <span class="n">algorithm</span> <span class="ow">in</span> <span class="p">[</span><span class="n">bubble_sort</span><span class="p">,</span> <span class="n">selection_sort</span><span class="p">,</span> <span class="n">insertion_sort</span><span class="p">,</span> <span class="n">merge_sort</span><span class="p">,</span> <span class="n">quicksort</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">    <span class="n">runtime_sort</span><span class="p">[</span><span class="n">algorithm</span><span class="o">.</span><span class="vm">__name__</span><span class="p">]</span> <span class="o">=</span> <span class="n">evaluate_sort_algorithms</span><span class="p">(</span><span class="n">algorithm</span><span class="p">)</span></span></span></code></pre></div>




<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">fig</span><span class="p">,</span> <span class="n">axs</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="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="n">layout</span><span class="o">=</span><span class="s2">&#34;constrained&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">alg</span><span class="p">,</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">runtime_search</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">axs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="mi">100</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">2000</span><span class="p">,</span> <span class="mi">5000</span><span class="p">,</span> <span class="mi">10000</span><span class="p">],</span> <span class="p">[</span><span class="n">t</span><span class="o">*</span><span class="mf">1e3</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">time</span><span class="p">],</span> <span class="n">marker</span><span class="o">=</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">alg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">alg</span><span class="p">,</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">runtime_sort</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="n">axs</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span> <span class="p">[</span><span class="n">t</span><span class="o">*</span><span class="mf">1e3</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">time</span><span class="p">],</span> <span class="n">marker</span><span class="o">=</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="n">alg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">titles</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&#34;search&#34;</span><span class="p">,</span> <span class="s2">&#34;sort&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">ax</span><span class="p">,</span> <span class="n">title</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">axs</span><span class="p">,</span> <span class="n">titles</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">legend</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_xlabel</span><span class="p">(</span><span class="s2">&#34;list length&#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_ylabel</span><span class="p">(</span><span class="s2">&#34;runtime [ms]&#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_title</span><span class="p">(</span><span class="n">title</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_ylim</span><span class="p">(</span><span class="n">bottom</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">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="n">left</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span></span></span></code></pre></div><p><img alt="png" src="/plots/datacamp_17_0.png"></p>
<p>To display this jupyter notebook here, I used <a href="https://github.com/jupyter/nbconvert">nbconvert</a> to export it directly as markdown.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hitzefrei</title>
      <link>https://robiwright.de/blog/hitzefrei/</link>
      <pubDate>Thu, 26 Feb 2026 17:55:30 +0100</pubDate>
      <guid>https://robiwright.de/blog/hitzefrei/</guid>
      <description>I tried to create a time series plot for the maximum temperature measured in Berlin throughout the last 15 years:&#xA;Among other things, one can clearly see the data gap in the spring of 2025 during which the FU suffered an electricity blackout lasting several (!) weeks. Another way to visualize such a time series is to aggregate the data and plot the average yearly cycle of the distribution. A really nice example for such a plot can be found on the FU&amp;rsquo;s meteorological institute&amp;rsquo;s website.</description>
      <content:encoded><![CDATA[<p>I tried to create a time series plot for the maximum temperature measured in Berlin throughout the last 15 years:</p>
<p><img alt="fig" src="/plots/fu-tmax-timeseries.png"></p>
<p>Among other things, one can clearly see the data gap in the spring of 2025 during which the FU suffered an electricity blackout lasting several (!) weeks. Another way to visualize such a time series is to aggregate the data and plot the average yearly cycle of the distribution. A really nice example for such a plot can be found on the FU&rsquo;s meteorological institute&rsquo;s <a href="https://www.geo.fu-berlin.de/met/service/Klimastatistiken/">website</a>.</p>
<p>Late-July of 2022 marks one of the time periods with the highest recorded temperatures in Berlin. To understand just how severe a large city&rsquo;s buildings and sealed surfaces can amplify a heat wave, we look at different weather stations in Berlin:</p>
<p><img alt="fig" src="/plots/fu-t2m-comparison.png"></p>
<p>While the <a href="https://de.wikipedia.org/wiki/Wasserturm_auf_dem_Fichtenberg#Nutzung">weather tower</a> with its station inside the botanical garden measured &ldquo;only&rdquo; 36.9°C, Berlin&rsquo;s city centre (<em>Hackescher Markt</em>) reported up to 40.5°C &ndash; an increase of almost 4°C!
On top, especially in the early morning of 21st July, we see that the inner city stays warm and cannot cool as much as more greeny areas like the botanical garden.</p>
<p><em>(The temperature data for</em> Botanischer Garten (FU) <em>can be found on the DWD&rsquo;s <a href="https://opendata.dwd.de/">open data server</a>,</em> Schöneberg <em>is part of the <a href="https://uco.berlin/dataportal">Urban Climate Observatory Berlin</a>, and a <a href="https://messi.openuco.berlin/public_devices">MESSI weather station</a> is situated at</em> Hackescher Markt.
<em>Also note the differing measurement intervals of the raw displayed data, hence some curves look &ldquo;smoother&rdquo; than others.)</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sunshine</title>
      <link>https://robiwright.de/blog/sunshine/</link>
      <pubDate>Sun, 01 Feb 2026 20:35:15 +0100</pubDate>
      <guid>https://robiwright.de/blog/sunshine/</guid>
      <description>I was wondering where the sunniest spots of Germany are. Using sunshine duration data from 322 selected DWD weather stations (left figure) and filling the gaps with kriging, I created a continuous sunshine map for the whole country (center figure). It turns out the south and east are quite pleasant places if you enjoy the occasional sunbath!&#xA;Kriging is an advanced spatial interpolation method that does not just “smooth” values between stations.</description>
      <content:encoded><![CDATA[<p>I was wondering where the sunniest spots of Germany are. Using sunshine duration data from 322 selected DWD weather stations (<em>left figure</em>) and filling the gaps with <strong>kriging</strong>, I created a continuous sunshine map for the whole country (<em>center figure</em>). It turns out the south and east are quite pleasant places if you enjoy the occasional sunbath!</p>
<p><img alt="sunshine" src="/plots/sunshine.png"></p>
<hr>
<p><a href="https://en.wikipedia.org/wiki/Kriging">Kriging</a> is an advanced spatial interpolation method that does not just “smooth” values between stations. It uses the spatial structure in the data (captured by the variogram) to weight nearby observations based on how similar points are expected to be at a given distance.</p>
<p>An advantage of kriging is that it also provides a prediction uncertainty, the kriging variance \(\sigma^2\) (<em>right figure</em>). This does not measure the actual error, but shows where the interpolation is more or less reliable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Bundestagswahl &#39;25</title>
      <link>https://robiwright.de/blog/wahl25/</link>
      <pubDate>Tue, 27 Jan 2026 18:32:11 +0100</pubDate>
      <guid>https://robiwright.de/blog/wahl25/</guid>
      <description>Im Rückblick auf die vergangene Bundestagswahl und die Altersgruppen fallen zwei Dinge auf:&#xA;Die Linke ist stärkste Kraft bei den Jungwähler:innen ✊, dafür leider die AfD bei den etwas Älteren. Junge Menschen sind stark politisiert und wählen eher die sogenannten &amp;ldquo;Ränder&amp;rdquo;, die traditionelle &amp;ldquo;Mitte&amp;rdquo; verschwindet. </description>
      <content:encoded><![CDATA[<p>Im Rückblick auf die vergangene Bundestagswahl und die Altersgruppen fallen zwei Dinge auf:</p>
<ol>
<li><em>Die Linke</em> ist stärkste Kraft bei den Jungwähler:innen ✊, dafür leider die <em>AfD</em> bei den etwas Älteren.</li>
<li>Junge Menschen sind stark politisiert und wählen eher die sogenannten &ldquo;Ränder&rdquo;, die traditionelle &ldquo;Mitte&rdquo; verschwindet.</li>
</ol>
<p><img alt="bundestagswahl 2025" src="/plots/wahl25-altersgruppen.svg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Binomial distribution</title>
      <link>https://robiwright.de/blog/binomial/</link>
      <pubDate>Sun, 02 Nov 2025 01:17:02 +0100</pubDate>
      <guid>https://robiwright.de/blog/binomial/</guid>
      <description>Ever wondered how likely you are to win a binary game a certain number of times? Now you can quickly explore the probabilities and see your chances at a glance!&#xA;After trying geopandas and streamlit to get interactive plots and web apps, I now gave bokeh a shot. However, to get any kind of calculations done, you&amp;rsquo;d need to run a bokeh server, which is not possible in my current static hugo &amp;amp; github pages setup.</description>
      <content:encoded><![CDATA[<p>Ever wondered how likely you are to win a binary game a certain number of times?
Now you can quickly explore the probabilities and see your chances at a glance!</p>
<div style="position: relative; width: 100%; height: 0; padding-bottom: 75%;">
  <iframe src="/plots/interactive-binomial.html" style="position: absolute; top:0; left:0; width:100%; height:100%; border:none;"></iframe>
</div>
<hr>
<p>After trying <code>geopandas</code> and <code>streamlit</code> to get interactive plots and web apps, I now gave <code>bokeh</code> a shot. However, to get any kind of calculations done, you&rsquo;d need to run a bokeh server, which is not possible in my current static hugo &amp; github pages setup.
So I reverted to <code>plotly</code> and wrote the update functions to re-calculate the probabilities in JavaScript, which can be run client-side in the browser.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Growth</title>
      <link>https://robiwright.de/blog/growth/</link>
      <pubDate>Mon, 22 Sep 2025 17:00:18 +0200</pubDate>
      <guid>https://robiwright.de/blog/growth/</guid>
      <description>I sometimes find it hard to picture different growth rates, so here’s a quick comparison of the most common ones:</description>
      <content:encoded><![CDATA[<p>I sometimes find it hard to picture different growth rates, so here’s a quick comparison of the most common ones:</p>
<p><img alt="growth" src="/plots/growth.svg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>The diurnal cycle</title>
      <link>https://robiwright.de/blog/diurnal-cycle/</link>
      <pubDate>Sun, 21 Sep 2025 17:44:33 +0200</pubDate>
      <guid>https://robiwright.de/blog/diurnal-cycle/</guid>
      <description>The diurnal cycle of certain climate variables is particularly interesting and warrants further visualization.</description>
      <content:encoded><![CDATA[<p>The diurnal cycle of certain climate variables is particularly interesting and warrants further visualization.</p>
<p><img alt="delayed-temperature" src="/plots/diurnal-cycle.svg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eurovision Song Contest</title>
      <link>https://robiwright.de/blog/esc/</link>
      <pubDate>Wed, 14 May 2025 21:05:11 +0200</pubDate>
      <guid>https://robiwright.de/blog/esc/</guid>
      <description>Aus aktuellem Anlass eine interaktive Übersicht der durchschnittlichen Punktzahl, die das deutsche Televoting an die Finalist:innen vergibt. In dieser Tabelle sind Anmerkungen zu den sich im Laufe der Jahre verändernden Votingsystemen zusammengetragen &amp;ndash; kurzum gab es in den Jahren von 1997 bis 2008 ausschließlich das Televoting, seit 2016 werden die Ergebnisse des Televotings wieder veröffentlicht, allerdings gibt es nun daneben auch noch die nationalen Jurys.&#xA;Außerdem nimmt zum Beispiel die Türkei seit 2013 auf unbestimmte Zeit nicht mehr am ESC teil und hat den Auftritt Conchita Wursts im darauffolgenden Jahr auch noch nicht verkraftet (😂).</description>
      <content:encoded><![CDATA[<p>Aus aktuellem Anlass eine interaktive Übersicht der durchschnittlichen Punktzahl, die das deutsche <strong>Televoting</strong> an die Finalist:innen vergibt.
In dieser <a href="https://github.com/josago97/EurovisionDataset/blob/main/dataset/eurovision.json">Tabelle</a> sind Anmerkungen zu den sich im Laufe der Jahre verändernden Votingsystemen zusammengetragen &ndash; kurzum gab es in den Jahren von 1997 bis 2008 <em>ausschließlich</em> das Televoting, seit 2016 werden die Ergebnisse des Televotings wieder veröffentlicht, allerdings gibt es nun daneben auch noch die nationalen Jurys.</p>
<p>Außerdem nimmt zum Beispiel die Türkei seit 2013 auf unbestimmte Zeit nicht mehr am ESC teil und hat den Auftritt Conchita Wursts im darauffolgenden Jahr auch noch nicht verkraftet (😂). Da jedoch nur die Punktevergabe bei erfolgreicher Finalteilnahme berücksichtigt wird, wirkt sich dies nicht negativ auf das Ergebnis aus. Zudem lässt sich beobachten, dass vor allem europäische Länder mit einer großen Diaspora in Deutschland besonders viele Zuschauer:innen-Punkte erhalten.</p>
<iframe
  src="/plots/televotes-de.html"
  width="100%"
  height="500">
</iframe>
<p>Der zugrundeliegende <a href="https://github.com/Spijkervet/eurovision-dataset/releases">Datensatz</a> wurde von Janne Spijkervet zusammengestellt.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Happy New Year!</title>
      <link>https://robiwright.de/blog/happy-new-year/</link>
      <pubDate>Wed, 22 Jan 2025 01:14:50 +0100</pubDate>
      <guid>https://robiwright.de/blog/happy-new-year/</guid>
      <description>Weihnachten, die Zeit des Friedens,&#xA;Zeit zu vergeben und zu verzeihen.&#xA;Ich liebe dich und du liebst mich, jeder liebt jeden,&#xA;lass uns zusammen fröhlich sein.&#xA;Nichts ist heut unmöglich, auch ein Wunder kann geschehen.&#xA;Jeder Traum geht in Erfüllung, wenn du es wirklich willst.&#xA;Hey, was für ein frohes Fest!&#xA;Keine Angst, es wird vorübergehen.&#xA;Hey, was für ein frohes Fest!&#xA;Nur Mut, wir werden es durchstehen.&#xA;&amp;mdash; Die Roten Rosen // Frohes Fest</description>
      <content:encoded><![CDATA[<blockquote>
<p>Weihnachten, die Zeit des Friedens,<br>
Zeit zu vergeben und zu verzeihen.<br>
Ich liebe dich und du liebst mich, jeder liebt jeden,<br>
lass uns zusammen fröhlich sein.<br>
Nichts ist heut unmöglich, auch ein Wunder kann geschehen.<br>
Jeder Traum geht in Erfüllung, wenn du es wirklich willst.<br></p>
<p>Hey, was für ein frohes Fest!<br>
Keine Angst, es wird vorübergehen.<br>
Hey, was für ein frohes Fest!<br>
Nur Mut, wir werden es durchstehen.<br></p>
<p>&mdash; <a href="https://www.youtube.com/watch?v=vDNZoNFARVI">Die Roten Rosen // Frohes Fest</a></p>
</blockquote>
<p><img alt="scheidung-trends" src="/plots/scheidung.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Berlin, Berlin</title>
      <link>https://robiwright.de/blog/berlin/</link>
      <pubDate>Fri, 15 Nov 2024 00:43:56 +0100</pubDate>
      <guid>https://robiwright.de/blog/berlin/</guid>
      <description>Berlin-Atlas Impressionen </description>
      <content:encoded><![CDATA[<h2 id="berlin-atlas">Berlin-Atlas</h2>
<p><img alt="restaurants" src="/plots/restaurants.png"></p>
<hr>
<h2 id="impressionen">Impressionen</h2>
<p> <img src="/images/baustelle.jpeg" width=400> </p>
<p> <img src="/images/gloryhole.jpg" width=225> </p>
]]></content:encoded>
    </item>
    <item>
      <title>Grippewelle</title>
      <link>https://robiwright.de/blog/grippewelle/</link>
      <pubDate>Tue, 29 Oct 2024 18:43:42 +0100</pubDate>
      <guid>https://robiwright.de/blog/grippewelle/</guid>
      <description>Das Robert-Koch-Institut veröffentlicht jeden Freitag neue Zahlen zu akuten Atemwegserkrankungen auf GitHub. Diese stammen aus dem Online-Portal GrippeWeb, wo registrierte Teilnehmer:innen wöchentlich gefragt werden, ob sie denn eine Atemwegserkrankung hatten.&#xA;Ein Boxplot liefert die sogenannte Fünf-Punkte-Zusammenfassung. Die Box entspricht dem Interquartilsabstand (IQR) und enthält somit die mittleren 50 % der Daten; der Median wird als durchgehender Strich in der Box dargestellt. Die Whisker enden am letzten Datenpunkt, der sich noch im Bereich von 1,5×IQR befindet.</description>
      <content:encoded><![CDATA[<p>Das Robert-Koch-Institut veröffentlicht jeden Freitag neue Zahlen zu akuten Atemwegserkrankungen auf <a href="https://github.com/robert-koch-institut/GrippeWeb_Daten_des_Wochenberichts">GitHub</a>. Diese stammen aus dem Online-Portal <em>GrippeWeb</em>, wo registrierte Teilnehmer:innen wöchentlich gefragt werden, ob sie denn eine Atemwegserkrankung hatten.</p>
<p>Ein Boxplot liefert die sogenannte <em>Fünf-Punkte-Zusammenfassung</em>. Die Box entspricht dem Interquartilsabstand (IQR) und enthält somit die mittleren 50 % der Daten; der Median wird als durchgehender Strich in der Box dargestellt.
Die Whisker enden am letzten Datenpunkt, der sich noch im Bereich von 1,5×IQR befindet. Alles darüber bzw. darunter wird als Ausreißer gekennzeichnet.</p>
<p>In dieser Darstellung ist zu erkennen, dass die Grippewelle im Herbst kontinuierlich eintritt, während eine zweite Welle im neuen Jahr eine deutlich breitere Streuung aufweist, der Median jedoch größer ist. Während letztere Welle in einigen Jahren anscheinend ausbleibt bzw. keine nennenswerte Zahl an Krankheitsfällen verursacht, kann in anderen Jahren die erste Welle sogar überlagert werden!</p>
<p><img alt="grippe" src="/plots/annual-incidence.png"></p>
<p><em>Diese Abbildung wurde durch eine Übung des Moduls <a href="https://www.geo.fu-berlin.de/met/wexicom/Lehre/Naturrisiko/index.html">Interdisziplinäre Naturrisikoforschung</a> inspiriert.</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Kartenprojektionen</title>
      <link>https://robiwright.de/blog/mercator/</link>
      <pubDate>Wed, 23 Oct 2024 16:37:50 +0200</pubDate>
      <guid>https://robiwright.de/blog/mercator/</guid>
      <description>Die Mercator-Projektion wurde 1569 vom Kartographen Gerhard Mercator unter dem Titel Nova et Aucta Orbis Terrae Descriptio ad Usum Navigantium Emendata veröffentlicht.1 Wie der Name schon sagt, war diese Projektion für die Navigation auf See gedacht, da Wege gleichen Kurses (also Kompassnadel zeigt fortwährend in die gleiche Richtung) als Geraden dargestellt werden.&#xA;Allerdings wird bei Änderung der Projektion2 deutlich, dass diese sogenannten Loxodromen nicht die kürzeste Verbindung zweier Punkte auf einer Kugeloberfläche sind.</description>
      <content:encoded><![CDATA[<p>Die Mercator-Projektion wurde 1569 vom Kartographen Gerhard Mercator unter dem Titel <em>Nova et Aucta Orbis Terrae Descriptio ad Usum Navigantium Emendata</em> veröffentlicht.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>
Wie der Name schon sagt, war diese Projektion für die Navigation auf See gedacht, da Wege gleichen Kurses (also Kompassnadel zeigt fortwährend in die gleiche Richtung) als Geraden dargestellt werden.</p>
<p>Allerdings wird bei Änderung der Projektion<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> deutlich, dass diese sogenannten <strong>Loxodromen</strong> nicht die kürzeste Verbindung zweier Punkte auf einer Kugeloberfläche sind. Reist ein Flugzeug beispielsweise von Berlin nach Chicago auf einer <strong>Orthodromen</strong>, also entlang eines Großkreises bzw. auf <em>wirklich</em> kürzestem Weg, wird dies in der Mercator-Projektion als Kurve dargestellt. Während Flugreisen ist diese auf den ersten Blick widersprüchliche Routenführung manchmal auf der on-board Karte (in Mercator-Projektion) zu erkennen. Die frühneuzeitliche Seefahrt nahm also für eine vereinfachte Navigation eine längere Strecke in Kauf.</p>
<p><img alt="mercator" src="/plots/mercator-projection.png"></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>vgl. <a href="https://en.wikipedia.org/wiki/Mercator_projection#History">Wikipedia</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Die orthographische Projektion betont die Kugelgestalt der Erde, jedoch werden Flächen (vor allem nahe der Ränder) weiterhin verzerrt dargestellt. Daher rühren die „Knicke“ der Loxodrome im rechten Subplot.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Mood Mosaic &#39;24</title>
      <link>https://robiwright.de/blog/moodtracker/</link>
      <pubDate>Sun, 29 Sep 2024 12:54:53 +0200</pubDate>
      <guid>https://robiwright.de/blog/moodtracker/</guid>
      <description>I tracked my daily mood from the beginning of 2024 until mid-September of the same year, and it turns out that (non-surprisingly) my birthday month of July has been my happiest time so far. In July, on a scale from miserable = 1 to excellent = 5, my mood was 4.35, while my average monthly mood was 3.71!</description>
      <content:encoded><![CDATA[<p>I tracked my daily mood from the beginning of 2024 until mid-September of the same year, and it turns out that (non-surprisingly) my birthday month of July has been my happiest time so far. In July, on a scale from <em>miserable</em> = 1 to <em>excellent</em> = 5, my mood was 4.35, while my average monthly mood was 3.71!</p>
<p><img alt="moodtracker" src="/plots/mosaic-mood.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Lexis Diagram</title>
      <link>https://robiwright.de/blog/lexis-diagram/</link>
      <pubDate>Fri, 16 Aug 2024 19:19:25 +0200</pubDate>
      <guid>https://robiwright.de/blog/lexis-diagram/</guid>
      <description>I first encountered Lexis diagrams in a Reddit post. These diagrams are frequently used in demographic studies to visualize the relationship between age, time period, and cohort (year of birth).&#xA;As outlined by Schöley &amp;amp; Willekens (2017), the labelled patterns in the Lexis diagram below are predominantly linked to:&#xA;The pronounced impact of the Spanish Civil War (and before possibly of World War I). The persistently higher risk of accidents among young men.</description>
      <content:encoded><![CDATA[<p>I first encountered Lexis diagrams in a <a href="https://www.reddit.com/r/dataisbeautiful/comments/1de5n9f/updated_lexis_diagram_new_countries_and_scales_oc/">Reddit post</a>. These diagrams are frequently used in demographic studies to visualize the relationship between age, time period, and cohort (year of birth).</p>
<p>As outlined by <a href="https://www.demographic-research.org/articles/volume/36/21/">Schöley &amp; Willekens (2017)</a>, the labelled patterns in the Lexis diagram below are predominantly linked to:</p>
<ol>
<li>The pronounced impact of the <em>Spanish Civil War</em> (and before possibly of <em>World War I</em>).</li>
<li>The persistently higher risk of accidents among young men.</li>
<li>Smoking-related deaths in men before women began to adopt similar smoking habits.</li>
</ol>
<p><img alt="lexis-diagram" src="/plots/lexis-diagram.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>IMDb Ratings</title>
      <link>https://robiwright.de/blog/imdb-ratings/</link>
      <pubDate>Wed, 14 Aug 2024 21:57:22 +0200</pubDate>
      <guid>https://robiwright.de/blog/imdb-ratings/</guid>
      <description>Mein Bruder schwört auf BoJack Horseman &amp;amp; anscheinend lohnt es sich, dranzubleiben.&#xA;Inspiriert durch whattowatchon.tv.</description>
      <content:encoded><![CDATA[<p>Mein Bruder schwört auf BoJack Horseman &amp; anscheinend lohnt es sich, dranzubleiben.</p>
<p><img alt="imdb-rating" src="/plots/imdb-rating.png"></p>
<p>Inspiriert durch <a href="https://whattowatchon.tv/bojack-horseman-2014-2020-tt3398228">whattowatchon.tv</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>TidyTuesday</title>
      <link>https://robiwright.de/blog/drwho/</link>
      <pubDate>Wed, 14 Aug 2024 13:33:05 +0200</pubDate>
      <guid>https://robiwright.de/blog/drwho/</guid>
      <description>Throwback to one of the few TidyTuesday visualizations I created! The others can be found on GitHub.</description>
      <content:encoded><![CDATA[<p>Throwback to one of the few <em>TidyTuesday</em> visualizations I created! The others can be found on <a href="https://github.com/vegan-schnitzel/tidytuesdays">GitHub</a>.</p>
<p><img alt="drwho" src="/plots/drwho.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Ein Frühlingssemester in Bergen</title>
      <link>https://robiwright.de/blog/rain-bergen/</link>
      <pubDate>Wed, 26 Jun 2024 16:30:23 +0200</pubDate>
      <guid>https://robiwright.de/blog/rain-bergen/</guid>
      <description>Während meines Erasmus-Aufenthalts in Bergen, Norwegen, durfte ich deutlich mehr Regen als Berliner:innen genießen.</description>
      <content:encoded><![CDATA[<p>Während meines Erasmus-Aufenthalts in Bergen, Norwegen, durfte ich deutlich mehr Regen als Berliner:innen genießen.</p>
<p><img alt="rain-bergen" src="/plots/bergen_berlin_precipitation.png"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sonntagsfrage in Bayern</title>
      <link>https://robiwright.de/blog/freie-waehler-bayern/</link>
      <pubDate>Thu, 09 May 2024 18:56:28 +0200</pubDate>
      <guid>https://robiwright.de/blog/freie-waehler-bayern/</guid>
      <description>Im August 2023 erhebt die Süddeutsche Zeitung Vorwürfe gegen Hubert Aiwanger, dass dieser während seiner Schulzeit ein antisemitisches Flugblatt verfasst haben soll.1 Hubert hatte laut eigener Aussage einige Exemplare in seiner Schultasche und musste ein Referat als &amp;ldquo;Wiedergutmachung&amp;rdquo; halten, beharrte jedoch darauf, dass sein Bruder der Verfasser des Pamphlets sei. Sympathisch!&#xA;Eine Inszenierung als Opfer einer angeblichen Hetzkampagne der &amp;ldquo;etablierten&amp;rdquo; Medien verhalf den Freien Wählern augenscheinlich zu einem verbesserten Abschneiden in der anschließenden Landtagswahl.</description>
      <content:encoded><![CDATA[<p>Im August 2023 erhebt die Süddeutsche Zeitung Vorwürfe gegen Hubert Aiwanger, dass dieser während seiner Schulzeit ein antisemitisches Flugblatt verfasst haben soll.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Hubert hatte <em>laut eigener Aussage</em> einige Exemplare in seiner Schultasche und musste ein Referat als &ldquo;Wiedergutmachung&rdquo; halten, beharrte jedoch darauf, dass sein Bruder der Verfasser des Pamphlets sei. Sympathisch!</p>
<p>Eine Inszenierung als Opfer einer angeblichen Hetzkampagne der &ldquo;etablierten&rdquo; Medien verhalf den Freien Wählern augenscheinlich zu einem verbesserten Abschneiden in der anschließenden Landtagswahl.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Sie wurden zweitstärkste Kraft mit 15,8 %. Anscheinend kann 78 Jahre nach dem Ende des Zweiten Weltkriegs in Bayern wieder politisches Kapital aus einer antisemitischen Vergangenheit geschlagen werden.</p>
<p><img alt="sonntagsfrage" src="/plots/fw-bayern.png"></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Hintergründe zur Flugblatt-Äffare beispielsweise im <a href="https://www.br.de/nachrichten/bayern/fall-aiwanger-fakten-widersprueche-raetsel,To8boYv">BR</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>siehe gestrichelte schwarze Linie in Abbildung&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Sonntagsfrage in Thüringen</title>
      <link>https://robiwright.de/blog/afd-thueringen/</link>
      <pubDate>Tue, 16 Apr 2024 00:51:28 +0200</pubDate>
      <guid>https://robiwright.de/blog/afd-thueringen/</guid>
      <description>Auch ein Faschist1 in der Rolle des Vorsitzenden kann den Höhenflug der Partei anscheinend nicht beeinträchtigen.&#xA;Laut Gerichtsbeschluss vom 26. September 2019&amp;#160;&amp;#x21a9;&amp;#xfe0e;</description>
      <content:encoded><![CDATA[<p><img alt="sonntagsfrage" src="/plots/afd-th%C3%BCringen.png"></p>
<p>Auch ein <cite>Faschist<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></cite> in der Rolle des Vorsitzenden kann den Höhenflug der Partei anscheinend nicht beeinträchtigen.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Laut <a href="https://www.spiegel.de/politik/deutschland/bjoern-hoecke-darf-als-faschist-bezeichnet-werden-gerichtsurteil-zu-eisenach-a-1289131.html">Gerichtsbeschluss</a> vom 26. September 2019&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My first post</title>
      <link>https://robiwright.de/blog/mypost/</link>
      <pubDate>Sun, 14 Apr 2024 23:18:24 +0200</pubDate>
      <guid>https://robiwright.de/blog/mypost/</guid>
      <description>Hello, world &amp;amp; let&amp;rsquo;s go!</description>
      <content:encoded><![CDATA[<p>Hello, world &amp; let&rsquo;s go!</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
