Skip to content

Commit

Permalink
Deploying to master from @ cfa0f5a 🚀
Browse files Browse the repository at this point in the history
  • Loading branch information
NickCH-K committed Aug 22, 2024
1 parent f0f7f05 commit db07484
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 41 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
109 changes: 109 additions & 0 deletions Presentation/Figures/styling_line_graphs.html
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,115 @@ <h2 id="keep-in-mind">
<h1 id="implementation">
<a href="#implementation" aria-labelledby="implementation" class="anchor-heading"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Implementation
</h1>
<h2 id="python">
<a href="#python" aria-labelledby="python" class="anchor-heading"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Python
</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="nn">seaborn.objects</span> <span class="k">as</span> <span class="n">so</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">seaborn</span> <span class="kn">import</span> <span class="n">axes_style</span>




<span class="c1"># Download the economics dataset (from ggplot2 so comparison is apples-to-apples)
</span><span class="n">url</span> <span class="o">=</span> <span class="s">"https://raw.githubusercontent.com/tidyverse/ggplot2/main/data-raw/economics.csv"</span>
<span class="n">economics</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>


<span class="c1"># Quick manipulation of dataframe to convert column to datetime
</span><span class="n">df</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">economics</span>
<span class="p">.</span><span class="n">assign</span><span class="p">(</span>
<span class="n">date</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">df</span><span class="p">:</span> <span class="n">pd</span><span class="p">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s">'date'</span><span class="p">])</span>
<span class="p">)</span>
<span class="p">)</span>



<span class="c1"># Default plots (Notice the xaxis only has 2 years! We'll fix this in p2)
</span><span class="n">p1</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">so</span><span class="p">.</span><span class="n">Plot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">'date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">'uempmed'</span><span class="p">)</span>
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">so</span><span class="p">.</span><span class="n">Line</span><span class="p">())</span>
<span class="p">)</span>
<span class="n">p1</span>




<span class="c1">## Change line color and chart labels, and fix xaxis
## Note here that color is inside of the Line call, so this would color the line.
## If color were instead *inside* the so.Plot() object, SO would assign it
## a different line for each value of the factor variable (column), colored differently. (Commonly referred to as hue in seaborn)
# However, in our case, we can pass a color directly.
</span><span class="n">p2</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">so</span><span class="p">.</span><span class="n">Plot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">'date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">'uempmed'</span><span class="p">)</span>
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">so</span><span class="p">.</span><span class="n">Line</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s">'purple'</span><span class="p">))</span>
<span class="p">.</span><span class="n">label</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">'Median Duration of Unemploymeny'</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">'Date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="p">.</span><span class="n">scale</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">so</span><span class="p">.</span><span class="n">Temporal</span><span class="p">().</span><span class="n">tick</span><span class="p">(</span><span class="n">upto</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span> <span class="c1">#Needed for current configuration of seaborn.objects so xaxis prints more than 2 ticks
</span> <span class="p">.</span><span class="n">theme</span><span class="p">(</span><span class="n">axes_style</span><span class="p">(</span><span class="s">"whitegrid"</span><span class="p">))</span> <span class="c1">#use a function from parent seaborn library, that will pass a prebuilt selection based on what you pass
</span> <span class="p">)</span>

<span class="n">p2</span>



<span class="c1">## plotting multiple charts (of different line types and sizes)
</span><span class="n">p3</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">so</span><span class="p">.</span><span class="n">Plot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">)</span>
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">so</span><span class="p">.</span><span class="n">Line</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s">'darkblue'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">5</span><span class="p">),</span> <span class="n">x</span><span class="o">=</span><span class="s">'date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">'uempmed'</span><span class="p">)</span>
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">so</span><span class="p">.</span><span class="n">Line</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s">'red'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s">'dotted'</span><span class="p">),</span> <span class="n">x</span><span class="o">=</span><span class="s">'date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">'psavert'</span><span class="p">)</span>
<span class="p">.</span><span class="n">label</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">'Unemployment Duration (Blue)</span><span class="se">\n</span><span class="s"> &amp; Savings Rate (Red)'</span><span class="p">,</span>
<span class="n">x</span><span class="o">=</span><span class="s">'Date'</span><span class="p">,</span>
<span class="n">y</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
<span class="p">.</span><span class="n">scale</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">so</span><span class="p">.</span><span class="n">Temporal</span><span class="p">().</span><span class="n">tick</span><span class="p">(</span><span class="n">upto</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span> <span class="c1">#Needed for current configuration of seaborn.objects so xaxis prints more than 2 ticks
</span> <span class="p">.</span><span class="n">theme</span><span class="p">(</span><span class="n">axes_style</span><span class="p">(</span><span class="s">"whitegrid"</span><span class="p">))</span> <span class="c1">#use a function from parent seaborn library, that will pass a prebuilt selection based on what you pass
</span> <span class="p">)</span>

<span class="n">p3</span>


<span class="c1">## Plotting a different line type for each group
## There isn't a natural factor in this data so let's just duplicate the data and make one up
</span><span class="n">df</span><span class="p">[</span><span class="s">'fac'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">df2</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">df2</span><span class="p">[</span><span class="s">'fac'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">df2</span><span class="p">[</span><span class="s">'uempmed'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df2</span><span class="p">[</span><span class="s">'uempmed'</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">normal</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">df2</span><span class="p">))</span>
<span class="n">df_final</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">concat</span><span class="p">([</span><span class="n">df</span><span class="p">,</span> <span class="n">df2</span><span class="p">],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="bp">True</span><span class="p">).</span><span class="n">astype</span><span class="p">({</span><span class="s">'fac'</span><span class="p">:</span><span class="s">'category'</span><span class="p">})</span>


<span class="n">p4</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">so</span><span class="p">.</span><span class="n">Plot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df_final</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">'date'</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">'uempmed'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">'fac'</span><span class="p">)</span>
<span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">so</span><span class="p">.</span><span class="n">Line</span><span class="p">())</span>
<span class="p">.</span><span class="n">label</span><span class="p">(</span><span class="n">title</span> <span class="o">=</span> <span class="s">"Median Duration of Unemployment"</span><span class="p">,</span>
<span class="n">x</span> <span class="o">=</span> <span class="s">"Date"</span><span class="p">,</span>
<span class="n">y</span> <span class="o">=</span> <span class="s">""</span><span class="p">,</span>
<span class="n">color</span><span class="o">=</span><span class="s">'Random Factor'</span><span class="p">)</span>
<span class="p">.</span><span class="n">scale</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">so</span><span class="p">.</span><span class="n">Temporal</span><span class="p">().</span><span class="n">tick</span><span class="p">(</span><span class="n">upto</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span> <span class="c1">#Needed for current configuration of seaborn.objects so xaxis prints more than 2 ticks
</span> <span class="p">.</span><span class="n">theme</span><span class="p">(</span><span class="n">axes_style</span><span class="p">(</span><span class="s">"whitegrid"</span><span class="p">))</span> <span class="c1">#use a function from parent seaborn library, that will pass a prebuilt selection based on what you pass
</span><span class="p">)</span>

<span class="n">p4</span>



<span class="c1"># Plot all 4 plots
</span><span class="n">fig</span><span class="p">,</span> <span class="n">axs</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>
<span class="c1"># Draw each plot in the corresponding subplot
</span><span class="n">p1</span><span class="p">.</span><span class="n">on</span><span class="p">(</span><span class="n">axs</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]).</span><span class="n">plot</span><span class="p">()</span>
<span class="n">p2</span><span class="p">.</span><span class="n">on</span><span class="p">(</span><span class="n">axs</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]).</span><span class="n">plot</span><span class="p">()</span>
<span class="n">p3</span><span class="p">.</span><span class="n">on</span><span class="p">(</span><span class="n">axs</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]).</span><span class="n">plot</span><span class="p">()</span>
<span class="n">p4</span><span class="p">.</span><span class="n">on</span><span class="p">(</span><span class="n">axs</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]).</span><span class="n">plot</span><span class="p">()</span>

<span class="c1"># Adjust layout to avoid overlap
</span><span class="n">plt</span><span class="p">.</span><span class="n">tight_layout</span><span class="p">()</span>

<span class="c1"># Show the combined plot
</span><span class="n">plt</span><span class="p">.</span><span class="n">show</span><span class="p">()</span>
</code></pre></div></div>
<p>The four plots generated by the code are (in order p1, p2, then p3 and p4):</p>
<p><img src="/Presentation/Figures/Images/Styling-Line-Graphs/styling_line_graphs_Python.png" alt="Four Styled Line Graphs in Python" /></p>
<h2 id="r">
<a href="#r" aria-labelledby="r" class="anchor-heading"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> R
</h2>
Expand Down
Loading

0 comments on commit db07484

Please sign in to comment.