<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://zhengquanzhou.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://zhengquanzhou.com/" rel="alternate" type="text/html" /><updated>2026-06-24T00:39:14+09:00</updated><id>https://zhengquanzhou.com/feed.xml</id><title type="html">Zhengquan Zhou</title><subtitle>Marine ecologist studying environmental variability, benthic ecosystems, and marine heatwaves.</subtitle><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><entry><title type="html">[Blog] From Spawning to Settlement: Cultivating Sea Urchin Larvae</title><link href="https://zhengquanzhou.com/blog/urchin-larvae-figs/" rel="alternate" type="text/html" title="[Blog] From Spawning to Settlement: Cultivating Sea Urchin Larvae" /><published>2026-01-09T00:00:00+09:00</published><updated>2026-01-09T00:00:00+09:00</updated><id>https://zhengquanzhou.com/blog/urchin-larvae-figs</id><content type="html" xml:base="https://zhengquanzhou.com/blog/urchin-larvae-figs/"><![CDATA[<p><em>This post followed sea urchins from induced spawning through fertilization, larval development, metamorphosis, and juvenile formation under controlled temperature and salinity treatments. The post documents each stage of the cultivation process, highlighting both experimental techniques and organismal responses.</em></p>

<hr />

<h2 id="inducing-spawning">Inducing spawning</h2>

<p>Adult purple sea urchins (<em>Heliocidaris crassispina</em>) were induced to spawn using <strong>potassium chloride (KCl) injection</strong>, a standard method for stimulating gamete release.</p>

<p>A sterile syringe was used to inject approximately <strong>1 mL of 1.0 M KCl solution</strong> into the coelomic cavity through the peristomial membrane.</p>

<p>Within minutes, individuals began releasing gametes:</p>

<ul>
  <li>Females released clouds of orange eggs into filtered seawater</li>
  <li>Males released white sperm directly into dry containers to maintain concentration</li>
</ul>

<p><img src="/images/blogs/urchin_larvae/spawning.jpg" alt="Sea urchin spawning after KCl injection" /></p>

<p><em>Figure 1. Adult sea urchins releasing gametes following KCl injection.</em></p>

<hr />

<h2 id="egg-collection-and-washing">Egg collection and washing</h2>

<p>Eggs were gently collected using wide-bore pipettes to avoid mechanical damage.</p>

<p>To remove debris and excess coelomic fluid, eggs were washed <strong>three times</strong> with filtered seawater:</p>

<ol>
  <li>Eggs allowed to settle by gravity</li>
  <li>Supernatant carefully removed</li>
  <li>Fresh filtered seawater added</li>
</ol>

<p>This ensured high-quality eggs for fertilization.</p>

<p><img src="/images/blogs/urchin_larvae/eggs.jpg" alt="Collected sea urchin eggs" /></p>

<p><em>Figure 2. Collected eggs after washing in filtered seawater.</em></p>

<hr />

<h2 id="fertilization">Fertilization</h2>

<p>Concentrated sperm was diluted in seawater to create a working sperm solution.</p>

<p>A small volume of diluted sperm was added dropwise to the egg suspension while gently swirling.</p>

<p>Successful fertilization was confirmed by the appearance of a <strong>fertilization membrane</strong> around eggs within several minutes.</p>

<p><img src="/images/blogs/urchin_larvae/fertilized_eggs.jpg" alt="Fertilized eggs showing fertilization membrane" /></p>

<p><em>Figure 3. Fertilized eggs with visible fertilization envelopes.</em></p>

<hr />

<h2 id="early-embryonic-development">Early embryonic development</h2>

<p>Following fertilization, embryos were maintained in gently aerated culture vessels under defined:</p>

<ul>
  <li>Temperature treatments</li>
  <li>Salinity treatments</li>
</ul>

<p>Cleavage occurred rapidly and synchronously, with embryos progressing through a series of well-defined developmental stages from early cell division to gastrulation (Figure 4).</p>

<p><img src="/images/blogs/urchin_larvae/embryos.jpg" alt="Early embryo stages" /></p>

<p><em>Figure 4. Early embryonic development stages.</em> 
(A) Two-cell stage shortly after the first cleavage division, showing two equal-sized blastomeres within the fertilization envelope.
(B) Four-cell stage following the second cleavage, with blastomeres arranged symmetrically.
(C) Eight-cell stage as continued cleavage increases cell number and reduces individual cell size.
(D) Sixteen-cell stage, marking the transition toward more compact cellular organization.
(E) Blastula stage, characterized by a spherical embryo with a developing blastocoel and a smooth outer cell layer.
(F) Gastrula stage, showing clear morphological differentiation and the onset of gastrulation with tissue invagination.</p>

<hr />

<h2 id="two-arm-larval-stage">Two-arm larval stage</h2>

<p>After several days, larvae developed characteristic skeletal arms, marking the planktonic feeding stage.</p>

<p><img src="/images/blogs/urchin_larvae/two_arms.jpg" alt="Two-arm larvae" /></p>

<p><em>Figure 5. Two-arm pluteus larvae during early development.</em></p>

<hr />

<h2 id="six-arm-larval-stage">Six-arm larval stage</h2>

<p>With continued growth and feeding, larvae extended additional arms and increased in size.</p>

<p><img src="/images/blogs/urchin_larvae/six_arms.jpg" alt="Six-arm larvae" /></p>

<p><em>Figure 6. Six-arm larvae showing advanced skeletal development.</em></p>

<hr />

<h2 id="metamorphosis">Metamorphosis</h2>

<h3 id="settlement-and-metamorphic-transition">Settlement and metamorphic transition</h3>

<p>Competent larvae eventually settled onto suitable surfaces and initiated metamorphosis.</p>

<p>This process involved:</p>

<ul>
  <li>Loss of larval arms</li>
  <li>Formation of radial symmetry</li>
  <li>Development of juvenile structures</li>
</ul>

<p><img src="/images/blogs/urchin_larvae/metamorphosis.gif" alt="Larvae undergoing metamorphosis" /></p>

<p><em>Figure 7. Metamorphic transition from larva to juvenile.</em></p>

<h3 id="abnormal-metamorphosis-under-thermal-and-salinity-stress">Abnormal metamorphosis under thermal and salinity stress</h3>

<p>Under combined temperature and salinity treatments, a subset of larvae exhibited abnormal or incomplete metamorphosis (Figure 8). These individuals showed disrupted morphological transitions, including irregular body shapes, partial reabsorption of larval structures, and malformed juvenile features.</p>

<p>Such abnormalities suggest that environmental stress during early development can interfere with the tightly regulated processes of settlement and tissue reorganization, potentially reducing post-settlement survival and recruitment success.</p>

<p><img src="/images/blogs/urchin_larvae/abnormal_metamorph.gif" alt="Abnormal metamorphic development" /></p>

<p><em>Figure 8. Abnormal metamorphic development under combined temperature and salinity treatments.</em>
Larvae exposed to elevated temperature and altered salinity showed incomplete or abnormal metamorphic transitions. In this image, two individuals appear to be partially fused, suggesting strong developmental disturbance under stress conditions.</p>

<hr />

<h2 id="juvenile-sea-urchins">Juvenile sea urchins</h2>

<p>Following metamorphosis, individuals developed into benthic juveniles with visible spines and test structure.</p>

<p><img src="/images/blogs/urchin_larvae/juvenile.jpg" alt="Juvenile sea urchin" /></p>

<p><em>Figure 9. Newly formed juvenile sea urchins.</em></p>

<hr />

<h2 id="experimental-significance">Experimental significance</h2>

<p>Tracking individuals from fertilization through juvenile stages allows assessment of:</p>

<ul>
  <li>Developmental sensitivity to temperature elevation</li>
  <li>Impacts of salinity stress on growth and survival</li>
  <li>Carry-over effects across life stages</li>
</ul>

<p>These early-life responses play a crucial role in shaping population resilience under increasing climate extremes.</p>

<hr />

<h2 id="final-reflections">Final reflections</h2>

<p>Culturing sea urchins across complete developmental cycles provides direct insight into how environmental stress influences:</p>

<ul>
  <li>Developmental timing</li>
  <li>Morphological integrity</li>
  <li>Settlement success</li>
</ul>

<p>The images presented here reflect both the technical process and the biological consequences of climate-driven stressors.</p>

<hr />

<h2 id="end">END</h2>

<hr />

<p><em>Copyright notice:</em><br />
© 2026 Zhengquan Zhou. All images and figures presented in this blog are the intellectual property of the author and are protected by copyright. Unauthorized reproduction or distribution is prohibited without written permission. Academic and educational use is permitted with proper citation of this page.</p>

<hr />]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Blog" /><summary type="html"><![CDATA[This post followed sea urchins from induced spawning through fertilization, larval development, metamorphosis, and juvenile formation under controlled temperature and salinity treatments. The post documents each stage of the cultivation process, highlighting both experimental techniques and organismal responses.]]></summary></entry><entry><title type="html">[Blog] Spatial and Thermal-Stress Dynamics of Native and Introduced Bivalves in the Eastern Scheldt</title><link href="https://zhengquanzhou.com/blog/spatial-thermal-dynamics-bivalves/" rel="alternate" type="text/html" title="[Blog] Spatial and Thermal-Stress Dynamics of Native and Introduced Bivalves in the Eastern Scheldt" /><published>2025-12-20T00:00:00+09:00</published><updated>2025-12-20T00:00:00+09:00</updated><id>https://zhengquanzhou.com/blog/spatial-thermal-dynamics-bivalves</id><content type="html" xml:base="https://zhengquanzhou.com/blog/spatial-thermal-dynamics-bivalves/"><![CDATA[<p><em>This post documents an end-to-end R workflow that combines long-term benthic surveys (Eastern Scheldt) with mesocosm survival experiments to compare a native cockle and an introduced Manila clam under compound thermal and salinity stress.</em></p>

<hr />

<h2 id="overview">Overview</h2>

<p>Core components of the pipeline:</p>

<ul>
  <li>Filter <strong>large adults</strong> to reduce early-life stochasticity and emphasize habitat-integrated survival signals.</li>
  <li>Map adult <strong>spatial distributions</strong> (Google satellite basemap) with fixed <strong>abundance classes</strong>.</li>
  <li>Estimate adult <strong>habitat intensity</strong> using abundance-weighted KDE.</li>
  <li>Quantify <strong>temporal persistence</strong> (years occupied) per station.</li>
  <li>Track <strong>abundance-weighted centroid shifts</strong> through time.</li>
  <li>Model <strong>abundance vs. summer thermal extremes</strong> using Gamma GLMs.</li>
  <li>Derive a <strong>compound-stress establishment window</strong> from mesocosm survival data.</li>
</ul>

<p><strong>Project assets (figures + code):</strong></p>

<ul>
  <li>Full workflow script: <a href="/images/blogs/bivalve_spatial_analysis/run_all_bothSpecies.R">run_all_bothSpecies.R</a></li>
</ul>

<hr />

<h2 id="data-background">Data background</h2>

<p>Long-term benthic monitoring in the Eastern Scheldt (Rijkswaterstaat / WMR; curated by Troost et al.) has tracked abundance and distributions of bivalves since 1990. This workflow focuses on <strong>2014–2021</strong>, when:</p>

<ul>
  <li><em>R. philippinarum</em> is fully established across the system,</li>
  <li>Temperature records enable explicit quantification of summer heat extremes,</li>
  <li>A subset of <strong>111 monitoring stations</strong> contains adult individuals of <strong>both species</strong>, providing a habitat-controlled comparison.</li>
</ul>

<p>Two focal species:</p>

<ul>
  <li><strong>Native cockle</strong> (<em>Cerastoderma edule</em>)</li>
  <li><strong>Introduced Manila clam</strong> (<em>Ruditapes philippinarum</em>)</li>
</ul>

<hr />

<h2 id="why-focus-on-large-adults">Why focus on large adults</h2>

<p>Juveniles and larvae are strongly influenced by hydrodynamic transport, storms, and settlement pulses, so their spatial patterns can be noisy and weakly related to habitat quality. By contrast, <strong>large adults</strong>:</p>

<ul>
  <li>survive ≥ 1–2 winters,</li>
  <li>integrate multiple seasons of environmental filtering,</li>
  <li>provide stable, interpretable spatial signals.</li>
</ul>

<hr />

<h2 id="size-and-age-class-definitions">Size and age class definitions</h2>

<h3 id="cockle-cerastoderma-edule--age-classes">Cockle (<em>Cerastoderma edule</em>) — age classes</h3>

<table>
  <thead>
    <tr>
      <th>Class</th>
      <th>Meaning</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1j</td>
      <td>1-year-old juvenile</td>
    </tr>
    <tr>
      <td>2j</td>
      <td>2-year-old</td>
    </tr>
    <tr>
      <td>mj</td>
      <td>&gt;2-year adult</td>
    </tr>
    <tr>
      <td>nb</td>
      <td>age undetermined</td>
    </tr>
  </tbody>
</table>

<p><strong>Large adults = 2j + mj</strong> (rare 0j recruits are merged into 1j).</p>

<h3 id="manila-clam-ruditapes-philippinarum--size-classes">Manila clam (<em>Ruditapes philippinarum</em>) — size classes</h3>

<p>Thresholds changed through time:</p>

<table>
  <thead>
    <tr>
      <th>Years</th>
      <th>Small</th>
      <th>Large</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2014–2017</td>
      <td>&lt;1.5 cm</td>
      <td>&gt;1.5 cm</td>
    </tr>
    <tr>
      <td>2018–2021</td>
      <td>&lt;2.0 cm</td>
      <td>&gt;2.0 cm</td>
    </tr>
  </tbody>
</table>

<p>To keep consistency, large adults are identified as <strong>“grt”</strong> across years (2016 excluded for size-based inference).</p>

<hr />

<h2 id="outputs-figures">Outputs (figures)</h2>

<p><img src="/images/blogs/bivalve_spatial_analysis/abundance_bothSpecies_google_6classes.png" alt="Spatial distribution of large adults" />
<em>Figure 1. Spatial distribution of large adults for native cockles and introduced Manila clams (six abundance classes).</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/habitat_intensity_bothSpecies_google.png" alt="Adult habitat intensity (KDE)" />
<em>Figure 2. Adult habitat intensity of large adults (KDE weighted by abundance) for both species.</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/temporal_persistence_bothSpecies_google.png" alt="Temporal persistence" />
<em>Figure 3. Temporal persistence of large adults (years occupied) for both species.</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/centroid_shift_clean_bothSpecies_globalScale_8classes.png" alt="Centroid shifts" />
<em>Figure 4. Abundance-weighted centroid shifts through time (point size indicates total annual abundance).</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/mesocosm_setup.png" alt="Mesocosm setup" />
<em>Figure 5. Mesocosm system used to simulate compound heatwave × salinity stress.</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/diff_mRateWINDOW_neo1.png" alt="Species survival difference window" />
<em>Figure 6. Species survival difference under compound stress, highlighting an establishment window favoring the introduced clam.</em></p>

<p><img src="/images/blogs/bivalve_spatial_analysis/twoSps_tempSum.png" alt="Abundance vs temperature extremes" />
<em>Figure 7. Adult abundance vs. summer thermal extremes (daily temperature sum above the 90th percentile), matched to next-year survey abundance.</em></p>

<hr />

<h2 id="tutorial-reproduce-the-full-pipeline-with-complete-r-code">Tutorial: reproduce the full pipeline (with complete R code)</h2>

<p>This section rewrites the full <code class="language-plaintext highlighter-rouge">run_all_bothSpecies.R</code> pipeline as a step-by-step tutorial. You can copy/paste sections into an R script or run them interactively.</p>

<p><strong>Files used (expected in your working directory):</strong></p>

<ul>
  <li>Data can be found at this Github repository: <a href="https://github.com/zqzhou7/bivalve_thermal_thresholds.git">bivalve_thermal_thresholds</a></li>
  <li>Field survey data: <code class="language-plaintext highlighter-rouge">WMR_WOTdata_OS1421_20221121.xlsx</code> (sheet: <code class="language-plaintext highlighter-rouge">data_OS1421</code>)</li>
  <li>Temperature data: <code class="language-plaintext highlighter-rouge">schiphol70yrs.csv</code></li>
  <li>Mesocosm survival data: <code class="language-plaintext highlighter-rouge">sr_2sp.csv</code></li>
</ul>

<p><strong>Tip:</strong> Run everything at once via:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">source</span><span class="p">(</span><span class="s2">"run_all_bothSpecies.R"</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="0-setup">0) Setup</h2>

<h3 id="libraries--helper-functions">Libraries + helper functions</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">library</span><span class="p">(</span><span class="n">readxl</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggmap</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggrepel</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">lubridate</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">patchwork</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">viridis</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">zoo</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">raster</span><span class="p">)</span><span class="w">

</span><span class="c1"># simple SE function</span><span class="w">
</span><span class="n">std_error</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="n">sd</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">x</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<h3 id="google-maps-basemap-api-key">Google Maps basemap (API key)</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Google API key (kept out of script)</span><span class="w">
</span><span class="n">google_key</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">Sys.getenv</span><span class="p">(</span><span class="s2">"GOOGLE_MAPS_API_KEY"</span><span class="p">)</span><span class="w">
</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">identical</span><span class="p">(</span><span class="n">google_key</span><span class="p">,</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nf">is.na</span><span class="p">(</span><span class="n">google_key</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="n">stop</span><span class="p">(</span><span class="s2">"Please set GOOGLE_MAPS_API_KEY in your environment (e.g. in .Renviron)."</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">register_google</span><span class="p">(</span><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">google_key</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="1-load-and-process-field-data">1) Load and process field data</h2>

<h3 id="load-wmr-survey-data">Load WMR survey data</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df.shell</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_excel</span><span class="p">(</span><span class="s2">"WMR_WOTdata_OS1421_20221121.xlsx"</span><span class="p">,</span><span class="w"> </span><span class="n">sheet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"data_OS1421"</span><span class="p">)</span><span class="w">
</span><span class="n">df.nz</span><span class="w">    </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df.shell</span><span class="p">[</span><span class="n">df.shell</span><span class="o">$</span><span class="n">N_m2</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="n">colnames</span><span class="p">(</span><span class="n">df.nz</span><span class="p">)[</span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"project_id"</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">df.nz</span><span class="p">)[</span><span class="m">3</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"station_id"</span><span class="w">
</span></code></pre></div></div>

<h3 id="subset-large-adult-classes">Subset large adult classes</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df.grt</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">subset</span><span class="p">(</span><span class="n">df.nz</span><span class="p">,</span><span class="w"> </span><span class="n">Class</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"2j"</span><span class="p">,</span><span class="w"> </span><span class="s2">"mj"</span><span class="p">,</span><span class="w"> </span><span class="s2">"grt"</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<h3 id="identify-year--station-entries-where-both-species-co-occur">Identify year × station entries where both species co-occur</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df.grt</span><span class="o">$</span><span class="n">year_station</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">paste</span><span class="p">(</span><span class="n">df.grt</span><span class="o">$</span><span class="n">Year</span><span class="p">,</span><span class="w">
                             </span><span class="n">df.grt</span><span class="o">$</span><span class="n">station_id</span><span class="p">,</span><span class="w">
                             </span><span class="n">df.grt</span><span class="o">$</span><span class="n">Longitude</span><span class="p">,</span><span class="w">
                             </span><span class="n">df.grt</span><span class="o">$</span><span class="n">Latitude</span><span class="p">,</span><span class="w">
                             </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"_"</span><span class="p">)</span><span class="w">

</span><span class="n">ys_list</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">unique</span><span class="p">(</span><span class="n">df.grt</span><span class="o">$</span><span class="n">year_station</span><span class="p">)</span><span class="w">

</span><span class="c1"># this follows your original approach (using an empty template)</span><span class="w">
</span><span class="n">df_ysNeo</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df.grt</span><span class="p">[</span><span class="o">-</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">1842</span><span class="p">),</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">ys_list</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="n">df_ys</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df.grt</span><span class="p">[</span><span class="n">df.grt</span><span class="o">$</span><span class="n">year_station</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">
  </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">is.element</span><span class="p">(</span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="n">df_ys</span><span class="o">$</span><span class="n">Species</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w">
      </span><span class="n">is.element</span><span class="p">(</span><span class="s2">"Ruditapes philippinarum"</span><span class="p">,</span><span class="w"> </span><span class="n">df_ys</span><span class="o">$</span><span class="n">Species</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="n">df_ysNeo</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">df_ysNeo</span><span class="p">,</span><span class="w"> </span><span class="n">df_ys</span><span class="p">)</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="aggregate-adult-abundance-per-year--station--species">Aggregate adult abundance per year × station × species</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df_ysNeo</span><span class="o">$</span><span class="n">lbs</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">paste</span><span class="p">(</span><span class="n">df_ysNeo</span><span class="o">$</span><span class="n">year_station</span><span class="p">,</span><span class="w"> </span><span class="n">df_ysNeo</span><span class="o">$</span><span class="n">Species</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"_"</span><span class="p">)</span><span class="w">

</span><span class="n">lbs_sum</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">df_ysNeo</span><span class="o">$</span><span class="n">N_m2</span><span class="p">,</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="n">df_ysNeo</span><span class="o">$</span><span class="n">lbs</span><span class="p">),</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">lbs_sum</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"lbs"</span><span class="p">,</span><span class="w"> </span><span class="s2">"abun"</span><span class="p">)</span><span class="w">

</span><span class="n">lbs_sum</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">separate</span><span class="p">(</span><span class="w">
  </span><span class="n">lbs_sum</span><span class="p">,</span><span class="w">
  </span><span class="n">col</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">lbs</span><span class="p">,</span><span class="w">
  </span><span class="n">into</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"year"</span><span class="p">,</span><span class="w"> </span><span class="s2">"station_id"</span><span class="p">,</span><span class="w"> </span><span class="s2">"longitude"</span><span class="p">,</span><span class="w"> </span><span class="s2">"latitude"</span><span class="p">,</span><span class="w"> </span><span class="s2">"species"</span><span class="p">),</span><span class="w">
  </span><span class="n">sep</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"_"</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">longitude</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">longitude</span><span class="p">)</span><span class="w">
</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">latitude</span><span class="w">  </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">latitude</span><span class="p">)</span><span class="w">
</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">year</span><span class="w">      </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">lbs_sum</span><span class="o">$</span><span class="n">year</span><span class="p">)</span><span class="w">

</span><span class="n">write.csv</span><span class="p">(</span><span class="n">lbs_sum</span><span class="p">,</span><span class="w"> </span><span class="s2">"lbs_sum.csv"</span><span class="p">,</span><span class="w"> </span><span class="n">row.names</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h3 id="prepare-a-clean-adult-dataset-for-mapping">Prepare a clean adult dataset for mapping</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df_adults</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df.grt</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">filter</span><span class="p">(</span><span class="n">Species</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ruditapes philippinarum"</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">Species</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="w">
      </span><span class="n">Species</span><span class="p">,</span><span class="w">
      </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ruditapes philippinarum"</span><span class="p">),</span><span class="w">
      </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Native: Cerastoderma edule"</span><span class="p">,</span><span class="w">
                 </span><span class="s2">"Introduced: Ruditapes philippinarum"</span><span class="p">)</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="2-abundance-map-both-species-6-classes">2) Abundance map (both species, 6 classes)</h2>

<h3 id="basemap">Basemap</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bb</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">make_bbox</span><span class="p">(</span><span class="w">
  </span><span class="n">lon</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">df_adults</span><span class="o">$</span><span class="n">Longitude</span><span class="p">,</span><span class="w">
  </span><span class="n">lat</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">df_adults</span><span class="o">$</span><span class="n">Latitude</span><span class="p">,</span><span class="w">
  </span><span class="n">f</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="m">0.05</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">base_map</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">get_map</span><span class="p">(</span><span class="w">
  </span><span class="n">location</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bb</span><span class="p">,</span><span class="w">
  </span><span class="n">source</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"google"</span><span class="p">,</span><span class="w">
  </span><span class="n">maptype</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"satellite"</span><span class="p">,</span><span class="w">
  </span><span class="n">zoom</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h3 id="plot">Plot</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ---- 6-class abundance scheme (locked-in) ----</span><span class="w">
</span><span class="n">df_adults</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df_adults</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">AbundClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cut</span><span class="p">(</span><span class="w">
    </span><span class="n">N_m2</span><span class="p">,</span><span class="w">
    </span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">25</span><span class="p">,</span><span class="w"> </span><span class="m">100</span><span class="p">,</span><span class="w"> </span><span class="m">400</span><span class="p">,</span><span class="w"> </span><span class="m">800</span><span class="p">,</span><span class="w"> </span><span class="m">1200</span><span class="p">,</span><span class="w"> </span><span class="kc">Inf</span><span class="p">),</span><span class="w">
    </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"0–25"</span><span class="p">,</span><span class="w"> </span><span class="s2">"26–100"</span><span class="p">,</span><span class="w"> </span><span class="s2">"101–400"</span><span class="p">,</span><span class="w">
               </span><span class="s2">"401–800"</span><span class="p">,</span><span class="w"> </span><span class="s2">"801–1200"</span><span class="p">,</span><span class="w"> </span><span class="s2">"&gt;1200"</span><span class="p">),</span><span class="w">
    </span><span class="n">right</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="w">
  </span><span class="p">))</span><span class="w">

</span><span class="n">size_values</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">2.5</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">7.5</span><span class="p">,</span><span class="w"> </span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="m">12.5</span><span class="p">,</span><span class="w"> </span><span class="m">15</span><span class="p">)</span><span class="w">

</span><span class="n">p_abund_both</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggmap</span><span class="p">(</span><span class="n">base_map</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_adults</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Longitude</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Latitude</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AbundClass</span><span class="p">),</span><span class="w">
    </span><span class="n">shape</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">21</span><span class="p">,</span><span class="w">
    </span><span class="n">fill</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w">
    </span><span class="n">color</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w">
    </span><span class="n">alpha</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">0.85</span><span class="p">,</span><span class="w">
    </span><span class="n">stroke</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.7</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_size_manual</span><span class="p">(</span><span class="w">
    </span><span class="n">name</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"Adult abundance
(ind. m⁻²)"</span><span class="p">,</span><span class="w">
    </span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size_values</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="w"> </span><span class="n">Species</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Spatial distribution of large adults"</span><span class="p">,</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Longitude (°E)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Latitude (°N)"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_minimal</span><span class="p">(</span><span class="n">base_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">strip.text</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">13</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">panel.grid</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
    </span><span class="n">legend.position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"right"</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">p_abund_both</span><span class="w">

</span><span class="n">ggsave</span><span class="p">(</span><span class="w">
  </span><span class="s2">"abundance_bothSpecies_google_6classes.png"</span><span class="p">,</span><span class="w">
  </span><span class="n">p_abund_both</span><span class="p">,</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">11</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">dpi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="3-habitat-intensity-map-kde-intensity-both-species">3) Habitat intensity map (KDE intensity, both species)</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">p_int_both</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggmap</span><span class="p">(</span><span class="n">base_map</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">stat_density_2d</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_adults</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Longitude</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Latitude</span><span class="p">,</span><span class="w">
        </span><span class="n">fill</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">after_stat</span><span class="p">(</span><span class="n">level</span><span class="p">),</span><span class="w">
        </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">after_stat</span><span class="p">(</span><span class="n">level</span><span class="p">),</span><span class="w">
        </span><span class="n">weight</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">N_m2</span><span class="p">),</span><span class="w">
    </span><span class="n">geom</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="s2">"polygon"</span><span class="p">,</span><span class="w">
    </span><span class="n">colour</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="kc">NA</span><span class="p">,</span><span class="w">
    </span><span class="n">bins</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="m">8</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_viridis</span><span class="p">(</span><span class="w">
    </span><span class="n">option</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C"</span><span class="p">,</span><span class="w">
    </span><span class="n">name</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"Adult habitat
intensity"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_alpha</span><span class="p">(</span><span class="n">range</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0.2</span><span class="p">,</span><span class="w"> </span><span class="m">0.8</span><span class="p">),</span><span class="w"> </span><span class="n">guide</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"none"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="w"> </span><span class="n">Species</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Adult habitat intensity (large size classes)"</span><span class="p">,</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Longitude (°E)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Latitude (°N)"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_minimal</span><span class="p">(</span><span class="n">base_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">strip.text</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">13</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">panel.grid</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
    </span><span class="n">legend.position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"right"</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">p_int_both</span><span class="w">

</span><span class="n">ggsave</span><span class="p">(</span><span class="w">
  </span><span class="s2">"habitat_intensity_bothSpecies_google.png"</span><span class="p">,</span><span class="w">
  </span><span class="n">p_int_both</span><span class="p">,</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">11</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">dpi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="4-abundance--tempsum-regression-plots-both-species">4) Abundance ~ tempSum regression plots (both species)</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ---- Load temperature data ----</span><span class="w">
</span><span class="n">all_70year</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read.csv</span><span class="p">(</span><span class="s2">"schiphol70yrs.csv"</span><span class="p">,</span><span class="w"> </span><span class="n">header</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">

</span><span class="n">lbs_sum_corr</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">lbs_sum</span><span class="w">
</span><span class="n">lbs_sum_corr</span><span class="o">$</span><span class="n">label1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="n">lbs_sum_corr</span><span class="o">$</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="s2">"_"</span><span class="p">,</span><span class="w"> </span><span class="n">lbs_sum_corr</span><span class="o">$</span><span class="n">species</span><span class="p">)</span><span class="w">

</span><span class="n">spsYrmean</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">abun</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lbs_sum_corr</span><span class="p">,</span><span class="w"> </span><span class="n">FUN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean</span><span class="p">)</span><span class="w">
</span><span class="n">spsYrSe</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">abun</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lbs_sum_corr</span><span class="p">,</span><span class="w"> </span><span class="n">FUN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std_error</span><span class="p">)</span><span class="w">
</span><span class="n">spsYrSd</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">abun</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lbs_sum_corr</span><span class="p">,</span><span class="w"> </span><span class="n">FUN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sd</span><span class="p">)</span><span class="w">
</span><span class="n">spsYrlnth</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">abun</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lbs_sum_corr</span><span class="p">,</span><span class="w"> </span><span class="n">FUN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">length</span><span class="p">)</span><span class="w">

</span><span class="n">spsYrmean</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">separate</span><span class="p">(</span><span class="n">spsYrmean</span><span class="p">,</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">into</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"year"</span><span class="p">,</span><span class="w"> </span><span class="s2">"sps"</span><span class="p">),</span><span class="w"> </span><span class="s2">"_"</span><span class="p">)</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">spsYrmean</span><span class="p">)[</span><span class="m">3</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"abun_mean"</span><span class="w">

</span><span class="n">spsYrSe</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">separate</span><span class="p">(</span><span class="n">spsYrSe</span><span class="p">,</span><span class="w">   </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">into</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"year"</span><span class="p">,</span><span class="w"> </span><span class="s2">"sps"</span><span class="p">),</span><span class="w"> </span><span class="s2">"_"</span><span class="p">)</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">spsYrSe</span><span class="p">)[</span><span class="m">3</span><span class="p">]</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"abun_se"</span><span class="w">

</span><span class="n">spsYrlnth</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">separate</span><span class="p">(</span><span class="n">spsYrlnth</span><span class="p">,</span><span class="w"> </span><span class="n">label1</span><span class="p">,</span><span class="w"> </span><span class="n">into</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"year"</span><span class="p">,</span><span class="w"> </span><span class="s2">"sps"</span><span class="p">),</span><span class="w"> </span><span class="s2">"_"</span><span class="p">)</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">spsYrlnth</span><span class="p">)[</span><span class="m">3</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"station_reps"</span><span class="w">

</span><span class="n">df_spsAT</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">spsYrmean</span><span class="w">

</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">abun_se</span><span class="w">      </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">spsYrSe</span><span class="o">$</span><span class="n">abun_se</span><span class="w">

</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">station_reps</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">spsYrlnth</span><span class="o">$</span><span class="n">station_reps</span><span class="w">

</span><span class="c1"># ---- Temperature time series ----</span><span class="w">
</span><span class="n">temp_70year</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">all_70year</span><span class="p">[</span><span class="o">!</span><span class="nf">is.na</span><span class="p">(</span><span class="n">all_70year</span><span class="o">$</span><span class="n">YYYYMMDD</span><span class="p">),</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="m">14</span><span class="p">)]</span><span class="w">
</span><span class="n">temp_70year</span><span class="o">$</span><span class="n">TN</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp_70year</span><span class="o">$</span><span class="n">TN</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">10</span><span class="w">
</span><span class="n">temp_70year</span><span class="o">$</span><span class="n">TX</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp_70year</span><span class="o">$</span><span class="n">TX</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">10</span><span class="w">

</span><span class="n">temp_70year</span><span class="o">$</span><span class="n">date</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">as.Date</span><span class="p">(</span><span class="nf">as.character</span><span class="p">(</span><span class="n">temp_70year</span><span class="o">$</span><span class="n">YYYYMMDD</span><span class="p">),</span><span class="w">
                            </span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"%Y%m%d"</span><span class="p">)</span><span class="w">

</span><span class="n">temp_70year</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp_70year</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymd</span><span class="p">(</span><span class="n">date</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">year</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">year</span><span class="p">(</span><span class="n">date</span><span class="p">),</span><span class="w">
    </span><span class="n">month</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">month</span><span class="p">(</span><span class="n">date</span><span class="p">),</span><span class="w">
    </span><span class="n">day</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">day</span><span class="p">(</span><span class="n">date</span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">temp1421</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp_70year</span><span class="p">[</span><span class="n">temp_70year</span><span class="o">$</span><span class="n">year</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">2013</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">temp_70year</span><span class="o">$</span><span class="n">year</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="m">2022</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="c1"># 90th percentile threshold</span><span class="w">
</span><span class="n">thr_90</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">quantile</span><span class="p">(</span><span class="n">temp1421</span><span class="o">$</span><span class="n">TX</span><span class="p">,</span><span class="w"> </span><span class="n">probs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">  </span><span class="c1"># ~23.7 °C</span><span class="w">

</span><span class="n">temp30h</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp1421</span><span class="p">[</span><span class="n">temp1421</span><span class="o">$</span><span class="n">TX</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">thr_90</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="n">temp30h</span><span class="o">$</span><span class="n">TX30diff</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">temp30h</span><span class="o">$</span><span class="n">TX</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">thr_90</span><span class="w">

</span><span class="n">sumYear30h</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">TX30diff</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">temp30h</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w">

</span><span class="n">sY30h</span><span class="w">      </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">TX30diff</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">temp30h</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="p">)</span><span class="w">

</span><span class="n">sY30h_se</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">aggregate</span><span class="p">(</span><span class="n">TX30diff</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">temp30h</span><span class="p">,</span><span class="w"> </span><span class="n">std_error</span><span class="p">)</span><span class="w">

</span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">duration</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sY30h</span><span class="o">$</span><span class="n">TX30diff</span><span class="w">
</span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">stad_error</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sY30h_se</span><span class="o">$</span><span class="n">TX30diff</span><span class="w">
</span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">year_match</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">year</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="w">

</span><span class="c1"># ---- Match summer temp sums to next-year abundance ----</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">TX30diff</span><span class="p">[</span><span class="n">match</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">year_match</span><span class="p">)]</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">duration</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">duration</span><span class="p">[</span><span class="n">match</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">year_match</span><span class="p">)]</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff_se</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">stad_error</span><span class="p">[</span><span class="n">match</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">year</span><span class="p">,</span><span class="w"> </span><span class="n">sumYear30h</span><span class="o">$</span><span class="n">year_match</span><span class="p">)]</span><span class="w">

</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">year</span><span class="w">        </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">year</span><span class="p">)</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">abun_mean</span><span class="w">   </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">abun_mean</span><span class="p">)</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">abun_se</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">abun_se</span><span class="p">)</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff</span><span class="w">    </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff</span><span class="p">)</span><span class="w">
</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff_se</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">TX30diff_se</span><span class="p">)</span><span class="w">

</span><span class="n">df_spsAT_ce</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df_spsAT</span><span class="p">[</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">sps</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="n">df_spsAT_rp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df_spsAT</span><span class="p">[</span><span class="n">df_spsAT</span><span class="o">$</span><span class="n">sps</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Ruditapes philippinarum"</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="c1"># ---- Gamma GLMs ----</span><span class="w">
</span><span class="n">glm_model_ce</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">glm</span><span class="p">(</span><span class="n">abun_mean</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">TX30diff</span><span class="p">,</span><span class="w">
                    </span><span class="n">data</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">df_spsAT_ce</span><span class="p">,</span><span class="w">
                    </span><span class="n">family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Gamma</span><span class="p">(</span><span class="n">link</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"log"</span><span class="p">))</span><span class="w">

</span><span class="n">glm_model_rp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">glm</span><span class="p">(</span><span class="n">abun_mean</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">TX30diff</span><span class="p">,</span><span class="w">
                    </span><span class="n">data</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">df_spsAT_rp</span><span class="p">,</span><span class="w">
                    </span><span class="n">family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Gamma</span><span class="p">(</span><span class="n">link</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"log"</span><span class="p">))</span><span class="w">

</span><span class="n">coef_intercept_ce</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">coef</span><span class="p">(</span><span class="n">glm_model_ce</span><span class="p">)[</span><span class="m">1</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">
</span><span class="n">coef_slope_ce</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">coef</span><span class="p">(</span><span class="n">glm_model_ce</span><span class="p">)[</span><span class="m">2</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">

</span><span class="n">coef_intercept_rp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">coef</span><span class="p">(</span><span class="n">glm_model_rp</span><span class="p">)[</span><span class="m">1</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">
</span><span class="n">coef_slope_rp</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">coef</span><span class="p">(</span><span class="n">glm_model_rp</span><span class="p">)[</span><span class="m">2</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">

</span><span class="n">glm_summary_ce</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">summary</span><span class="p">(</span><span class="n">glm_model_ce</span><span class="p">)</span><span class="w">
</span><span class="n">t_value_ce</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">glm_summary_ce</span><span class="o">$</span><span class="n">coefficients</span><span class="p">[</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"t value"</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">
</span><span class="n">p_value_ce</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">glm_summary_ce</span><span class="o">$</span><span class="n">coefficients</span><span class="p">[</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"Pr(&gt;|t|)"</span><span class="p">],</span><span class="w"> </span><span class="m">4</span><span class="p">)</span><span class="w">

</span><span class="n">glm_summary_rp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">summary</span><span class="p">(</span><span class="n">glm_model_rp</span><span class="p">)</span><span class="w">
</span><span class="n">t_value_rp</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">glm_summary_rp</span><span class="o">$</span><span class="n">coefficients</span><span class="p">[</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"t value"</span><span class="p">],</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w">
</span><span class="n">p_value_rp</span><span class="w">     </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">round</span><span class="p">(</span><span class="n">glm_summary_rp</span><span class="o">$</span><span class="n">coefficients</span><span class="p">[</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"Pr(&gt;|t|)"</span><span class="p">],</span><span class="w"> </span><span class="m">4</span><span class="p">)</span><span class="w">

</span><span class="c1"># ---- Regression plots ----</span><span class="w">
</span><span class="n">plot1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggplot</span><span class="p">(</span><span class="n">df_spsAT_ce</span><span class="p">,</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_errorbar</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">abun_se</span><span class="p">,</span><span class="w">
                    </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">abun_se</span><span class="p">),</span><span class="w">
                </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_errorbarh</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">TX30diff_se</span><span class="p">,</span><span class="w">
                     </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">TX30diff_se</span><span class="p">),</span><span class="w">
                 </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_smooth</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">group</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
              </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"glm"</span><span class="p">,</span><span class="w">
              </span><span class="n">method.args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="n">family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Gamma</span><span class="p">(</span><span class="n">link</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"log"</span><span class="p">)),</span><span class="w">
              </span><span class="n">se</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"dashed"</span><span class="p">,</span><span class="w">
              </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">year</span><span class="p">),</span><span class="w">
                  </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">fontface</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w">
                  </span><span class="n">box.padding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">point.padding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.6</span><span class="p">,</span><span class="w">
                  </span><span class="n">max.overlaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Daily Temp. Sum &gt; 90th percentile (°C)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">expression</span><span class="p">(</span><span class="n">bold</span><span class="p">(</span><span class="s2">"Mean abundance (ind./m"</span><span class="o">^</span><span class="m">2</span><span class="o">*</span><span class="s2">")"</span><span class="p">))</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"y == e^("</span><span class="p">,</span><span class="w"> </span><span class="n">coef_intercept_ce</span><span class="p">,</span><span class="w"> </span><span class="s2">" + "</span><span class="p">,</span><span class="w"> </span><span class="n">coef_slope_ce</span><span class="p">,</span><span class="w"> </span><span class="s2">" * x)"</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.1</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"italic(t) == "</span><span class="p">,</span><span class="w"> </span><span class="n">t_value_ce</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.25</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4.5</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"italic(p) == "</span><span class="p">,</span><span class="w"> </span><span class="n">p_value_ce</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.20</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5.1</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_bw</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">panel.border</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_rect</span><span class="p">(</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">NA</span><span class="p">,</span><span class="w"> </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.text.x</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.text.y</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">plot2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggplot</span><span class="p">(</span><span class="n">df_spsAT_rp</span><span class="p">,</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_errorbar</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">abun_se</span><span class="p">,</span><span class="w">
                    </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">abun_mean</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">abun_se</span><span class="p">),</span><span class="w">
                </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_errorbarh</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">TX30diff_se</span><span class="p">,</span><span class="w">
                     </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TX30diff</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">TX30diff_se</span><span class="p">),</span><span class="w">
                 </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.0</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_smooth</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">group</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
              </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"glm"</span><span class="p">,</span><span class="w">
              </span><span class="n">method.args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="n">family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Gamma</span><span class="p">(</span><span class="n">link</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"log"</span><span class="p">)),</span><span class="w">
              </span><span class="n">se</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"dashed"</span><span class="p">,</span><span class="w">
              </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">year</span><span class="p">),</span><span class="w">
                  </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">fontface</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w">
                  </span><span class="n">box.padding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">point.padding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.6</span><span class="p">,</span><span class="w">
                  </span><span class="n">max.overlaps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Daily Temp. Sum &gt; 90th percentile (°C)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">expression</span><span class="p">(</span><span class="n">bold</span><span class="p">(</span><span class="s2">"Mean abundance (ind./m"</span><span class="o">^</span><span class="m">2</span><span class="o">*</span><span class="s2">")"</span><span class="p">))</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"y == e^("</span><span class="p">,</span><span class="w"> </span><span class="n">coef_intercept_rp</span><span class="p">,</span><span class="w"> </span><span class="s2">" + "</span><span class="p">,</span><span class="w"> </span><span class="n">coef_slope_rp</span><span class="p">,</span><span class="w"> </span><span class="s2">" * x)"</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.1</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"italic(t) == "</span><span class="p">,</span><span class="w"> </span><span class="n">t_value_rp</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.25</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4.5</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
           </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"italic(p) == "</span><span class="p">,</span><span class="w"> </span><span class="n">p_value_rp</span><span class="p">),</span><span class="w">
           </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.20</span><span class="p">,</span><span class="w"> </span><span class="n">vjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5.1</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w">
           </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_bw</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">panel.border</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_rect</span><span class="p">(</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">NA</span><span class="p">,</span><span class="w"> </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.text.x</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.text.y</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">combined_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">plot1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">plot2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">plot_layout</span><span class="p">(</span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w">

</span><span class="n">combined_plot</span><span class="w">

</span><span class="n">ggsave</span><span class="p">(</span><span class="w">
  </span><span class="s2">"twoSps_tempSum.png"</span><span class="p">,</span><span class="w">
  </span><span class="n">combined_plot</span><span class="p">,</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">16</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="n">units</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"in"</span><span class="p">,</span><span class="w"> </span><span class="n">dpi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="5-centroid-shift-clean-both-species-global-abundance-scale">5) Centroid shift (clean, both species, global abundance scale)</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">centroids</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df_adults</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">Species</span><span class="p">,</span><span class="w"> </span><span class="n">Year</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">summarise</span><span class="p">(</span><span class="w">
    </span><span class="n">mean_lon</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">weighted.mean</span><span class="p">(</span><span class="n">Longitude</span><span class="p">,</span><span class="w"> </span><span class="n">N_m2</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">),</span><span class="w">
    </span><span class="n">mean_lat</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">weighted.mean</span><span class="p">(</span><span class="n">Latitude</span><span class="p">,</span><span class="w"> </span><span class="n">N_m2</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">),</span><span class="w">
    </span><span class="n">total_abun</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">N_m2</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">),</span><span class="w">
    </span><span class="n">.groups</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="s2">"drop"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">arrange</span><span class="p">(</span><span class="n">Species</span><span class="p">,</span><span class="w"> </span><span class="n">Year</span><span class="p">)</span><span class="w">

</span><span class="n">segments</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">centroids</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">Species</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">summarise</span><span class="p">(</span><span class="w">
    </span><span class="n">x_start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">first</span><span class="p">(</span><span class="n">mean_lon</span><span class="p">),</span><span class="w">
    </span><span class="n">y_start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">first</span><span class="p">(</span><span class="n">mean_lat</span><span class="p">),</span><span class="w">
    </span><span class="n">x_end</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">last</span><span class="p">(</span><span class="n">mean_lon</span><span class="p">),</span><span class="w">
    </span><span class="n">y_end</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">last</span><span class="p">(</span><span class="n">mean_lat</span><span class="p">),</span><span class="w">
    </span><span class="n">.groups</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"drop"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">rowwise</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">dx</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">x_end</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x_start</span><span class="p">,</span><span class="w">
    </span><span class="n">dy</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="n">y_end</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y_start</span><span class="p">,</span><span class="w">
    </span><span class="n">frac</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w">
    </span><span class="n">x_end_short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_start</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">frac</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">dx</span><span class="p">,</span><span class="w">
    </span><span class="n">y_end_short</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y_start</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">frac</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">dy</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">ungroup</span><span class="p">()</span><span class="w">

</span><span class="n">centroids_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">centroids</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">SizeClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cut</span><span class="p">(</span><span class="w">
      </span><span class="n">total_abun</span><span class="p">,</span><span class="w">
      </span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">25</span><span class="p">,</span><span class="w"> </span><span class="m">100</span><span class="p">,</span><span class="w"> </span><span class="m">400</span><span class="p">,</span><span class="w"> </span><span class="m">800</span><span class="p">,</span><span class="w"> </span><span class="m">1200</span><span class="p">,</span><span class="w"> </span><span class="m">5000</span><span class="p">,</span><span class="w"> </span><span class="kc">Inf</span><span class="p">),</span><span class="w">
      </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
        </span><span class="s2">"0–25"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"26–100"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"101–400"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"401–800"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"801–1200"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"1201–5000"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"&gt;5000"</span><span class="w">
      </span><span class="p">),</span><span class="w">
      </span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="w">
    </span><span class="p">),</span><span class="w">
    </span><span class="n">SizeClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="w">
      </span><span class="n">SizeClass</span><span class="p">,</span><span class="w">
      </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
        </span><span class="s2">"0–25"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"26–100"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"101–400"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"401–800"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"801–1200"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"1201–5000"</span><span class="p">,</span><span class="w">
        </span><span class="s2">"&gt;5000"</span><span class="w">
      </span><span class="p">)</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">size_vals_cent</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
  </span><span class="s2">"0–25"</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="m">2.5</span><span class="p">,</span><span class="w">
  </span><span class="s2">"26–100"</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="m">4.0</span><span class="p">,</span><span class="w">
  </span><span class="s2">"101–400"</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="m">6.0</span><span class="p">,</span><span class="w">
  </span><span class="s2">"401–800"</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="m">8.0</span><span class="p">,</span><span class="w">
  </span><span class="s2">"801–1200"</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="m">10.0</span><span class="p">,</span><span class="w">
  </span><span class="s2">"1201–5000"</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">12.0</span><span class="p">,</span><span class="w">
  </span><span class="s2">"&gt;5000"</span><span class="w">      </span><span class="o">=</span><span class="w"> </span><span class="m">15.0</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">p_centroid_clean</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_segment</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">segments</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_start</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y_start</span><span class="p">,</span><span class="w">
        </span><span class="n">xend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_end_short</span><span class="p">,</span><span class="w"> </span><span class="n">yend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y_end_short</span><span class="p">,</span><span class="w">
        </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Species</span><span class="p">),</span><span class="w">
    </span><span class="n">arrow</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="n">arrow</span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"closed"</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">unit</span><span class="p">(</span><span class="m">0.35</span><span class="p">,</span><span class="w"> </span><span class="s2">"cm"</span><span class="p">)),</span><span class="w">
    </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.2</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">centroids_plot</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean_lon</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean_lat</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SizeClass</span><span class="p">),</span><span class="w">
    </span><span class="n">shape</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">21</span><span class="p">,</span><span class="w">
    </span><span class="n">fill</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w">
    </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w">
    </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.95</span><span class="p">,</span><span class="w">
    </span><span class="n">stroke</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.7</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text_repel</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">centroids_plot</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean_lon</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean_lat</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Year</span><span class="p">),</span><span class="w">
    </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">3.5</span><span class="p">,</span><span class="w">
    </span><span class="n">max.overlaps</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="kc">Inf</span><span class="p">,</span><span class="w">
    </span><span class="n">box.padding</span><span class="w">    </span><span class="o">=</span><span class="w"> </span><span class="m">0.25</span><span class="p">,</span><span class="w">
    </span><span class="n">point.padding</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">0.25</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_size_manual</span><span class="p">(</span><span class="w">
    </span><span class="n">name</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"Total adult abundance
(ind. m⁻² per year)"</span><span class="p">,</span><span class="w">
    </span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">size_vals_cent</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_color_manual</span><span class="p">(</span><span class="w">
    </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Species"</span><span class="p">,</span><span class="w">
    </span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
      </span><span class="s2">"Native: Cerastoderma edule"</span><span class="w">          </span><span class="o">=</span><span class="w"> </span><span class="s2">"#0072B2"</span><span class="p">,</span><span class="w">
      </span><span class="s2">"Introduced: Ruditapes philippinarum"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#D55E00"</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="w"> </span><span class="n">Species</span><span class="p">,</span><span class="w"> </span><span class="n">scales</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"free"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Range centroid shifts of large adults (abundance-weighted)"</span><span class="p">,</span><span class="w">
    </span><span class="n">x</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="s2">"Longitude (°E)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="s2">"Latitude (°N)"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_bw</span><span class="p">(</span><span class="n">base_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">strip.text</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">13</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">panel.grid.minor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
    </span><span class="n">legend.position</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"bottom"</span><span class="p">,</span><span class="w">
    </span><span class="n">legend.box</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="s2">"vertical"</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">p_centroid_clean</span><span class="w">

</span><span class="n">ggsave</span><span class="p">(</span><span class="w">
  </span><span class="s2">"centroid_shift_clean_bothSpecies_globalScale_8classes.png"</span><span class="p">,</span><span class="w">
  </span><span class="n">p_centroid_clean</span><span class="p">,</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="n">dpi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="6-temporal-persistence-map-both-species">6) Temporal persistence map (both species)</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df_persist</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df.grt</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">filter</span><span class="p">(</span><span class="n">Species</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ruditapes philippinarum"</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">group_by</span><span class="p">(</span><span class="n">Species</span><span class="p">,</span><span class="w"> </span><span class="n">station_id</span><span class="p">,</span><span class="w"> </span><span class="n">Longitude</span><span class="p">,</span><span class="w"> </span><span class="n">Latitude</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">summarise</span><span class="p">(</span><span class="w">
    </span><span class="n">years_present</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">n_distinct</span><span class="p">(</span><span class="n">Year</span><span class="p">),</span><span class="w">
    </span><span class="n">.groups</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"drop"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">Species</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="w">
      </span><span class="n">Species</span><span class="p">,</span><span class="w">
      </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Cerastoderma edule"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ruditapes philippinarum"</span><span class="p">),</span><span class="w">
      </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Native: Cerastoderma edule"</span><span class="p">,</span><span class="w">
                 </span><span class="s2">"Introduced: Ruditapes philippinarum"</span><span class="p">)</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">df_persist</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">df_persist</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="w">
    </span><span class="n">PersistClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cut</span><span class="p">(</span><span class="w">
      </span><span class="n">years_present</span><span class="p">,</span><span class="w">
      </span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="m">9</span><span class="p">),</span><span class="w">
      </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"1 year"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2–3 years"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4–5 years"</span><span class="p">,</span><span class="w"> </span><span class="s2">"6–9 years"</span><span class="p">),</span><span class="w">
      </span><span class="n">right</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">persist_sizes</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w">
  </span><span class="s2">"1 year"</span><span class="w">     </span><span class="o">=</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w">
  </span><span class="s2">"2–3 years"</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w">
  </span><span class="s2">"4–5 years"</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">9</span><span class="p">,</span><span class="w">
  </span><span class="s2">"6–9 years"</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="m">12</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">p_persist</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggmap</span><span class="p">(</span><span class="n">base_map</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_persist</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Longitude</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Latitude</span><span class="p">,</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PersistClass</span><span class="p">),</span><span class="w">
    </span><span class="n">shape</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">21</span><span class="p">,</span><span class="w">
    </span><span class="n">fill</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w">
    </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w">
    </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w">
    </span><span class="n">stroke</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.7</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_size_manual</span><span class="p">(</span><span class="w">
    </span><span class="n">name</span><span class="w">   </span><span class="o">=</span><span class="w"> </span><span class="s2">"Temporal persistence
(years with large adults)"</span><span class="p">,</span><span class="w">
    </span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">persist_sizes</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="w"> </span><span class="n">Species</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Temporal persistence of large adults (2014–2022)"</span><span class="p">,</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Longitude (°E)"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Latitude (°N)"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_bw</span><span class="p">(</span><span class="n">base_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">14</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="n">strip.text</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">13</span><span class="p">,</span><span class="w"> </span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">axis.title</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="n">element_text</span><span class="p">(</span><span class="n">face</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"bold"</span><span class="p">),</span><span class="w">
    </span><span class="n">panel.grid.minor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
    </span><span class="n">legend.position</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s2">"bottom"</span><span class="p">,</span><span class="w">
    </span><span class="n">legend.box</span><span class="w">       </span><span class="o">=</span><span class="w"> </span><span class="s2">"horizontal"</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">p_persist</span><span class="w">

</span><span class="n">ggsave</span><span class="p">(</span><span class="w">
  </span><span class="s2">"temporal_persistence_bothSpecies_google.png"</span><span class="p">,</span><span class="w">
  </span><span class="n">p_persist</span><span class="p">,</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">11</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">dpi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="7-establishment-window-plot-mesocosm-survival-differences">7) Establishment window plot (mesocosm survival differences)</h2>

<h3 id="summary-helper">Summary helper</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">summarySE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="kc">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">measurevar</span><span class="p">,</span><span class="w">
                     </span><span class="n">groupvars</span><span class="o">=</span><span class="kc">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="o">=</span><span class="kc">FALSE</span><span class="p">,</span><span class="w">
                     </span><span class="n">conf.interval</span><span class="o">=</span><span class="m">.95</span><span class="p">,</span><span class="w"> </span><span class="n">.drop</span><span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="n">library</span><span class="p">(</span><span class="n">plyr</span><span class="p">)</span><span class="w">

  </span><span class="c1"># if na.rm==TRUE, don't count NAs</span><span class="w">
  </span><span class="n">length2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="o">=</span><span class="kc">FALSE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">na.rm</span><span class="p">)</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="o">!</span><span class="nf">is.na</span><span class="p">(</span><span class="n">x</span><span class="p">))</span><span class="w">
    </span><span class="k">else</span><span class="w"> </span><span class="nf">length</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w">
  </span><span class="p">}</span><span class="w">

  </span><span class="c1"># for each group's data frame, return N, mean, sd</span><span class="w">
  </span><span class="n">datac</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ddply</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">groupvars</span><span class="p">,</span><span class="w">
                </span><span class="n">.drop</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">.drop</span><span class="p">,</span><span class="w"> </span><span class="n">.fun</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">xx</span><span class="p">,</span><span class="w"> </span><span class="n">col</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
                  </span><span class="nf">c</span><span class="p">(</span><span class="n">N</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">length2</span><span class="p">(</span><span class="n">xx</span><span class="p">[[</span><span class="n">col</span><span class="p">]],</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">na.rm</span><span class="p">),</span><span class="w">
                    </span><span class="n">mean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mean</span><span class="p">(</span><span class="n">xx</span><span class="p">[[</span><span class="n">col</span><span class="p">]],</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">na.rm</span><span class="p">),</span><span class="w">
                    </span><span class="n">sd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sd</span><span class="p">(</span><span class="n">xx</span><span class="p">[[</span><span class="n">col</span><span class="p">]],</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">na.rm</span><span class="p">))</span><span class="w">
                </span><span class="p">},</span><span class="w">
                </span><span class="n">measurevar</span><span class="p">)</span><span class="w">

  </span><span class="n">datac</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rename</span><span class="p">(</span><span class="n">datac</span><span class="p">,</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"mean"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">measurevar</span><span class="p">))</span><span class="w">

  </span><span class="n">datac</span><span class="o">$</span><span class="n">se</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">datac</span><span class="o">$</span><span class="n">sd</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">datac</span><span class="o">$</span><span class="n">N</span><span class="p">)</span><span class="w">

  </span><span class="n">ciMult</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">qt</span><span class="p">(</span><span class="n">conf.interval</span><span class="o">/</span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">.5</span><span class="p">,</span><span class="w"> </span><span class="n">datac</span><span class="o">$</span><span class="n">N</span><span class="m">-1</span><span class="p">)</span><span class="w">
  </span><span class="n">datac</span><span class="o">$</span><span class="n">ci</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">datac</span><span class="o">$</span><span class="n">se</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">ciMult</span><span class="w">

  </span><span class="nf">return</span><span class="p">(</span><span class="n">datac</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="load-and-prepare-mesocosm-survival-data">Load and prepare mesocosm survival data</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">read.csv</span><span class="p">(</span><span class="s1">'sr_2sp.csv'</span><span class="p">)</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">as.POSIXct</span><span class="p">(</span><span class="nf">as.character</span><span class="p">(</span><span class="n">df</span><span class="o">$</span><span class="n">date</span><span class="p">),</span><span class="w"> </span><span class="n">format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'%Y%m%d'</span><span class="p">)</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">mr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">df</span><span class="o">$</span><span class="n">sr</span><span class="w">

</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'5'</span><span class="p">]</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="s1">'5 PSU'</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'10'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'10 PSU'</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'20'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'20 PSU'</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'30'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'30 PSU'</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">df</span><span class="o">$</span><span class="n">salinity</span><span class="p">,</span><span class="w"> </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s1">'5 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'10 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'20 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'30 PSU'</span><span class="p">))</span><span class="w">

</span><span class="n">df</span><span class="o">$</span><span class="n">sp_code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df</span><span class="o">$</span><span class="n">species</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">species</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">species</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'CE'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'C. edule'</span><span class="w">
</span><span class="n">df</span><span class="o">$</span><span class="n">species</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">species</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'RP'</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'R. philippinarum'</span><span class="w">

</span><span class="c1"># subset</span><span class="w">

</span><span class="n">dfce</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">sp_code</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'CE'</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="n">dfrp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="o">$</span><span class="n">sp_code</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'RP'</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="c1"># summary</span><span class="w">

</span><span class="n">dfce_summ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">summarySE</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dfce</span><span class="p">,</span><span class="w"> </span><span class="n">measurevar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'sr'</span><span class="p">,</span><span class="w">
                      </span><span class="n">groupvars</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s1">'date'</span><span class="p">,</span><span class="w"> </span><span class="s1">'salinity'</span><span class="p">,</span><span class="w"> </span><span class="s1">'treatment'</span><span class="p">),</span><span class="w">
                      </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">

</span><span class="n">dfrp_summ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">summarySE</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dfrp</span><span class="p">,</span><span class="w"> </span><span class="n">measurevar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'sr'</span><span class="p">,</span><span class="w">
                      </span><span class="n">groupvars</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s1">'date'</span><span class="p">,</span><span class="w"> </span><span class="s1">'salinity'</span><span class="p">,</span><span class="w"> </span><span class="s1">'treatment'</span><span class="p">),</span><span class="w">
                      </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">

</span><span class="n">df_summ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">summarySE</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df</span><span class="p">,</span><span class="w"> </span><span class="n">measurevar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'sr'</span><span class="p">,</span><span class="w">
                    </span><span class="n">groupvars</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s1">'species'</span><span class="p">,</span><span class="w"> </span><span class="s1">'date'</span><span class="p">,</span><span class="w"> </span><span class="s1">'salinity'</span><span class="p">,</span><span class="w"> </span><span class="s1">'treatment'</span><span class="p">),</span><span class="w">
                    </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">

</span><span class="n">df_summ</span><span class="o">$</span><span class="n">sp_ht</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste</span><span class="p">(</span><span class="n">df_summ</span><span class="o">$</span><span class="n">species</span><span class="p">,</span><span class="w"> </span><span class="n">df_summ</span><span class="o">$</span><span class="n">treatment</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'_'</span><span class="p">)</span><span class="w">

</span><span class="n">df_neo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_summ</span><span class="p">[,</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">2</span><span class="p">,</span><span class="m">3</span><span class="p">,</span><span class="m">4</span><span class="p">,</span><span class="m">6</span><span class="p">)]</span><span class="w">

</span><span class="n">df_wide</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pivot_wider</span><span class="p">(</span><span class="n">df_neo</span><span class="p">,</span><span class="w"> </span><span class="n">names_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"treatment"</span><span class="p">,</span><span class="w"> </span><span class="n">values_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"sr"</span><span class="p">)</span><span class="w">

</span><span class="n">df_order</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_wide</span><span class="p">[</span><span class="n">order</span><span class="p">(</span><span class="n">df_wide</span><span class="o">$</span><span class="n">species</span><span class="p">,</span><span class="w"> </span><span class="n">df_wide</span><span class="o">$</span><span class="n">salinity</span><span class="p">,</span><span class="w"> </span><span class="n">df_wide</span><span class="o">$</span><span class="n">date</span><span class="p">),]</span><span class="w">

</span><span class="n">df_order</span><span class="o">$</span><span class="n">C</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">na.locf</span><span class="p">(</span><span class="n">df_order</span><span class="o">$</span><span class="n">C</span><span class="p">)</span><span class="w">
</span><span class="n">df_order</span><span class="o">$</span><span class="n">H</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">na.locf</span><span class="p">(</span><span class="n">df_order</span><span class="o">$</span><span class="n">H</span><span class="p">)</span><span class="w">
</span><span class="n">df_order</span><span class="o">$</span><span class="n">Sdiff</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_order</span><span class="o">$</span><span class="n">C</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">df_order</span><span class="o">$</span><span class="n">H</span><span class="w"> </span><span class="c1"># optional</span><span class="w">

</span><span class="c1"># add data categories</span><span class="w">

</span><span class="n">plb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="nf">rep</span><span class="p">(</span><span class="s1">'Phase 1'</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="s1">'Phase 2'</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="s1">'Phase 3'</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="s1">'Phase 4'</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="s1">'Phase 5'</span><span class="p">,</span><span class="w"> </span><span class="m">5</span><span class="p">))</span><span class="w">

</span><span class="n">df_order</span><span class="o">$</span><span class="n">phase</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="n">plb</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">)</span><span class="w">

</span><span class="n">dsb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s1">'D'</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="m">25</span><span class="p">)</span><span class="w">

</span><span class="n">df_order</span><span class="o">$</span><span class="n">days</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="n">dsb</span><span class="p">,</span><span class="w"> </span><span class="m">8</span><span class="p">)</span><span class="w">

</span><span class="n">df_order</span><span class="o">$</span><span class="n">days</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">df_order</span><span class="o">$</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">paste0</span><span class="p">(</span><span class="s1">'D'</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="m">25</span><span class="p">)))</span><span class="w">

</span><span class="n">df_order</span><span class="o">$</span><span class="n">salinity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">factor</span><span class="p">(</span><span class="n">df_order</span><span class="o">$</span><span class="n">salinity</span><span class="p">,</span><span class="w"> </span><span class="n">levels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s1">'30 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'20 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'10 PSU'</span><span class="p">,</span><span class="w"> </span><span class="s1">'5 PSU'</span><span class="p">))</span><span class="w">

</span><span class="c1"># subset by species</span><span class="w">

</span><span class="n">df_odce</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_order</span><span class="p">[</span><span class="n">df_order</span><span class="o">$</span><span class="n">species</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'C. edule'</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="n">df_odrp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_order</span><span class="p">[</span><span class="n">df_order</span><span class="o">$</span><span class="n">species</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'R. philippinarum'</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="n">df_odce1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_odce</span><span class="p">[</span><span class="n">seq</span><span class="p">(</span><span class="m">5</span><span class="p">,</span><span class="m">100</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">),]</span><span class="w">

</span><span class="n">df_odrp1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_odrp</span><span class="p">[</span><span class="n">seq</span><span class="p">(</span><span class="m">5</span><span class="p">,</span><span class="m">100</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">),]</span><span class="w">
</span></code></pre></div></div>

<h3 id="plot-window-survival-difference-surface">Plot WINDOW (survival-difference surface)</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">par</span><span class="p">(</span><span class="n">mar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">5</span><span class="p">,</span><span class="m">5</span><span class="p">,</span><span class="m">4</span><span class="p">,</span><span class="m">4</span><span class="p">),</span><span class="n">font.axis</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w">
</span><span class="n">Lraster</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">raster</span><span class="p">(</span><span class="n">array</span><span class="p">(</span><span class="kc">NA</span><span class="p">,</span><span class="n">dim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">100</span><span class="p">,</span><span class="m">100</span><span class="p">)))</span><span class="w">

</span><span class="n">df_odrp</span><span class="o">$</span><span class="n">svDiff</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_odrp</span><span class="o">$</span><span class="n">H</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">df_odce</span><span class="o">$</span><span class="n">H</span><span class="w">

</span><span class="n">df_Diff</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_odrp</span><span class="w">

</span><span class="n">df_Diff</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df_Diff</span><span class="p">[,</span><span class="o">-</span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="o">:</span><span class="m">6</span><span class="p">)]</span><span class="w">

</span><span class="n">X3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tapply</span><span class="p">(</span><span class="n">df_Diff</span><span class="o">$</span><span class="n">svDiff</span><span class="p">,</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="n">df_Diff</span><span class="o">$</span><span class="n">days</span><span class="p">,</span><span class="w"> </span><span class="n">df_Diff</span><span class="o">$</span><span class="n">salinity</span><span class="p">),</span><span class="w"> </span><span class="n">identity</span><span class="p">)</span><span class="w">

</span><span class="n">X3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">X3</span><span class="p">[</span><span class="n">nrow</span><span class="p">(</span><span class="n">X3</span><span class="p">)</span><span class="o">:</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="w">

</span><span class="n">sr3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">raster</span><span class="p">(</span><span class="n">X3</span><span class="p">)</span><span class="w">

</span><span class="n">sr31</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">resample</span><span class="p">(</span><span class="n">sr3</span><span class="p">,</span><span class="w"> </span><span class="n">Lraster</span><span class="p">)</span><span class="w">

</span><span class="n">sr31</span><span class="p">[</span><span class="n">sr31</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="n">sr31</span><span class="p">[</span><span class="n">sr31</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">0</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="w">

</span><span class="n">breakpoints</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">seq</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0.7</span><span class="p">,</span><span class="w"> </span><span class="m">0.1</span><span class="p">),</span><span class="w"> </span><span class="m">0.9</span><span class="p">)</span><span class="w">

</span><span class="n">colBW</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">viridis</span><span class="o">::</span><span class="n">viridis</span><span class="p">(</span><span class="m">10</span><span class="p">)[</span><span class="m">3</span><span class="o">:</span><span class="m">10</span><span class="p">],</span><span class="w"> </span><span class="s2">"#FDE725FF"</span><span class="p">)</span><span class="w">

</span><span class="n">Phase1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">53.2</span><span class="w">
</span><span class="n">Phase2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">121.6</span><span class="w">
</span><span class="n">Phase3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">192.6</span><span class="w">
</span><span class="n">Phase4</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">276.3</span><span class="w">
</span><span class="n">Phase5</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">370.7</span><span class="w">

</span><span class="n">png</span><span class="p">(</span><span class="s1">'diff_mRateWINDOW.png'</span><span class="p">,</span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">8</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">6</span><span class="p">,</span><span class="w"> </span><span class="n">units</span><span class="o">=</span><span class="s1">'in'</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">300</span><span class="p">)</span><span class="w">

</span><span class="n">plot</span><span class="p">(</span><span class="n">sr31</span><span class="p">,</span><span class="w"> </span><span class="n">axes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w"> </span><span class="n">box</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w"> </span><span class="n">legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w">
     </span><span class="n">col</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">colBW</span><span class="p">,</span><span class="w"> </span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">breakpoints</span><span class="p">,</span><span class="w"> </span><span class="n">zlim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0.0</span><span class="p">,</span><span class="m">0.9</span><span class="p">))</span><span class="w">

</span><span class="n">plot</span><span class="p">(</span><span class="n">rasterToPolygons</span><span class="p">(</span><span class="n">sr31</span><span class="p">),</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w">
     </span><span class="n">border</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">adjustcolor</span><span class="p">(</span><span class="s2">"black"</span><span class="p">,</span><span class="n">alpha.f</span><span class="o">=</span><span class="m">0.1</span><span class="p">)</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">lwd</span><span class="o">=</span><span class="m">1</span><span class="p">)</span><span class="w">

</span><span class="n">axis</span><span class="p">(</span><span class="n">side</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="m">0.125</span><span class="p">,</span><span class="m">0.875</span><span class="p">,</span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">),</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">30</span><span class="p">,</span><span class="m">20</span><span class="p">,</span><span class="m">10</span><span class="p">,</span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="n">cex.axis</span><span class="w"> </span><span class="o">=</span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="n">pos</span><span class="o">=</span><span class="m">-0.01</span><span class="p">)</span><span class="w">

</span><span class="n">axis</span><span class="p">(</span><span class="n">side</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="m">0.1</span><span class="p">,</span><span class="m">0.9</span><span class="p">,</span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">),</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">Phase1</span><span class="p">,</span><span class="w"> </span><span class="n">Phase2</span><span class="p">,</span><span class="w"> </span><span class="n">Phase3</span><span class="p">,</span><span class="w"> </span><span class="n">Phase4</span><span class="p">,</span><span class="w"> </span><span class="n">Phase5</span><span class="p">),</span><span class="w"> </span><span class="n">cex.axis</span><span class="w"> </span><span class="o">=</span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="n">pos</span><span class="o">=</span><span class="m">-0.01</span><span class="p">)</span><span class="w">

</span><span class="n">axis</span><span class="p">(</span><span class="n">side</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Salinity stress (PSU)'</span><span class="p">,</span><span class="w"> </span><span class="n">tick</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w"> </span><span class="n">cex.axis</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.4</span><span class="p">,</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.08</span><span class="p">,</span><span class="w"> </span><span class="n">font</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w">

</span><span class="n">axis</span><span class="p">(</span><span class="n">side</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Accumulated thermal stress (°C)'</span><span class="p">,</span><span class="w"> </span><span class="n">tick</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w"> </span><span class="n">cex.axis</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.4</span><span class="p">,</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">-0.1</span><span class="p">,</span><span class="w"> </span><span class="n">font</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w">

</span><span class="n">plot</span><span class="p">(</span><span class="n">sr31</span><span class="p">,</span><span class="w"> </span><span class="n">axes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w"> </span><span class="n">box</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w">
     </span><span class="n">col</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">colBW</span><span class="p">,</span><span class="w"> </span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">breakpoints</span><span class="p">,</span><span class="w"> </span><span class="n">zlim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</span><span class="p">),</span><span class="w">
     </span><span class="n">legend.width</span><span class="o">=</span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">legend.shrink</span><span class="o">=</span><span class="m">1</span><span class="p">,</span><span class="w">
     </span><span class="n">axis.args</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">at</span><span class="o">=</span><span class="n">seq</span><span class="p">(</span><span class="m">0.0</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="m">0.1</span><span class="p">),</span><span class="w">
                    </span><span class="n">labels</span><span class="o">=</span><span class="n">seq</span><span class="p">(</span><span class="m">0.0</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</span><span class="p">,</span><span class="w"> </span><span class="m">0.1</span><span class="p">),</span><span class="w">
                    </span><span class="n">cex.axis</span><span class="o">=</span><span class="m">0.95</span><span class="p">,</span><span class="w"> </span><span class="n">srt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">35</span><span class="p">),</span><span class="w">
     </span><span class="n">legend.args</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="w"> </span><span class="nf">expression</span><span class="p">(</span><span class="n">bold</span><span class="p">(</span><span class="s1">'Species survival difference'</span><span class="p">)),</span><span class="w"> </span><span class="n">side</span><span class="o">=</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">font</span><span class="o">=</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">line</span><span class="o">=</span><span class="m">1.5</span><span class="p">,</span><span class="w"> </span><span class="n">cex</span><span class="o">=</span><span class="m">1</span><span class="p">),</span><span class="w">
     </span><span class="n">legend.only</span><span class="o">=</span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">horizontal</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">)</span><span class="w">

</span><span class="n">dev.off</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="citation">Citation</h2>

<p>Zhou et al. (2025). <em>Compound extreme events reshuffle the stacked odds in the gamble between native and introduced bivalves</em>. Global Ecology and Conservation. <a href="https://doi.org/10.1016/j.gecco.2025.e03918">DOI</a></p>

<hr />

<h2 id="usage-and-permissions">Usage and permissions</h2>

<p>All scripts, analyses, and derived figures are intended for <strong>academic and non-commercial research use only</strong>. Commercial use or public redistribution requires explicit written permission from the authors. Additional restrictions may apply to the original monitoring dataset curated by Rijkswaterstaat / WMR.</p>

<p>Please cite the original publication when using any part of this work.</p>]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Blog" /><category term="bivalves" /><category term="heatwaves" /><category term="invasions" /><category term="spatial ecology" /><category term="mesocosm" /><category term="R" /><summary type="html"><![CDATA[This post documents an end-to-end R workflow that combines long-term benthic surveys (Eastern Scheldt) with mesocosm survival experiments to compare a native cockle and an introduced Manila clam under compound thermal and salinity stress.]]></summary></entry><entry><title type="html">[Blog] Sea Urchin Movement Model (Lévy Walk + Chemical Cue Targeting)</title><link href="https://zhengquanzhou.com/blog/sea-urchin-movement-model/" rel="alternate" type="text/html" title="[Blog] Sea Urchin Movement Model (Lévy Walk + Chemical Cue Targeting)" /><published>2025-11-27T00:00:00+09:00</published><updated>2025-11-27T00:00:00+09:00</updated><id>https://zhengquanzhou.com/blog/sea-urchin-movement-model</id><content type="html" xml:base="https://zhengquanzhou.com/blog/sea-urchin-movement-model/"><![CDATA[<p><em>This post documents an R simulation for sea urchin foraging: a Lévy-walk–style search that switches to directed movement when the animal enters a chemical-cue detection radius around food sources. The output is an animated GIF that tracks the path and the cue “rings”.</em></p>

<hr />

<h2 id="overview">Overview</h2>

<p>The core idea is:</p>

<ul>
  <li>The urchin explores with <strong>random steps</strong> drawn from a heavy-tailed step-length distribution (a Lévy-like rule).</li>
  <li>When it approaches a food source (within a <strong>detection radius</strong>), it <strong>moves toward the food</strong>.</li>
  <li>Once it reaches food, it <strong>stops</strong> (in this implementation).</li>
</ul>

<p>In this demo:</p>

<ul>
  <li>Four food sources are placed at the corners of the arena.</li>
  <li>Each food source has a dashed circle showing its detection radius.</li>
  <li>When the urchin path intersects a detection circle, the model transitions into cue-following.</li>
</ul>

<p><img src="/images/blogs/urchin_movement/output.gif" alt="Demo animation" /></p>

<hr />

<h2 id="r-code-complete">R code (complete)</h2>

<h3 id="libraries">Libraries</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Load necessary libraries</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggforce</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggimage</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">gganimate</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="helper-functions">Helper functions</h2>

<h3 id="distance-calculation">Distance calculation</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Function to calculate distance between two points</span><span class="w">
</span><span class="n">calculate_distance</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="n">y1</span><span class="p">,</span><span class="w"> </span><span class="n">x2</span><span class="p">,</span><span class="w"> </span><span class="n">y2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nf">sqrt</span><span class="p">((</span><span class="n">x2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x1</span><span class="p">)</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">y2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y1</span><span class="p">)</span><span class="o">^</span><span class="m">2</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="linecircle-intersection-cue-detection">Line–circle intersection (cue detection)</h3>

<p>This checks whether a movement segment crosses a food-source detection circle.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Function to check if a line segment intersects with a circle</span><span class="w">
</span><span class="n">line_circle_intersection</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="n">y1</span><span class="p">,</span><span class="w"> </span><span class="n">x2</span><span class="p">,</span><span class="w"> </span><span class="n">y2</span><span class="p">,</span><span class="w"> </span><span class="n">cx</span><span class="p">,</span><span class="w"> </span><span class="n">cy</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">

  </span><span class="n">dx</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">x2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x1</span><span class="w">
  </span><span class="n">dy</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">y2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y1</span><span class="w">
  </span><span class="n">fx</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">x1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">cx</span><span class="w">
  </span><span class="n">fy</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">y1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">cy</span><span class="w">

  </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">dx</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">dy</span><span class="o">^</span><span class="m">2</span><span class="w">
  </span><span class="n">b</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">fx</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">dx</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">fy</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">dy</span><span class="p">)</span><span class="w">
  </span><span class="n">c</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">fx</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">fy</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">r</span><span class="o">^</span><span class="m">2</span><span class="w">

  </span><span class="n">discriminant</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">b</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">c</span><span class="w">

  </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">discriminant</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="n">t1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">discriminant</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="m">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w">
    </span><span class="n">t2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="o">-</span><span class="n">b</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">discriminant</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="m">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w">

    </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">t1</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="n">t2</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="m">1</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nf">return</span><span class="p">(</span><span class="kc">TRUE</span><span class="p">)</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">

  </span><span class="nf">return</span><span class="p">(</span><span class="kc">FALSE</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="lévy-walk-movement-with-cue-following--stopping">Lévy-walk movement with cue-following + stopping</h2>

<p>Mechanism:</p>

<ol>
  <li>Find the closest food source.</li>
  <li>If distance is larger than the detection threshold:
    <ul>
      <li>take a Lévy-like random step (heavy-tailed step length + random angle).</li>
    </ul>
  </li>
  <li>If within detection radius:
    <ul>
      <li>move directly toward the food.</li>
      <li>if the path intersects the cue circle, snap to the food and stop.</li>
    </ul>
  </li>
</ol>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">simulate_urchin_movement_towards_food_stopping</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="w">
  </span><span class="n">num_steps</span><span class="p">,</span><span class="w">
  </span><span class="n">alpha</span><span class="p">,</span><span class="w">
  </span><span class="n">food_points</span><span class="p">,</span><span class="w">
  </span><span class="n">start_x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w">
  </span><span class="n">start_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w">
  </span><span class="n">distance_thresholds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">

  </span><span class="n">x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">numeric</span><span class="p">(</span><span class="n">num_steps</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w">
  </span><span class="n">y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">numeric</span><span class="p">(</span><span class="n">num_steps</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w">

  </span><span class="n">x</span><span class="p">[</span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">start_x</span><span class="w">
  </span><span class="n">y</span><span class="p">[</span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">start_y</span><span class="w">

  </span><span class="n">reached_food</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">

  </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="n">num_steps</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">

    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">reached_food</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">

      </span><span class="n">closest_distance_to_food</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="kc">Inf</span><span class="w">
      </span><span class="n">closest_food_index</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">0</span><span class="w">

      </span><span class="c1"># find closest food</span><span class="w">
      </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="n">nrow</span><span class="p">(</span><span class="n">food_points</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">

        </span><span class="n">food_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_points</span><span class="p">[</span><span class="n">j</span><span class="p">,</span><span class="w"> </span><span class="s2">"x"</span><span class="p">]</span><span class="w">
        </span><span class="n">food_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_points</span><span class="p">[</span><span class="n">j</span><span class="p">,</span><span class="w"> </span><span class="s2">"y"</span><span class="p">]</span><span class="w">

        </span><span class="n">direction_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w">
        </span><span class="n">direction_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w">
        </span><span class="n">distance_to_food</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">direction_x</span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">direction_y</span><span class="o">^</span><span class="m">2</span><span class="p">)</span><span class="w">

        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">distance_to_food</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">closest_distance_to_food</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="n">closest_distance_to_food</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">distance_to_food</span><span class="w">
          </span><span class="n">closest_food_index</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">j</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">

      </span><span class="c1"># far from food -&gt; Lévy-like random step</span><span class="w">
      </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">closest_distance_to_food</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">distance_thresholds</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">

        </span><span class="n">step_length</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">abs</span><span class="p">(</span><span class="n">rnorm</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">mean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">sd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">))</span><span class="o">^</span><span class="p">(</span><span class="m">-1</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">alpha</span><span class="p">)</span><span class="w">
        </span><span class="n">step_angle</span><span class="w">  </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">runif</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nb">pi</span><span class="p">)</span><span class="w">

        </span><span class="n">new_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">step_length</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nf">cos</span><span class="p">(</span><span class="n">step_angle</span><span class="p">)</span><span class="w">
        </span><span class="n">new_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">step_length</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nf">sin</span><span class="p">(</span><span class="n">step_angle</span><span class="p">)</span><span class="w">

        </span><span class="c1"># keep inside arena bounds</span><span class="w">
        </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">300</span><span class="p">,</span><span class="w"> </span><span class="n">pmax</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="n">new_x</span><span class="p">))</span><span class="w">
        </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">300</span><span class="p">,</span><span class="w"> </span><span class="n">pmax</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="n">new_y</span><span class="p">))</span><span class="w">

      </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">

        </span><span class="c1"># within cue radius -&gt; move toward food</span><span class="w">
        </span><span class="n">food_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_points</span><span class="p">[</span><span class="n">closest_food_index</span><span class="p">,</span><span class="w"> </span><span class="s2">"x"</span><span class="p">]</span><span class="w">
        </span><span class="n">food_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_points</span><span class="p">[</span><span class="n">closest_food_index</span><span class="p">,</span><span class="w"> </span><span class="s2">"y"</span><span class="p">]</span><span class="w">

        </span><span class="c1"># if the segment intersects the cue circle, snap to food and stop</span><span class="w">
        </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">line_circle_intersection</span><span class="p">(</span><span class="w">
              </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">],</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">],</span><span class="w">
              </span><span class="n">food_x</span><span class="p">,</span><span class="w"> </span><span class="n">food_y</span><span class="p">,</span><span class="w">
              </span><span class="n">food_x</span><span class="p">,</span><span class="w"> </span><span class="n">food_y</span><span class="p">,</span><span class="w">
              </span><span class="n">distance_thresholds</span><span class="w">
            </span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">

          </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_x</span><span class="w">
          </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">food_y</span><span class="w">
          </span><span class="n">reached_food</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="kc">TRUE</span><span class="w">

        </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">

          </span><span class="n">unit_direction_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">food_x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">])</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">closest_distance_to_food</span><span class="w">
          </span><span class="n">unit_direction_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">food_y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">])</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">closest_distance_to_food</span><span class="w">

          </span><span class="n">new_x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">unit_direction_x</span><span class="w">
          </span><span class="n">new_y</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">unit_direction_y</span><span class="w">

          </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">300</span><span class="p">,</span><span class="w"> </span><span class="n">pmax</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="n">new_x</span><span class="p">))</span><span class="w">
          </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">300</span><span class="p">,</span><span class="w"> </span><span class="n">pmax</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="n">new_y</span><span class="p">))</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">

    </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="c1"># already reached food -&gt; stop</span><span class="w">
      </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w">
      </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">

  </span><span class="nf">return</span><span class="p">(</span><span class="n">data.frame</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">step</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="p">(</span><span class="n">num_steps</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)))</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="parameters-and-run">Parameters and run</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Parameters for simulation</span><span class="w">
</span><span class="n">num_steps</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">3000</span><span class="w">  </span><span class="c1"># Number of steps for the simulation</span><span class="w">
</span><span class="n">alpha</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">1.5</span><span class="w">       </span><span class="c1"># Levy distribution parameter (alpha &gt; 1 for heavy-tailed distribution)</span><span class="w">

</span><span class="n">food_locations</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">data.frame</span><span class="p">(</span><span class="w">
  </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">-200</span><span class="p">,</span><span class="w"> </span><span class="m">-200</span><span class="p">,</span><span class="w"> </span><span class="m">200</span><span class="p">,</span><span class="w"> </span><span class="m">200</span><span class="p">),</span><span class="w">  </span><span class="c1"># X-coordinates of the food points</span><span class="w">
  </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">-200</span><span class="p">,</span><span class="w"> </span><span class="m">200</span><span class="p">,</span><span class="w"> </span><span class="m">200</span><span class="p">,</span><span class="w"> </span><span class="m">-200</span><span class="p">)</span><span class="w">   </span><span class="c1"># Y-coordinates of the food points</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">distance_thresholds</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">100</span><span class="w">

</span><span class="c1"># Simulate sea urchin movement with stopping condition</span><span class="w">
</span><span class="n">urchin_movement_stopping</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">simulate_urchin_movement_towards_food_stopping</span><span class="p">(</span><span class="w">
  </span><span class="n">num_steps</span><span class="p">,</span><span class="w">
  </span><span class="n">alpha</span><span class="p">,</span><span class="w">
  </span><span class="n">food_locations</span><span class="p">,</span><span class="w">
  </span><span class="n">distance_thresholds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">distance_thresholds</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="plot--animate-gganimate">Plot + animate (gganimate)</h2>

<p><strong>Notes</strong></p>
<ul>
  <li>Put your urchin PNG (e.g., <code class="language-plaintext highlighter-rouge">sea_urchin2.png</code>) in the working directory, or provide a full path. Download a sample image from <a href="/images/blogs/urchin_movement/sea_urchin2.png">here</a>.</li>
  <li>The output GIF is saved as <code class="language-plaintext highlighter-rouge">output.gif</code>.</li>
</ul>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Create ggplot object for initial plot with food points and sea urchin movement</span><span class="w">
</span><span class="n">sea_urchin_image</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"sea_urchin2.png"</span><span class="w">  </span><span class="c1"># Replace with your image file path</span><span class="w">

</span><span class="n">p</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_rect</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">food_locations</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">xmin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">0.25</span><span class="p">,</span><span class="w"> </span><span class="n">xmax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">0.25</span><span class="p">,</span><span class="w"> </span><span class="n">ymin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">0.25</span><span class="p">,</span><span class="w"> </span><span class="n">ymax</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">0.25</span><span class="p">),</span><span class="w">
    </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"blue"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_line</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">urchin_movement_stopping</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">),</span><span class="w">
    </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"blue"</span><span class="p">,</span><span class="w">
    </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.3</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">food_locations</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">),</span><span class="w">
    </span><span class="n">shape</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">17</span><span class="p">,</span><span class="w">
    </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w">
    </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"green"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_image</span><span class="p">(</span><span class="w">
    </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">urchin_movement_stopping</span><span class="p">,</span><span class="w">
    </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sea_urchin_image</span><span class="p">),</span><span class="w">
    </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.15</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">lapply</span><span class="p">(</span><span class="n">distance_thresholds</span><span class="p">,</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">threshold</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="n">geom_circle</span><span class="p">(</span><span class="w">
      </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">food_locations</span><span class="p">,</span><span class="w">
      </span><span class="n">aes</span><span class="p">(</span><span class="n">x0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">threshold</span><span class="p">),</span><span class="w">
      </span><span class="n">inherit.aes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">,</span><span class="w">
      </span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w">
      </span><span class="n">linetype</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"dashed"</span><span class="p">,</span><span class="w">
      </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">})</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"X-axis"</span><span class="p">,</span><span class="w">
    </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Y-axis"</span><span class="p">,</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Sea Urchin Searching for Chemical Cue and Food"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">transition_reveal</span><span class="p">(</span><span class="n">step</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_bw</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">xlim</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="m">300</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">ylim</span><span class="p">(</span><span class="m">-300</span><span class="p">,</span><span class="w"> </span><span class="m">300</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">coord_fixed</span><span class="p">()</span><span class="w">

</span><span class="n">p</span><span class="w">

</span><span class="c1"># Render and save animation</span><span class="w">
</span><span class="n">animation</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">gganimate</span><span class="o">::</span><span class="n">animate</span><span class="p">(</span><span class="w">
  </span><span class="n">p</span><span class="p">,</span><span class="w">
  </span><span class="n">renderer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gganimate</span><span class="o">::</span><span class="n">gifski_renderer</span><span class="p">(),</span><span class="w">
  </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">800</span><span class="p">,</span><span class="w">
  </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">600</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">gganimate</span><span class="o">::</span><span class="n">anim_save</span><span class="p">(</span><span class="s2">"output.gif"</span><span class="p">,</span><span class="w"> </span><span class="n">animation</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="limitations-current-implementation">Limitations (current implementation)</h2>

<ol>
  <li><strong>Fixed duration</strong>: the simulation runs for a fixed <code class="language-plaintext highlighter-rouge">num_steps</code> and then ends, even if no food is reached.</li>
  <li><strong>Idealized behavior</strong>: cue-following is simplified; real urchin movement can be affected by currents, substrate complexity, and multiple sensory cues.</li>
  <li><strong>Single stopping rule</strong>: once food is reached, the urchin stops. You could extend this to allow continued foraging among multiple patches.</li>
</ol>

<hr />

<h2 id="further-reading">Further reading</h2>

<ul>
  <li><a href="https://en.wikipedia.org/wiki/L%C3%A9vy_flight">Lévy walks</a></li>
</ul>]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Blog" /><summary type="html"><![CDATA[This post documents an R simulation for sea urchin foraging: a Lévy-walk–style search that switches to directed movement when the animal enters a chemical-cue detection radius around food sources. The output is an animated GIF that tracks the path and the cue “rings”.]]></summary></entry><entry><title type="html">[Note] Ridgeline Plots in R (ggridges)</title><link href="https://zhengquanzhou.com/note/ridge-plots/" rel="alternate" type="text/html" title="[Note] Ridgeline Plots in R (ggridges)" /><published>2023-06-15T00:00:00+09:00</published><updated>2023-06-15T00:00:00+09:00</updated><id>https://zhengquanzhou.com/note/ridge-plots</id><content type="html" xml:base="https://zhengquanzhou.com/note/ridge-plots/"><![CDATA[<p><em>Ridgeline plots are a clean way to compare distributions of a continuous variable across multiple groups. This note introduces the <code class="language-plaintext highlighter-rouge">ggridges</code> package and shows practical options for shaping, spacing, and coloring ridgelines in ggplot2.</em></p>

<p>Ridgeline plots (also called joy plots) visualize multiple density curves stacked along a categorical axis. They are especially useful when you want to compare how distributions shift or differ across groups (e.g., treatments, sites, time points).</p>

<p>In <code class="language-plaintext highlighter-rouge">ggridges</code>, two commonly used geoms are:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">geom_density_ridges()</code> (open ridges)</li>
  <li><code class="language-plaintext highlighter-rouge">geom_density_ridges2()</code> (closed ridges)</li>
</ul>

<hr />

<h2 id="package-setup">Package setup</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># install.packages("ggridges")
library(ggridges)

# install.packages("ggplot2")
library(ggplot2)
</code></pre></div></div>

<p>We use a small example dataset from <code class="language-plaintext highlighter-rouge">diamonds</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>df &lt;- diamonds[1:100, c("color", "depth")]
</code></pre></div></div>

<hr />

<h2 id="1-basic-ridgeline-plots">1) Basic ridgeline plots</h2>

<h3 id="geom_density_ridges">geom_density_ridges()</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges()
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure1.png" alt="Figure 1. Ridgeline plot using geom_density_ridges()" /></p>

<p><em>Figure 1. Ridgeline plot created using <code class="language-plaintext highlighter-rouge">geom_density_ridges()</code>.</em></p>

<h3 id="geom_density_ridges2">geom_density_ridges2()</h3>

<p><code class="language-plaintext highlighter-rouge">geom_density_ridges2()</code> produces a similar plot but with closed ridges.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges2()
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure2.png" alt="Figure 2. Ridgeline plot using geom_density_ridges2()" /></p>

<p><em>Figure 2. Ridgeline plot created using <code class="language-plaintext highlighter-rouge">geom_density_ridges2()</code>.</em></p>

<hr />

<h2 id="2-key-parameters">2) Key parameters</h2>

<h3 id="tail-trimming-rel_min_height">Tail trimming: rel_min_height</h3>

<p><code class="language-plaintext highlighter-rouge">rel_min_height</code> controls how much of the density tail is removed. Smaller values keep more of the tail; larger values trim more aggressively.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(rel_min_height = 0.005)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure3.png" alt="Figure 3. Ridgeline plot with low tail trimming." /></p>

<p><em>Figure 3. Low trimming (more tails kept).</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(rel_min_height = 0.5)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure4.png" alt="Figure 4. Ridgeline plot with strong tail trimming." /></p>

<p><em>Figure 4. Strong trimming (tails cut earlier).</em></p>

<hr />

<h3 id="ridge-spacing-scale">Ridge spacing: scale</h3>

<p><code class="language-plaintext highlighter-rouge">scale</code> controls how much the ridges overlap/stack. Smaller values are more compact; larger values spread ridges vertically.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(scale = 1)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure5.png" alt="Figure 5. Ridgeline plot with scale = 1." /></p>

<p><em>Figure 5. Compact ridge spacing.</em></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(scale = 10)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure6.png" alt="Figure 6. Ridgeline plot with scale = 10." /></p>

<p><em>Figure 6. Expanded ridge spacing.</em></p>

<hr />

<h3 id="alternative-statistic-stat--binline">Alternative statistic: stat = “binline”</h3>

<p>You can switch the statistic used for the ridge geometry.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(stat = "binline")
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure7.png" alt="Figure 7. Ridgeline plot using binned line statistic." /></p>

<p><em>Figure 7. Ridgeline plot using <code class="language-plaintext highlighter-rouge">stat = "binline"</code>.</em></p>

<hr />

<h2 id="3-styling-and-colors">3) Styling and colors</h2>

<h3 id="single-fill-color-and-transparency">Single fill color and transparency</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(fill = "lightblue", alpha = 0.5)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure8.png" alt="Figure 8. Ridgeline plot with uniform fill color." /></p>

<p><em>Figure 8. Uniform fill color with transparency.</em></p>

<hr />

<h3 id="line-style-color-linetype-linewidth">Line style (color, linetype, linewidth)</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color)) +
  geom_density_ridges(fill = "white",
                      color = 4,
                      linetype = 2,
                      lwd = 1.5)
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure9.png" alt="Figure 9. Ridgeline plot with custom line style." /></p>

<p><em>Figure 9. Customized ridge outline style.</em></p>

<hr />

<h3 id="fill-by-category">Fill by category</h3>

<p>Map <code class="language-plaintext highlighter-rouge">fill</code> to the category variable to color each ridge group.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color, fill = color)) +
  geom_density_ridges()
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure10.png" alt="Figure 10. Ridgeline plot filled by category." /></p>

<p><em>Figure 10. Fill mapped to category (color).</em></p>

<p>To set exact colors, use <code class="language-plaintext highlighter-rouge">scale_fill_manual()</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color, fill = color)) +
  geom_density_ridges() +
  scale_fill_manual(values = c("red","orange","yellow","green","cyan","blue","purple"))
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure11.png" alt="Figure 11. Ridgeline plot with manual color palette." /></p>

<p><em>Figure 11. Manual fill palette using <code class="language-plaintext highlighter-rouge">scale_fill_manual()</code>.</em></p>

<hr />

<h3 id="gradient-fill-along-the-x-axis">Gradient fill along the x-axis</h3>

<p>Use a gradient fill mapped to the x-value:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color, fill = stat(x))) +
  geom_density_ridges_gradient() +
  scale_fill_viridis_c(name = "Depth", option = "C")
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure12.png" alt="Figure 12. Ridgeline plot with gradient fill." /></p>

<p><em>Figure 12. Gradient fill using <code class="language-plaintext highlighter-rouge">geom_density_ridges_gradient()</code>.</em></p>

<hr />

<h3 id="quantile-based-coloring">Quantile-based coloring</h3>

<p>You can color ridge segments by quantile ranges using <code class="language-plaintext highlighter-rouge">stat_density_ridges()</code> with ECDF.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color, fill = stat(quantile))) +
  stat_density_ridges(quantile_lines = FALSE,
                      calc_ecdf = TRUE,
                      geom = "density_ridges_gradient") +
  scale_fill_brewer(name = "")
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure13.png" alt="Figure 13. Ridgeline plot colored by quantiles." /></p>

<p><em>Figure 13. Quantile-based fill using ECDF.</em></p>

<hr />

<h3 id="highlight-distribution-tails">Highlight distribution tails</h3>

<p>This approach can highlight tails by choosing quantiles (e.g., 5% and 95%) and assigning different colors.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ggplot(df, aes(x = depth, y = color, fill = stat(quantile))) +
  stat_density_ridges(quantile_lines = TRUE,
                      calc_ecdf = TRUE,
                      geom = "density_ridges_gradient",
                      quantiles = c(0.05, 0.95)) +
  scale_fill_manual(name = "Prob.",
                    values = c("#E2FFF2", "white", "#B0E0E6"),
                    labels = c("(0, 5%]", "(5%, 95%]", "(95%, 1]"))
</code></pre></div></div>

<p><img src="/images/notes/ridge_plots/figure14.png" alt="Figure 14. Ridgeline plot highlighting tails." /></p>

<p><em>Figure 14. Tail highlighting using selected quantiles.</em></p>

<hr />

<h2 id="notes">Notes</h2>

<ul>
  <li>For very small sample sizes, density shapes can be unstable; use more data if possible.</li>
  <li>If ridges overlap too much, reduce <code class="language-plaintext highlighter-rouge">scale</code> or increase the y-axis spacing (or use fewer groups).</li>
  <li>When using gradient or quantiles, keep legends simple so the plot stays readable.</li>
</ul>

<hr />

<h2 id="further-reading">Further reading</h2>

<ul>
  <li><a href="https://cran.r-project.org/package=ggridges">ggridges CRAN page</a></li>
</ul>

<p>END</p>]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Note" /><summary type="html"><![CDATA[Ridgeline plots are a clean way to compare distributions of a continuous variable across multiple groups. This note introduces the ggridges package and shows practical options for shaping, spacing, and coloring ridgelines in ggplot2.]]></summary></entry><entry><title type="html">[Note] Rolling Window Analysis in R</title><link href="https://zhengquanzhou.com/note/rolling-window/" rel="alternate" type="text/html" title="[Note] Rolling Window Analysis in R" /><published>2023-06-01T00:00:00+09:00</published><updated>2023-06-01T00:00:00+09:00</updated><id>https://zhengquanzhou.com/note/rolling-window</id><content type="html" xml:base="https://zhengquanzhou.com/note/rolling-window/"><![CDATA[<p><em>Rolling window analysis is a flexible approach for summarizing relationships in time-ordered or gradient-based data by computing statistics within sliding windows. This note demonstrates a custom implementation in R using the <code class="language-plaintext highlighter-rouge">smoking</code> dataset to explore how average weekday smoking amounts vary with age.</em></p>

<p>Rolling window analysis is a way to summarize data by computing statistics within fixed-length windows that slide across an ordered variable. It is useful for checking whether the relationship between a response and an explanatory variable is stable across the range of the data.</p>

<p><img src="/images/notes/rolling_window/sliding_window.png" alt="Figure 1. A conceptual figure demonstrating the rolling-window method" /></p>

<p><em>Figure 1. A conceptual figure demonstrating the rolling-window method.</em></p>

<p>Two key parameters define this method:</p>

<ul>
  <li>Step size: how far the window moves each iteration</li>
  <li>Window size: how much data each window contains (its span)</li>
</ul>

<p>Common statistics include mean, standard deviation, and variance.</p>

<p>The zoo package provides rollapply() for rolling calculations, but writing custom code can be more flexible for specific analysis needs.</p>

<p>In this example, we use the smoking dataset from the openintro package to explore the relationship between weekday smoking amount and age.</p>

<p>Dataset documentation:<br />
https://rdrr.io/cran/openintro/man/smoking.html</p>

<hr />

<h2 id="data-sorting">Data sorting</h2>

<p>We first remove missing values and sort the data by age in ascending order.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>library(openintro)

data(smoking)

dt = smoking[order(smoking$age), ]
dt = dt[!is.na(dt$amt_weekdays), ]
</code></pre></div></div>

<p>We visualize the raw relationship:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>plot(dt$amt_weekdays ~ dt$age)
</code></pre></div></div>

<p><img src="/images/notes/rolling_window/raw_plot.png" alt="Figure 2. Scatter plot of weekday smoking amount versus age" /></p>

<p><em>Figure 2. Scatter plot of weekday smoking amount versus age.</em></p>

<hr />

<h2 id="parameter-setting">Parameter setting</h2>

<p>Next, we define the rolling window parameters and prepare a dataframe to store summarized results.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>step.age = 0.1     # step size
window.age = 10    # window size

min.age = min(dt$age)
max.age = max(dt$age)

wm.df = data.frame(wm.age = numeric(0),
                   wm.amt_wk = numeric(0))
</code></pre></div></div>

<hr />

<h2 id="writing-the-loop">Writing the loop</h2>

<p>The rolling window algorithm computes statistics inside each window, then shifts forward by the step size.</p>

<p>Here we compute the mean age and the mean weekday smoking amount within each window.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>i = 0
n_step = (max.age - min.age - window.age) / step.age

for (i in 0:n_step) {

  filter.age = dt$age &gt;= (min.age + i * step.age) &amp;
               dt$age &lt;= (min.age + i * step.age + window.age)

  sub.dt = dt[filter.age, ]

  wm.age = mean(sub.dt$age)
  wm.amt_wk = mean(sub.dt$amt_weekdays)

  wm.dt = list(wm.age, wm.amt_wk)
  wm.df = rbind(wm.df, wm.dt)

  i + 1
}

colnames(wm.df) = c('m.age', 'm.amt_wk')
</code></pre></div></div>

<hr />

<h2 id="plotting">Plotting</h2>

<p>We plot raw data by gender, then overlay the rolling window averages.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>library(scales)

filter_f = dt$gender == 'Female'
filter_m = dt$gender == 'Male'

dt$color = as.character(dt$gender)
dt$color[dt$color == 'Female'] = 'pink'
dt$color[dt$color == 'Male'] = 'light blue'

plot(dt$age[filter_m], dt$amt_weekdays[filter_m],
     xlim = c(15, 95), ylim = c(0, 55),
     xaxt = "none", yaxt = "none",
     xlab = "", ylab = "",
     pch = 16,
     col = alpha(unique(dt$color[filter_m]), 0.5),
     tcl = 0.3)

points(dt$age[filter_f], dt$amt_weekdays[filter_f],
       pch = 16,
       col = alpha(unique(dt$color[filter_f]), 0.5))

points(wm.df$m.age, wm.df$m.amt_wk,
       pch = 21, bg = '#FF0033', cex = 2.5)

axis(1, seq(15, 95, 5), las = 1, font = 2)
axis(2, seq(0, 55, 5), las = 2, font = 2)

mtext(side = 1, line = 2, "Age", font = 2)
mtext(side = 2, line = 2, "Number of cigarettes/day", font = 2)
mtext(side = 3, line = 1, "Age dependence of smoking amounts",
      col = "blue", font = 3)

abline(v = c(62.5, 82.5), lwd = 1.2, lty = 2)

legend('topleft',
       legend = c('Female', 'Male', 'Summarized data'),
       pch = 16,
       col = c('pink', 'lightblue', 'red'))
</code></pre></div></div>

<p><img src="/images/notes/rolling_window/final_outcome.png" alt="Figure 3. Raw smoking data by gender with rolling window averages." /></p>

<p><em>Figure 3. The rolling window averages.</em></p>

<hr />

<h2 id="interpretation">Interpretation</h2>

<p>The rolling window summary suggests:</p>

<ul>
  <li>Ages 20–60: weekday smoking increases with age</li>
  <li>Ages 60–80: weekday smoking decreases with age</li>
  <li>After ~85: weekday smoking drops sharply</li>
</ul>

<p>This pattern is difficult to see from raw scatter points alone but becomes clear after rolling window smoothing.</p>

<hr />

<h2 id="further-reading">Further reading</h2>

<ul>
  <li><a href="https://search.r-project.org/CRAN/refmans/zoo/html/rollapply.html?sessionid=">rollapply() in the zoo package</a></li>
</ul>

<p>END</p>]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Note" /><summary type="html"><![CDATA[Rolling window analysis is a flexible approach for summarizing relationships in time-ordered or gradient-based data by computing statistics within sliding windows. This note demonstrates a custom implementation in R using the smoking dataset to explore how average weekday smoking amounts vary with age.]]></summary></entry><entry><title type="html">[Note] Handling Date-Time Data in R with as.POSIXct()</title><link href="https://zhengquanzhou.com/blog&notes/note-r-posixct-datetime/" rel="alternate" type="text/html" title="[Note] Handling Date-Time Data in R with as.POSIXct()" /><published>2023-05-20T00:00:00+09:00</published><updated>2023-05-20T00:00:00+09:00</updated><id>https://zhengquanzhou.com/blog&amp;notes/note-r-posixct-datetime</id><content type="html" xml:base="https://zhengquanzhou.com/blog&amp;notes/note-r-posixct-datetime/"><![CDATA[<p><em>Short note on handling time-series data in R using POSIXct and ggplot2.</em></p>

<p>Time-series data are common in ecological experiments, such as hourly temperature records or interannual biomass variation.</p>

<p>In base R, time data are mainly represented in three formats:</p>

<ul>
  <li>Date: number of days since 1970-01-01</li>
  <li>POSIXct: number of seconds since 1970-01-01 (UTC-based)</li>
  <li>POSIXlt: list-based structure storing date, time, and timezone</li>
</ul>

<p>Time objects are usually created by converting character strings using:</p>

<ul>
  <li>as.Date()</li>
  <li>as.POSIXct()</li>
  <li>as.POSIXlt()</li>
  <li>strptime()</li>
</ul>

<p>The lubridate package also provides convenient tools.</p>

<p>This note focuses on the basic usage of as.POSIXct().</p>

<hr />

<h2 id="basic-syntax">Basic syntax</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>as.POSIXct(x, tz = "", format = "", origin = "", ...)
</code></pre></div></div>

<p>Arguments:</p>

<ul>
  <li>x: object to convert (usually a character string)</li>
  <li>tz: timezone (default is system timezone)</li>
  <li>format: string format specification</li>
  <li>origin: starting date for numeric time values</li>
</ul>

<hr />

<h2 id="example-1-simple-conversion">Example 1: Simple conversion</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>t1 = '2022-02-22 22:22:22'
class(t1)

t1 = as.POSIXct(t1)
class(t1)
</code></pre></div></div>

<hr />

<h2 id="example-2-specify-format">Example 2: Specify format</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>t2 = '2022/02/22T22:22:22'
t2 = as.POSIXct(t2, format = '%Y/%m/%dT%H:%M:%S')
t2
</code></pre></div></div>

<p>Common format symbols:</p>

<ul>
  <li>%y  two-digit year</li>
  <li>%Y  four-digit year</li>
  <li>%m  month</li>
  <li>%d  day</li>
  <li>%b  abbreviated month</li>
  <li>%B  full month name</li>
  <li>%a  abbreviated weekday</li>
  <li>%A  full weekday</li>
</ul>

<hr />

<h2 id="example-3-timezones">Example 3: Timezones</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>library(lubridate)

t3 &lt;- as.POSIXct('2022-02-23 23:23:23', tz = 'UTC')
t3

t4 &lt;- as.POSIXct('2022-02-24 01:00:00', tz = 'America/New_York')
t4

with_tz(t4, 'GMT')
</code></pre></div></div>

<hr />

<h2 id="example-4-unix-time-origin">Example 4: UNIX time origin</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>t5 = 1645564942
as.POSIXct(t5, origin = '1970-01-01')
as.POSIXct(t5, origin = '1980-01-01')
</code></pre></div></div>

<hr />

<h2 id="plotting-date-time-data-with-ggplot2">Plotting date-time data with ggplot2</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>library(ggplot2)
library(scales)

set.seed(2022)

a = 4
b = 7
amp = 2
n = 7 * 24 * 4

t = seq(0, 2*pi, , n)
h.norm = rnorm(n)

h.temp = a*sin(b*t + 1.5*pi) + h.norm*amp + 25

dt = seq.POSIXt(
  as.POSIXct("2022-02-01 00:00:00"),
  as.POSIXct("2022-02-07 23:45:00"),
  tz = "Europe/Berlin",
  by = "15 min"
)

df.temp = data.frame(datetime = dt, temptr = h.temp)

ggplot(df.temp, aes(x = datetime, y = temptr)) +
  geom_line(size = 1.5, col = "red") +
  xlab("Measuring time") +
  ylab("Measured temperature (°C)") +
  ylim(15, 35) +
  scale_x_datetime(
    labels = date_format("%m/%d/%y"),
    breaks = date_breaks("1 day")
  ) +
  ggtitle("Air temperature variation") +
  theme(
    plot.title = element_text(size = 20, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 15, face = "bold"),
    axis.text = element_text(size = 12, face = "bold")
  )
</code></pre></div></div>

<hr />

<h2 id="further-reading">Further reading</h2>

<ul>
  <li><a href="https://lubridate.tidyverse.org/?sessionid=">lubridate package documentation and cheatsheets</a></li>
</ul>

<p>End of note.</p>]]></content><author><name>Zhengquan Zhou</name><email>zhouzhengquan@outlook.com</email></author><category term="Blog&amp;Notes" /><category term="Note" /><category term="R" /><category term="datetime" /><summary type="html"><![CDATA[Short note on handling time-series data in R using POSIXct and ggplot2.]]></summary></entry></feed>