<!-- Generated by pkgdown: do not edit by hand --><htmllang="en"><head><metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"><metacharset="utf-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width, initial-scale=1, shrink-to-fit=no"><metaname="description"content="Produces a ggplot2 variant of a so-called biplot for PCA (principal component analysis), but is more flexible and more appealing than the base R biplot() function."><title>PCA Biplot with ggplot2 — ggplot_pca • AMR (for R)</title><!-- favicons --><linkrel="icon"type="image/png"sizes="16x16"href="../favicon-16x16.png"><linkrel="icon"type="image/png"sizes="32x32"href="../favicon-32x32.png"><linkrel="apple-touch-icon"type="image/png"sizes="180x180"href="../apple-touch-icon.png"><linkrel="apple-touch-icon"type="image/png"sizes="120x120"href="../apple-touch-icon-120x120.png"><linkrel="apple-touch-icon"type="image/png"sizes="76x76"href="../apple-touch-icon-76x76.png"><linkrel="apple-touch-icon"type="image/png"sizes="60x60"href="../apple-touch-icon-60x60.png"><scriptsrc="../deps/jquery-3.6.0/jquery-3.6.0.min.js"></script><metaname="viewport"content="width=device-width, initial-scale=1, shrink-to-fit=no"><linkhref="../deps/bootstrap-5.2.2/bootstrap.min.css"rel="stylesheet"><scriptsrc="../deps/bootstrap-5.2.2/bootstrap.bundle.min.js"></script><linkhref="../deps/Fira_Code-0.4.7/font.css"rel="stylesheet"><!-- Font Awesome icons --><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css"integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk="crossorigin="anonymous"><linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css"integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw="crossorigin="anonymous"><!-- bootstrap-toc --><scriptsrc="https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js"integrity="sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo="crossorigin="anonymous"></script><!-- headroom.js --><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js"integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0="crossorigin="anonymous"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js"integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4="crossorigin="anonymous"></script><!-- clipboard.js --><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js"integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI="crossorigin="anonymous"></script><!-- search --><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js"integrity="sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A=="crossorigin="anonymous"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js"integrity="sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg=="crossorigin="anonymous"></script><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js"integrity="sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww=="crossorigin="anonymous"></script><!-- pkgdown --><scriptsrc="../pkgdown.js"></script><linkhref="../extra.css"rel="stylesheet"><scriptsrc="../extra.js"></script><metaproperty="og:title"content="PCA Biplot with ggplot2 — ggplot_pca"><metaproperty="og:description"content="Produces a ggplot2 variant of a so-called biplot for PCA (principal component analysis), but is more flexible and more appealing than the base R biplot() function."><metaproperty="og:image"content="https://msberends.github.io/AMR/logo.svg"><metaname="twitter:card"content="summary_large_image"><metaname="twitter:creator"content="@msberends"><metaname="twitter:site"content="@msberends"><!-- mathjax --><scriptsrc="https://cdnjs.clo
<p>Produces a <code>ggplot2</code> variant of a so-called <ahref="https://en.wikipedia.org/wiki/Biplot"class="external-link">biplot</a> for PCA (principal component analysis), but is more flexible and more appealing than the base <spanstyle="R">R</span><code><ahref="https://rdrr.io/r/stats/biplot.html"class="external-link">biplot()</a></code> function.</p>
<p>The <code>ggplot_pca()</code> function is based on the <code>ggbiplot()</code> function from the <code>ggbiplot</code> package by Vince Vu, as found on GitHub: <ahref="https://github.com/vqv/ggbiplot"class="external-link">https://github.com/vqv/ggbiplot</a> (retrieved: 2 March 2020, their latest commit: <ahref="https://github.com/vqv/ggbiplot/commit/7325e880485bea4c07465a0304c470608fffb5d9"class="external-link"><code>7325e88</code></a>; 12 February 2015).</p>
<p>As per their GPL-2 licence that demands documentation of code changes, the changes made based on the source code were:</p><ol><li><p>Rewritten code to remove the dependency on packages <code>plyr</code>, <code>scales</code> and <code>grid</code></p></li>
<li><p>Parametrised more options, like arrow and ellipse settings</p></li>
<li><p>Hardened all input possibilities by defining the exact type of user input for every argument</p></li>
<li><p>Added total amount of explained variance as a caption in the plot</p></li>
<li><p>Cleaned all syntax based on the <code>lintr</code> package, fixed grammatical errors and added integrity checks</p></li>
<dd><p>an object returned by <code><ahref="pca.html">pca()</a></code>, <code><ahref="https://rdrr.io/r/stats/prcomp.html"class="external-link">prcomp()</a></code> or <code><ahref="https://rdrr.io/r/stats/princomp.html"class="external-link">princomp()</a></code></p></dd>
<dt>choices</dt>
<dd><p>length 2 vector specifying the components to plot. Only the default
is a biplot in the strict sense.</p></dd>
<dt>scale</dt>
<dd><p>The variables are scaled by <code>lambda ^ scale</code> and the
observations are scaled by <code>lambda ^ (1-scale)</code> where
<code>lambda</code> are the singular values as computed by
<code><ahref="https://rdrr.io/r/stats/princomp.html"class="external-link">princomp</a></code>. Normally <code>0 <= scale <= 1</code>, and a warning
will be issued if the specified <code>scale</code> is outside this range.</p></dd>
<dt>pc.biplot</dt>
<dd><p>If true, use what Gabriel (1971) refers to as a "principal component
biplot", with <code>lambda = 1</code> and observations scaled up by sqrt(n) and
variables scaled down by sqrt(n). Then inner products between
variables approximate covariances and distances between observations
approximate Mahalanobis distance.</p></dd>
<dt>labels</dt>
<dd><p>an optional vector of labels for the observations. If set, the labels will be placed below their respective points. When using the <code><ahref="pca.html">pca()</a></code> function as input for <code>x</code>, this will be determined automatically based on the attribute <code>non_numeric_cols</code>, see <code><ahref="pca.html">pca()</a></code>.</p></dd>
<dt>labels_textsize</dt>
<dd><p>the size of the text used for the labels</p></dd>
<dt>labels_text_placement</dt>
<dd><p>adjustment factor the placement of the variable names (<code>>=1</code> means further away from the arrow head)</p></dd>
<dt>groups</dt>
<dd><p>an optional vector of groups for the labels, with the same length as <code>labels</code>. If set, the points and labels will be coloured according to these groups. When using the <code><ahref="pca.html">pca()</a></code> function as input for <code>x</code>, this will be determined automatically based on the attribute <code>non_numeric_cols</code>, see <code><ahref="pca.html">pca()</a></code>.</p></dd>
<dt>ellipse</dt>
<dd><p>a <ahref="https://rdrr.io/r/base/logical.html"class="external-link">logical</a> to indicate whether a normal data ellipse should be drawn for each group (set with <code>groups</code>)</p></dd>
<dt>ellipse_prob</dt>
<dd><p>statistical size of the ellipse in normal probability</p></dd>
<dt>ellipse_size</dt>
<dd><p>the size of the ellipse line</p></dd>
<dt>ellipse_alpha</dt>
<dd><p>the alpha (transparency) of the ellipse line</p></dd>
<dt>points_size</dt>
<dd><p>the size of the points</p></dd>
<dt>points_alpha</dt>
<dd><p>the alpha (transparency) of the points</p></dd>
<dt>arrows</dt>
<dd><p>a <ahref="https://rdrr.io/r/base/logical.html"class="external-link">logical</a> to indicate whether arrows should be drawn</p></dd>
<dt>arrows_colour</dt>
<dd><p>the colour of the arrow and their text</p></dd>
<dt>arrows_size</dt>
<dd><p>the size (thickness) of the arrow lines</p></dd>
<dt>arrows_textsize</dt>
<dd><p>the size of the text at the end of the arrows</p></dd>
<dt>arrows_textangled</dt>
<dd><p>a <ahref="https://rdrr.io/r/base/logical.html"class="external-link">logical</a> whether the text at the end of the arrows should be angled</p></dd>
<dt>arrows_alpha</dt>
<dd><p>the alpha (transparency) of the arrows and their text</p></dd>
<dt>base_textsize</dt>
<dd><p>the text size for all plot elements except the labels and arrows</p></dd>
<p>The colours for labels and points can be changed by adding another scale layer for colour, such as <code><ahref="https://ggplot2.tidyverse.org/reference/scale_viridis.html"class="external-link">scale_colour_viridis_d()</a></code> and <code><ahref="https://ggplot2.tidyverse.org/reference/scale_brewer.html"class="external-link">scale_colour_brewer()</a></code>.</p>
<divclass="sourceCode"><preclass="sourceCode r"><code><spanclass="r-in"><span><spanclass="co"># `example_isolates` is a data set available in the AMR package.</span></span></span>
<spanclass="r-in"><span><spanclass="co"># See ?example_isolates.</span></span></span>
<spanclass="r-in"><span> order <spanclass="op">=</span><spanclass="fu"><ahref="mo_property.html">mo_order</a></span><spanclass="op">(</span><spanclass="va">mo</span><spanclass="op">)</span>, <spanclass="co"># group on anything, like order</span></span></span>
<spanclass="r-in"><span> genus <spanclass="op">=</span><spanclass="fu"><ahref="mo_property.html">mo_genus</a></span><spanclass="op">(</span><spanclass="va">mo</span><spanclass="op">)</span></span></span>
<spanclass="r-in"><span><spanclass="op">)</span><spanclass="op"><ahref="https://magrittr.tidyverse.org/reference/pipe.html"class="external-link">%>%</a></span><spanclass="co"># and genus as we do here;</span></span></span>
<spanclass="r-in"><span><spanclass="fu"><ahref="https://dplyr.tidyverse.org/reference/filter.html"class="external-link">filter</a></span><spanclass="op">(</span><spanclass="fu"><ahref="https://dplyr.tidyverse.org/reference/context.html"class="external-link">n</a></span><spanclass="op">(</span><spanclass="op">)</span><spanclass="op">>=</span><spanclass="fl">30</span><spanclass="op">)</span><spanclass="op"><ahref="https://magrittr.tidyverse.org/reference/pipe.html"class="external-link">%>%</a></span><spanclass="co"># filter on only 30 results per group</span></span></span>
<spanclass="r-in"><span><spanclass="fu"><ahref="https://dplyr.tidyverse.org/reference/summarise_all.html"class="external-link">summarise_if</a></span><spanclass="op">(</span><spanclass="va">is.sir</span>, <spanclass="va">resistance</span><spanclass="op">)</span><spanclass="co"># then get resistance of all drugs</span></span></span>
<spanclass="r-wrn co"><spanclass="r-pr">#></span><spanstyle="color: #00BBBB;">ℹ</span> In group 5: `order = "Lactobacillales"`, `genus = "Enterococcus"`.</span>
<spanclass="r-wrn co"><spanclass="r-pr">#></span> Caused by warning:</span>
<spanclass="r-wrn co"><spanclass="r-pr">#></span><spanstyle="color: #BBBB00;">!</span> Introducing NA: only 14 results available for PEN in group: order =</span>
<spanclass="r-wrn co"><spanclass="r-pr">#></span><spanstyle="color: #00BBBB;">ℹ</span> Run `dplyr::last_dplyr_warnings()` to see the 72 remaining warnings.</span>
<p></p><p><code>AMR</code> (for R). Free and open-source, licenced under the <atarget="_blank"href="https://github.com/msberends/AMR/blob/main/LICENSE"class="external-link">GNU General Public License version 2.0 (GPL-2)</a>.<br>Developed at the <atarget="_blank"href="https://www.rug.nl"class="external-link">University of Groningen</a> and <atarget="_blank"href="https://www.umcg.nl"class="external-link">University Medical Center Groningen</a> in The Netherlands.</p>