<!DOCTYPE html>
<html lang="en">






<head>
<meta charset="utf-8">
<title>Basic Stacked area chart with R &#8211; the R Graph Gallery</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="This post provides the basics concerning stacked area chart with R and ggplot2. It takes into account several input format types and show how to customize the output.">
<meta name="keywords" content="R,ggplot2,tidyverse,Example,Data,Dataviz,Datavisualization,Plot,Chart,Graph,Learning,Caveat,Pitfall,Mistake">
<meta name="author" content="Yan Holtz">
<link rel="icon" href="img/logo/R_single_small.png">


<!-- Control appearance when shared by social media -->
<meta property="og:title" content="Basic Stacked area chart with R" />
<meta property="og:image" content="https://github.com/holtzy/R-graph-gallery/raw/master/img/logo/R_single_big.png" />
<meta property="og:description" content="This post provides the basics concerning stacked area chart with R and ggplot2. It takes into account several input format types and show how to customize the output." />
<meta property='og:url' content="https://www.r-graph-gallery.com/136-stacked-area-chart.html" />
<meta property="og:type" content="website" />

<!-- Bootstrap core CSS -->
<link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

<!-- Custom fonts for this template -->
<link href="vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">

<!-- Custom styles for this template -->
<link href="css/agency.css" rel="stylesheet">

<!-- JQUERY -->
<script src="vendor/jquery/jquery.min.js"></script>

</head>





<body data-spy="scroll" data-target="#myScrollspy" data-offset="1">


<!-- THIS ALLOWS TO INSERT THE MENU THAT IS STORED IN A MENU.HTML FILE-->
<nav class="navbar navbar-expand-lg fixed-top" id="mainNav"></nav>
<script>
  $(function(){
    $("#mainNav").load("html_chunk/menu.html");
  });
</script>

<!-- THIS ALLOWS TO INSERT THE MODAL OF THE MENU THAT IS STORED IN A MENU_MODAL.HTML FILE-->
<div id="modal_menu_insertion"> </div>
<script>
  $(function(){
    $("#modal_menu_insertion").load("html_chunk/menu_modal.html");
  });
</script>



<!-- Header = Title in big + social media Icon + quick description -->
<header class="masthead" style="padding-bottom: 30px;">
  <div class="textlanding">
      <center><h1>Basic Stacked area chart with R</h1></center>
      <hr class="short_hr">
      <br>
      <ul class="list-inline social-buttons">
        <li class="list-inline-item">
          <a href="https://twitter.com/R_Graph_Gallery">
            <i class="fa fa-twitter"></i>
          </a>
        </li>
        <li class="list-inline-item social-buttons">
          <a href="https://github.com/holtzy">
            <i class="fa fa-github" style="color: white"></i>
          </a>
        </li>
        <li class="list-inline-item social-buttons">
          <a href="https://www.linkedin.com/in/yan-holtz-2477534a/">
            <i class="fa fa-linkedin"></i>
          </a>
        </li>
        <li class="list-inline-item social-buttons">
          <a href="https://www.yan-holtz.com">
            <i class="fa fa-home"></i>
          </a>
        </li>
      </ul>
      <center><p style="max-width: 600px; margin-top: 40px">This post provides the basics concerning <a href="stacked-area-graph.html">stacked area chart</a> with R and <code>ggplot2</code>. It takes into account several input format types and show how to customize the output.</p></center>
      <div style="text-align:center">
         <a class="btn btn-secondary btn-xl text-uppercase js-scroll-trigger" href='stacked-area-graph.html'>Stacked area section</a>
         <a class="btn btn-secondary btn-xl text-uppercase js-scroll-trigger" href='https://www.data-to-viz.com/graph/stackedarea.html'>Data to Viz</a>
      </div>
  </div>
</header>



<!-- THIS ALLOWS TO INSERT THE ADVERTISEMENT BANNER THAT IS STORED IN A BANNER.HTML FILE-->
<div id="position_for_images"></div>
<script>
  $(function(){
    $("#position_for_images").load("html_chunk/images.html");
  });
</script>










<!-- STYLE for chart pages but not the rest of tthe website -->
<style>
  img {
    margin-top: 20px;
  }
</style>



<div class="container">
<h1 id="most-basic-stacked-area-with-ggplot2">Most basic stacked area with ggplot2</h1>
<hr />
<div class="row">
<div class="col-md-6 col-sm-12 align-self-center">
<p>The data frame used as input to build a stacked area chart requires 3 columns:</p>
<ul>
<li><code>x</code>: numeric variable used for the X axis, often it is a time.</li>
<li><code>y</code>: numeric variable used for the Y axis. What are we looking at?</li>
<li><code>group</code>: one shape will be done per group.</li>
</ul>
<p>The chart is built using the <code>geom_area()</code> function.</p>
</div>
<div class="col-md-6 col-sm-12">
<p><img src="136-stacked-area-chart_files/figure-html/thecode-1.png" width="100%" /></p>
</div>
</div>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="co"># Packages</span></a>
<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="kw">library</span>(ggplot2)</a>
<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="kw">library</span>(dplyr)</a>
<a class="sourceLine" id="cb1-4" data-line-number="4"> </a>
<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="co"># create data</span></a>
<a class="sourceLine" id="cb1-6" data-line-number="6">time &lt;-<span class="st"> </span><span class="kw">as.numeric</span>(<span class="kw">rep</span>(<span class="kw">seq</span>(<span class="dv">1</span>,<span class="dv">7</span>),<span class="dt">each=</span><span class="dv">7</span>))  <span class="co"># x Axis</span></a>
<a class="sourceLine" id="cb1-7" data-line-number="7">value &lt;-<span class="st"> </span><span class="kw">runif</span>(<span class="dv">49</span>, <span class="dv">10</span>, <span class="dv">100</span>)               <span class="co"># y Axis</span></a>
<a class="sourceLine" id="cb1-8" data-line-number="8">group &lt;-<span class="st"> </span><span class="kw">rep</span>(LETTERS[<span class="dv">1</span><span class="op">:</span><span class="dv">7</span>],<span class="dt">times=</span><span class="dv">7</span>)        <span class="co"># group, one shape per group</span></a>
<a class="sourceLine" id="cb1-9" data-line-number="9">data &lt;-<span class="st"> </span><span class="kw">data.frame</span>(time, value, group)</a>
<a class="sourceLine" id="cb1-10" data-line-number="10"></a>
<a class="sourceLine" id="cb1-11" data-line-number="11"><span class="co"># stacked area chart</span></a>
<a class="sourceLine" id="cb1-12" data-line-number="12"><span class="kw">ggplot</span>(data, <span class="kw">aes</span>(<span class="dt">x=</span>time, <span class="dt">y=</span>value, <span class="dt">fill=</span>group)) <span class="op">+</span><span class="st"> </span></a>
<a class="sourceLine" id="cb1-13" data-line-number="13"><span class="st">    </span><span class="kw">geom_area</span>()</a></code></pre></div>
<h1 id="control-stacking-order-with-ggplot2">Control stacking order with <code>ggplot2</code></h1>
<hr />
<div class="row">
<div class="col-md-6 col-sm-12 align-self-center">
<p>The gallery offers a post dedicated to <a href="267-reorder-a-variable-in-ggplot2.html">reordering with ggplot2</a>. This step can be tricky but the code below shows how to:</p>
<ul>
<li>give a specific order with the <code>factor()</code> function.</li>
<li>order alphabetically using <code>sort()</code></li>
<li>order following values at a specific data</li>
</ul>
</div>
<div class="col-md-6 col-sm-12">
<p><img src="136-stacked-area-chart_files/figure-html/thecode2-1.png" width="100%" /></p>
</div>
</div>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="co"># Give a specific order:</span></a>
<a class="sourceLine" id="cb2-2" data-line-number="2">data<span class="op">$</span>group &lt;-<span class="st"> </span><span class="kw">factor</span>(data<span class="op">$</span>group , <span class="dt">levels=</span><span class="kw">c</span>(<span class="st">&quot;B&quot;</span>, <span class="st">&quot;A&quot;</span>, <span class="st">&quot;D&quot;</span>, <span class="st">&quot;E&quot;</span>, <span class="st">&quot;G&quot;</span>, <span class="st">&quot;F&quot;</span>, <span class="st">&quot;C&quot;</span>) )</a>
<a class="sourceLine" id="cb2-3" data-line-number="3"></a>
<a class="sourceLine" id="cb2-4" data-line-number="4"><span class="co"># Plot again</span></a>
<a class="sourceLine" id="cb2-5" data-line-number="5"><span class="kw">ggplot</span>(data, <span class="kw">aes</span>(<span class="dt">x=</span>time, <span class="dt">y=</span>value, <span class="dt">fill=</span>group)) <span class="op">+</span><span class="st"> </span></a>
<a class="sourceLine" id="cb2-6" data-line-number="6"><span class="st">    </span><span class="kw">geom_area</span>()</a>
<a class="sourceLine" id="cb2-7" data-line-number="7"></a>
<a class="sourceLine" id="cb2-8" data-line-number="8"><span class="co"># Note: you can also sort levels alphabetically:</span></a>
<a class="sourceLine" id="cb2-9" data-line-number="9">myLevels &lt;-<span class="st"> </span><span class="kw">levels</span>(data<span class="op">$</span>group)</a>
<a class="sourceLine" id="cb2-10" data-line-number="10">data<span class="op">$</span>group &lt;-<span class="st"> </span><span class="kw">factor</span>(data<span class="op">$</span>group , <span class="dt">levels=</span><span class="kw">sort</span>(myLevels) )</a>
<a class="sourceLine" id="cb2-11" data-line-number="11"></a>
<a class="sourceLine" id="cb2-12" data-line-number="12"><span class="co"># Note: sort followinig values at time = 5</span></a>
<a class="sourceLine" id="cb2-13" data-line-number="13">myLevels &lt;-<span class="st"> </span>data <span class="op">%&gt;%</span></a>
<a class="sourceLine" id="cb2-14" data-line-number="14"><span class="st">  </span><span class="kw">filter</span>(time<span class="op">==</span><span class="dv">6</span>) <span class="op">%&gt;%</span></a>
<a class="sourceLine" id="cb2-15" data-line-number="15"><span class="st">  </span><span class="kw">arrange</span>(value)</a>
<a class="sourceLine" id="cb2-16" data-line-number="16">data<span class="op">$</span>group &lt;-<span class="st"> </span><span class="kw">factor</span>(data<span class="op">$</span>group , <span class="dt">levels=</span>myLevels<span class="op">$</span>group )</a></code></pre></div>
<h1 id="proportional-stacked-area-chart">Proportional stacked area chart</h1>
<hr />
<div class="row">
<div class="col-md-6 col-sm-12 align-self-center">
<p>In a proportional stacked area graph, the sum of each year is always equal to hundred and value of each group is represented through percentages.</p>
<p>To make it, you have to calculate these percentages first. This can be done using <code>dplyr</code> of with <code>base R</code>.</p>
</div>
<div class="col-md-6 col-sm-12">
<p><img src="136-stacked-area-chart_files/figure-html/thecode3-1.png" width="100%" /></p>
</div>
</div>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="co"># Compute percentages with dplyr</span></a>
<a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">library</span>(dplyr)</a>
<a class="sourceLine" id="cb3-3" data-line-number="3">data &lt;-<span class="st"> </span>data  <span class="op">%&gt;%</span></a>
<a class="sourceLine" id="cb3-4" data-line-number="4"><span class="st">  </span><span class="kw">group_by</span>(time, group) <span class="op">%&gt;%</span></a>
<a class="sourceLine" id="cb3-5" data-line-number="5"><span class="st">  </span><span class="kw">summarise</span>(<span class="dt">n =</span> <span class="kw">sum</span>(value)) <span class="op">%&gt;%</span></a>
<a class="sourceLine" id="cb3-6" data-line-number="6"><span class="st">  </span><span class="kw">mutate</span>(<span class="dt">percentage =</span> n <span class="op">/</span><span class="st"> </span><span class="kw">sum</span>(n))</a>
<a class="sourceLine" id="cb3-7" data-line-number="7"></a>
<a class="sourceLine" id="cb3-8" data-line-number="8"><span class="co"># Plot</span></a>
<a class="sourceLine" id="cb3-9" data-line-number="9"><span class="kw">ggplot</span>(data, <span class="kw">aes</span>(<span class="dt">x=</span>time, <span class="dt">y=</span>percentage, <span class="dt">fill=</span>group)) <span class="op">+</span><span class="st"> </span></a>
<a class="sourceLine" id="cb3-10" data-line-number="10"><span class="st">    </span><span class="kw">geom_area</span>(<span class="dt">alpha=</span><span class="fl">0.6</span> , <span class="dt">size=</span><span class="dv">1</span>, <span class="dt">colour=</span><span class="st">&quot;black&quot;</span>)</a>
<a class="sourceLine" id="cb3-11" data-line-number="11"></a>
<a class="sourceLine" id="cb3-12" data-line-number="12"><span class="co"># Note: compute percentages without dplyr:</span></a>
<a class="sourceLine" id="cb3-13" data-line-number="13">my_fun &lt;-<span class="st"> </span><span class="cf">function</span>(vec){ </a>
<a class="sourceLine" id="cb3-14" data-line-number="14">  <span class="kw">as.numeric</span>(vec[<span class="dv">2</span>]) <span class="op">/</span><span class="st"> </span><span class="kw">sum</span>(data<span class="op">$</span>value[data<span class="op">$</span>time<span class="op">==</span>vec[<span class="dv">1</span>]]) <span class="op">*</span><span class="dv">100</span> </a>
<a class="sourceLine" id="cb3-15" data-line-number="15">}</a>
<a class="sourceLine" id="cb3-16" data-line-number="16">data<span class="op">$</span>percentage &lt;-<span class="st"> </span><span class="kw">apply</span>(data , <span class="dv">1</span> , my_fun)</a></code></pre></div>
<h1 id="color-style">Color &amp; Style</h1>
<hr />
<div class="row">
<div class="col-md-4 col-sm-12 align-self-center">
<p>Let’s improve the chart general appearance:</p>
<ul>
<li>usage of the <code>viridis</code> color scale</li>
<li><code>theme_ipsum</code> of the <code>hrbrthemes</code> package</li>
<li>add title with <code>ggtitle</code></li>
</ul>
</div>
<div class="col-md-6 col-sm-12">
<p><img src="136-stacked-area-chart_files/figure-html/thecode4-1.png" width="100%" /></p>
</div>
</div>
<div class="sourceCode" id="cb4"><pre class="sourceCode r"><code class="sourceCode r"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="co"># Library</span></a>
<a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">library</span>(viridis)</a>
<a class="sourceLine" id="cb4-3" data-line-number="3"><span class="kw">library</span>(hrbrthemes)</a>
<a class="sourceLine" id="cb4-4" data-line-number="4"></a>
<a class="sourceLine" id="cb4-5" data-line-number="5"><span class="co"># Plot</span></a>
<a class="sourceLine" id="cb4-6" data-line-number="6"><span class="kw">ggplot</span>(data, <span class="kw">aes</span>(<span class="dt">x=</span>time, <span class="dt">y=</span>value, <span class="dt">fill=</span>group)) <span class="op">+</span><span class="st"> </span></a>
<a class="sourceLine" id="cb4-7" data-line-number="7"><span class="st">    </span><span class="kw">geom_area</span>(<span class="dt">alpha=</span><span class="fl">0.6</span> , <span class="dt">size=</span>.<span class="dv">5</span>, <span class="dt">colour=</span><span class="st">&quot;white&quot;</span>) <span class="op">+</span></a>
<a class="sourceLine" id="cb4-8" data-line-number="8"><span class="st">    </span><span class="kw">scale_fill_viridis</span>(<span class="dt">discrete =</span> T) <span class="op">+</span></a>
<a class="sourceLine" id="cb4-9" data-line-number="9"><span class="st">    </span><span class="kw">theme_ipsum</span>() <span class="op">+</span><span class="st"> </span></a>
<a class="sourceLine" id="cb4-10" data-line-number="10"><span class="st">    </span><span class="kw">ggtitle</span>(<span class="st">&quot;The race between ...&quot;</span>)</a></code></pre></div>
<!-- Close container -->
</div>
<!-- ============================ RELATED SECTION ============================ -->
<section class="bg-light" id="portfolio_landing" style="padding-top: 30px; padding-bottom: 30px; margin-top: 100px;">

<div class="container">

  <p class="mySeryTitle">Related chart types</p>
  <hr>
  <div class="row">
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="map.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/Map150.png" alt="">
      </a>
      <div class="captionPortfolio">Map</div>
    </div>
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="choropleth-map.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/Choropleth150.png" alt="">
      </a>
      <div class="captionPortfolio">Choropleth</div>
    </div>
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="hexbin-map.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/MapHexbin150.png" alt="">
      </a>
      <div class="captionPortfolio">Hexbin map</div>
    </div>
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="cartogram.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/Cartogram150.png" alt="">
      </a>
      <div class="captionPortfolio">Cartogram</div>
    </div>
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="connection-map.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/ConnectedMap150.png" alt="">
      </a>
      <div class="captionPortfolio">Connection</div>
    </div>
    <div class="col-md-2 col-sm-4 portfolio-item">
      <a class="portfolio-link"  href="bubble-map.html">
        <div class="portfolio-hover">
          <div class="portfolio-hover-content">
            <i class="fa fa-plus fa-3x"></i>
          </div>
        </div>
        <img class="img-fluid" src="img/section/BubbleMap150.png" alt="">
      </a>
      <div class="captionPortfolio">Bubble map</div>
    </div>
  </div>

</div>
</section>






<!-- ============================ CONTACT SECTION ============================ -->
<section id="contact" class="bg" style="background-color: white; padding-top: 60px">
  <div class="container">
    <div class="row">
      <div class="col-lg-2 text-center"></div>
      <div class="col-lg-8 text-center">
        <br><br><br>
        <h2 class="section-heading text-uppercase" style="color: black">Contact</h2>
        <p>This document is a work by <a href="https://www.yan-holtz.com">Yan Holtz</a>. Any feedback is highly encouraged. You can fill an issue on <a href="https://github.com/holtzy/D3-graph-gallery/issues">Github</a>, drop me a message on <a href="https://twitter.com/R_Graph_Gallery">Twitter</a>, or send an email pasting <a href="">yan.holtz.data</a> with <a href="">gmail.com</a>.</p>
        <div style="text-align:center">
           <a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="https://github.com/holtzy">Github</a>
           <a class="btn btn-primary btn-xl text-uppercase js-scroll-trigger" href="https://twitter.com/R_Graph_Gallery">Twitter</a>
         </div>
      </div>
    </div>
  </div>
</section>



<!-- ============================ FOOTER SECTION ============================ -->
<footer class="bg-light" id="myFooter">
  <div class="container" >
    <div class="row">
      <div class="col-md-4">
        <span class="copyright">Copyright &copy; the R graph gallery 2018</span>
      </div>
      <div class="col-md-4">
        <ul class="list-inline social-buttons">
          <li class="list-inline-item">
            <a href="https://twitter.com/R_Graph_Gallery">
              <i class="fa fa-twitter"></i>
            </a>
          </li>
          <li class="list-inline-item">
            <a href="https://github.com/holtzy">
              <i class="fa fa-github"></i>
            </a>
          </li>
          <li class="list-inline-item">
            <a href="https://www.linkedin.com/in/yan-holtz-2477534a/">
              <i class="fa fa-linkedin"></i>
            </a>
          </li>
        </ul>
      </div>
      <div class="col-md-4">
        <ul class="list-inline quicklinks">
          <li class="list-inline-item">
            <a href="#">Privacy Policy</a>
          </li>
          <li class="list-inline-item">
            <a href="#">Terms of Use</a>
          </li>
        </ul>
      </div>
    </div>
  </div>
</footer>




<script>

// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
  $('tr.header').parent('thead').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
  bootstrapStylePandocTables();
});


</script>



<!-- ============================ JAVASCRIPT SECTION ============================ -->

<!-- Bootstrap core JavaScript -->
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

<!-- Custom scripts for this template -->
<script src="js/agency.min.js"></script>

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-79254642-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-79254642-1');
</script>

</body>
</html>