&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Articles from October 2026 on PowerShell.org - Welcome Automaters!</title><link>https://powershell.org/articles/2026/10/</link><description>Recent content in Articles from October 2026 on PowerShell.org - Welcome Automaters!</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://powershell.org/articles/2026/10/index.xml" rel="self" type="application/rss+xml"/><item><title>Build Vega-Lite HTML Reports with PowerShell</title><link>https://powershell.org/articles/2026/10/build-vega-lite-html-reports-with-powershell/</link><guid>https://powershell.org/articles/2026/10/build-vega-lite-html-reports-with-powershell/</guid><pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate><description>&lt;p&gt;PowerShell is good at acquiring data and turning it into objects. Vega-Lite is good at turning structured data into interactive graphics. A small function is enough to connect the two without adopting a reporting framework or opening a browser from the script.&lt;/p&gt;
&lt;p&gt;In this article, we download the &lt;a href="https://allisonhorst.github.io/palmerpenguins/"&gt;Palmer Penguins&lt;/a&gt; dataset, clean it with ordinary PowerShell, describe three views as one Vega-Lite specification, and save the finished report as an HTML file.&lt;/p&gt;</description><content:encoded>&lt;![CDATA[<p>PowerShell is good at acquiring data and turning it into objects. Vega-Lite is good at turning structured data into interactive graphics. A small function is enough to connect the two without adopting a reporting framework or opening a browser from the script.</p><p>In this article, we download the<a href="https://allisonhorst.github.io/palmerpenguins/">Palmer Penguins</a> dataset, clean it with ordinary PowerShell, describe three views as one Vega-Lite specification, and save the finished report as an HTML file.</p><p>The key design choice is that<code>Show-VegaLite</code> doesn&rsquo;t decide what to do with the HTML. It returns the document to the pipeline:</p><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#79c0ff">$reportSpec</span> |</span></span><span style="display:flex;"><span> Show-VegaLite -PageTitle<span style="color:#a5d6ff">'Palmer Penguins report'</span> |</span></span><span style="display:flex;"><span> Set-Content -Path ./penguins-report.<span style="color:#79c0ff">html</span> -Encoding utf8</span></span></code></pre></td></tr></table></div></div><p>That makes the renderer useful in a console script, scheduled job, CI pipeline, or notebook.</p><h2 id="the-finished-report" class="ps-heading">The finished report<a class="ps-heading-anchor" href="#the-finished-report" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p>The example produces one HTML document containing a bar chart, scatter plot, and box plot.</p><p><img src="palmer-penguins-report.png" alt="Palmer Penguins HTML report generated from PowerShell objects with Vega-Lite"/><p>The charts answer progressively richer questions:</p><ul><li>How many complete observations are available for each species?</li><li>How do bill length and bill depth separate the species?</li><li>How different are the body-mass distributions?</li></ul><p>The saved report remains interactive. Vega-Embed provides tooltips and an action menu that can export individual views.</p><h2 id="load-and-shape-the-data" class="ps-heading">Load and shape the data<a class="ps-heading-anchor" href="#load-and-shape-the-data" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p>The simplified Palmer Penguins dataset has 344 rows and eight columns. It contains categories, measurements, missing values, and several visible relationships, which makes it a useful alternative to the classic Iris dataset. The project publishes the data under CC0 and documents the original Palmer Station LTER sources.</p><p>PowerShell can download the CSV directly:</p><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">18</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">19</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">20</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">21</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">22</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">23</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">24</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#79c0ff">$dataUrl</span> =<span style="color:#a5d6ff">'https://raw.githubusercontent.com/'</span> +</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">'allisonhorst/palmerpenguins/main/inst/extdata/penguins.csv'</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#79c0ff">$penguins</span> = Invoke-RestMethod -Uri<span style="color:#79c0ff">$dataUrl</span> |</span></span><span style="display:flex;"><span> ConvertFrom-Csv |</span></span><span style="display:flex;"><span> Where-Object {</span></span><span style="display:flex;"><span><span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">bill_length_mm</span><span style="color:#ff7b72;font-weight:bold">-ne</span><span style="color:#a5d6ff">'NA'</span><span style="color:#ff7b72;font-weight:bold">-and</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">bill_depth_mm</span><span style="color:#ff7b72;font-weight:bold">-ne</span><span style="color:#a5d6ff">'NA'</span><span style="color:#ff7b72;font-weight:bold">-and</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">flipper_length_mm</span><span style="color:#ff7b72;font-weight:bold">-ne</span><span style="color:#a5d6ff">'NA'</span><span style="color:#ff7b72;font-weight:bold">-and</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">body_mass_g</span><span style="color:#ff7b72;font-weight:bold">-ne</span><span style="color:#a5d6ff">'NA'</span><span style="color:#ff7b72;font-weight:bold">-and</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">sex</span><span style="color:#ff7b72;font-weight:bold">-ne</span><span style="color:#a5d6ff">'NA'</span></span></span><span style="display:flex;"><span> } |</span></span><span style="display:flex;"><span> ForEach-Object {</span></span><span style="display:flex;"><span> [<span style="color:#79c0ff;font-weight:bold">pscustomobject</span>]<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> species =<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">species</span></span></span><span style="display:flex;"><span> island =<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">island</span></span></span><span style="display:flex;"><span> bill_length_mm = [<span style="color:#79c0ff;font-weight:bold">double</span>]<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">bill_length_mm</span></span></span><span style="display:flex;"><span> bill_depth_mm = [<span style="color:#79c0ff;font-weight:bold">double</span>]<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">bill_depth_mm</span></span></span><span style="display:flex;"><span> flipper_length_mm = [<span style="color:#79c0ff;font-weight:bold">int</span>]<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">flipper_length_mm</span></span></span><span style="display:flex;"><span> body_mass_g = [<span style="color:#79c0ff;font-weight:bold">int</span>]<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">body_mass_g</span></span></span><span style="display:flex;"><span> sex =<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">sex</span></span></span><span style="display:flex;"><span> year = [<span style="color:#79c0ff;font-weight:bold">int</span>]<span style="color:#79c0ff">$_</span>.<span style="color:#79c0ff">year</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span></code></pre></td></tr></table></div></div><p>The explicit casts matter.<code>ConvertFrom-Csv</code> initially creates strings, while Vega-Lite should receive JSON numbers for quantitative fields. Removing incomplete records keeps this example focused. A production report could retain them and add a separate data-quality summary.</p><h2 id="describe-several-charts-in-one-specification" class="ps-heading">Describe several charts in one specification<a class="ps-heading-anchor" href="#describe-several-charts-in-one-specification" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p>Vega-Lite specifications are JSON documents. PowerShell ordered hashtables and arrays let us construct the same structure while keeping the data as objects until the final serialization step.</p><p>The top-level<code>data</code> property makes the cleaned data available to every view.<code>vconcat</code> places the count chart above an<code>hconcat</code> containing the scatter and box plots:</p><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 10</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 11</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 12</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 13</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 14</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 15</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 16</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 17</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 18</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 19</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 20</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 21</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 22</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 23</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 24</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 25</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 26</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 27</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 28</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 29</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 30</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 31</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 32</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 33</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 34</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 35</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 36</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 37</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 38</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 39</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 40</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 41</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 42</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 43</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 44</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 45</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 46</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 47</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 48</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 49</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 50</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 51</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 52</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 53</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 54</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 55</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 56</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 57</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 58</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 59</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 60</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 61</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 62</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 63</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 64</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 65</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 66</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 67</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 68</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 69</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 70</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 71</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 72</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 73</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 74</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 75</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 76</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 77</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 78</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 79</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 80</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 81</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 82</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 83</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 84</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 85</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 86</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 87</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 88</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 89</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 90</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 91</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 92</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 93</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 94</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 95</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 96</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 97</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 98</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 99</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">100</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">101</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">102</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">103</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">104</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">105</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">106</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">107</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">108</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">109</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">110</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">111</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">112</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">113</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">114</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">115</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">116</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">117</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">118</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#79c0ff">$reportSpec</span> = [<span style="color:#79c0ff;font-weight:bold">ordered</span>]<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span><span style="color:#a5d6ff">'$schema'</span> =<span style="color:#a5d6ff">'https://vega.github.io/schema/vega-lite/v6.json'</span></span></span><span style="display:flex;"><span> data =<span style="color:#79c0ff">@</span>{ values =<span style="color:#79c0ff">@</span>(<span style="color:#79c0ff">$penguins</span>) }</span></span><span style="display:flex;"><span> spacing =<span style="color:#a5d6ff">24</span></span></span><span style="display:flex;"><span> vconcat =<span style="color:#79c0ff">@</span>(</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> width =<span style="color:#a5d6ff">760</span></span></span><span style="display:flex;"><span> height =<span style="color:#a5d6ff">150</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Observations by species'</span></span></span><span style="display:flex;"><span> mark =<span style="color:#79c0ff">@</span>{ type =<span style="color:#a5d6ff">'bar'</span>; cornerRadiusEnd =<span style="color:#a5d6ff">3</span> }</span></span><span style="display:flex;"><span> encoding =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> x =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'species'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> title =<span style="color:#79c0ff">$null</span></span></span><span style="display:flex;"><span> sort =<span style="color:#a5d6ff">'-y'</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> y =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> aggregate =<span style="color:#a5d6ff">'count'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'quantitative'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Penguins'</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> color =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'species'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> legend =<span style="color:#79c0ff">$null</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> tooltip =<span style="color:#79c0ff">@</span>(</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{ field =<span style="color:#a5d6ff">'species'</span>; type =<span style="color:#a5d6ff">'nominal'</span>; title =<span style="color:#a5d6ff">'Species'</span> }</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{ aggregate =<span style="color:#a5d6ff">'count'</span>; type =<span style="color:#a5d6ff">'quantitative'</span>; title =<span style="color:#a5d6ff">'Observations'</span> }</span></span><span style="display:flex;"><span> )</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> hconcat =<span style="color:#79c0ff">@</span>(</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> width =<span style="color:#a5d6ff">365</span></span></span><span style="display:flex;"><span> height =<span style="color:#a5d6ff">300</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Bill dimensions'</span></span></span><span style="display:flex;"><span> mark =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'point'</span></span></span><span style="display:flex;"><span> filled =<span style="color:#79c0ff">$true</span></span></span><span style="display:flex;"><span> opacity =<span style="color:#a5d6ff">0.72</span></span></span><span style="display:flex;"><span> size =<span style="color:#a5d6ff">65</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> encoding =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> x =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'bill_length_mm'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'quantitative'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Bill length (mm)'</span></span></span><span style="display:flex;"><span> scale =<span style="color:#79c0ff">@</span>{ zero =<span style="color:#79c0ff">$false</span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> y =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'bill_depth_mm'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'quantitative'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Bill depth (mm)'</span></span></span><span style="display:flex;"><span> scale =<span style="color:#79c0ff">@</span>{ zero =<span style="color:#79c0ff">$false</span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> color =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'species'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Species'</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> shape =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'sex'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Sex'</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span><span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> width =<span style="color:#a5d6ff">365</span></span></span><span style="display:flex;"><span> height =<span style="color:#a5d6ff">300</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Body mass distribution'</span></span></span><span style="display:flex;"><span> mark =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'boxplot'</span></span></span><span style="display:flex;"><span> extent =<span style="color:#a5d6ff">'min-max'</span></span></span><span style="display:flex;"><span> size =<span style="color:#a5d6ff">34</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> encoding =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> x =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'species'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> title =<span style="color:#79c0ff">$null</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> y =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'body_mass_g'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'quantitative'</span></span></span><span style="display:flex;"><span> title =<span style="color:#a5d6ff">'Body mass (g)'</span></span></span><span style="display:flex;"><span> scale =<span style="color:#79c0ff">@</span>{ zero =<span style="color:#79c0ff">$false</span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> color =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> field =<span style="color:#a5d6ff">'species'</span></span></span><span style="display:flex;"><span> type =<span style="color:#a5d6ff">'nominal'</span></span></span><span style="display:flex;"><span> legend =<span style="color:#79c0ff">$null</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> )</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> )</span></span><span style="display:flex;"><span> config =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> view =<span style="color:#79c0ff">@</span>{ stroke =<span style="color:#79c0ff">$null</span> }</span></span><span style="display:flex;"><span> axis =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> labelColor =<span style="color:#a5d6ff">'#42506a'</span></span></span><span style="display:flex;"><span> titleColor =<span style="color:#a5d6ff">'#27334a'</span></span></span><span style="display:flex;"><span> gridColor =<span style="color:#a5d6ff">'#e6eaf0'</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> title =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> anchor =<span style="color:#a5d6ff">'start'</span></span></span><span style="display:flex;"><span> color =<span style="color:#a5d6ff">'#17233c'</span></span></span><span style="display:flex;"><span> fontSize =<span style="color:#a5d6ff">16</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> range =<span style="color:#79c0ff">@</span>{</span></span><span style="display:flex;"><span> category =<span style="color:#79c0ff">@</span>(<span style="color:#a5d6ff">'#4c78a8'</span>,<span style="color:#a5d6ff">'#f58518'</span>,<span style="color:#a5d6ff">'#54a24b'</span>)</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span>}</span></span></code></pre></td></tr></table></div></div><p>This is still only data. No chart process has started, and PowerShell hasn&rsquo;t emitted HTML yet.</p><h2 id="return-html-instead-of-taking-control" class="ps-heading">Return HTML instead of taking control<a class="ps-heading-anchor" href="#return-html-instead-of-taking-control" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p><code>Show-VegaLite</code> performs four operations:</p><ol><li>Serialize the specification with enough JSON depth for nested encodings.</li><li>Encode that JSON as UTF-8 Base64 to avoid quoting and<code>&lt;/script&gt;</code> problems inside the page.</li><li>Create a small HTML document that loads pinned Vega, Vega-Lite, and Vega-Embed versions.</li><li>Return the document as a string.</li></ol><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 3</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 4</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 5</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 6</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 7</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 8</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679"> 9</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">10</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">11</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">12</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">13</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">14</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">15</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">16</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">17</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">18</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">19</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">20</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">21</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">22</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">23</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">24</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">25</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">26</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">27</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">28</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">29</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">30</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">31</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">32</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">33</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">34</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">35</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">36</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">37</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">38</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">39</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">40</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">41</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">42</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">43</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">44</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">45</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">46</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">47</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">48</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">49</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">50</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">51</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">52</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">53</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">54</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">55</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">56</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">57</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">58</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">59</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">60</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">61</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">62</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#ff7b72">function</span><span style="color:#6e7681"/>Show-VegaLite {</span></span><span style="display:flex;"><span> [CmdletBinding()]</span></span><span style="display:flex;"><span><span style="color:#ff7b72">param</span>(</span></span><span style="display:flex;"><span> [Parameter(Mandatory, ValueFromPipeline)]</span></span><span style="display:flex;"><span> [<span style="color:#79c0ff;font-weight:bold">System.Collections.IDictionary</span>]<span style="color:#79c0ff">$Spec</span>,</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span> [<span style="color:#79c0ff;font-weight:bold">string</span>]<span style="color:#79c0ff">$PageTitle</span> =<span style="color:#a5d6ff">'Vega-Lite report'</span>,</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span> [ValidateSet(<span style="color:#a5d6ff">'svg'</span>,<span style="color:#a5d6ff">'canvas'</span>)]</span></span><span style="display:flex;"><span> [<span style="color:#79c0ff;font-weight:bold">string</span>]<span style="color:#79c0ff">$Renderer</span> =<span style="color:#a5d6ff">'svg'</span></span></span><span style="display:flex;"><span> )</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#ff7b72">process</span> {</span></span><span style="display:flex;"><span><span style="color:#79c0ff">$specJson</span> =<span style="color:#79c0ff">$Spec</span> | ConvertTo-Json -Depth<span style="color:#a5d6ff">100</span> -Compress</span></span><span style="display:flex;"><span><span style="color:#79c0ff">$specBase64</span> = [<span style="color:#79c0ff;font-weight:bold">Convert</span>]::ToBase64String(</span></span><span style="display:flex;"><span> [<span style="color:#79c0ff;font-weight:bold">Text.Encoding</span>]::UTF8.<span style="color:#79c0ff">GetBytes</span>(<span style="color:#79c0ff">$specJson</span>)</span></span><span style="display:flex;"><span> )</span></span><span style="display:flex;"><span><span style="color:#79c0ff">$encodedTitle</span> = [<span style="color:#79c0ff;font-weight:bold">Net.WebUtility</span>]::HtmlEncode(<span style="color:#79c0ff">$PageTitle</span>)</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#79c0ff">@"</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;!doctype html&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;html lang="en"&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;head&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;meta charset="utf-8"&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;title&gt;</span><span style="color:#79c0ff">$encodedTitle</span><span style="color:#79c0ff">&lt;/title&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;script src="https://cdn.jsdelivr.net/npm/vega@6.3.1"&gt;&lt;/script&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;script src="https://cdn.jsdelivr.net/npm/vega-lite@6.4.3"&gt;&lt;/script&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;script src="https://cdn.jsdelivr.net/npm/vega-embed@7.1.0"&gt;&lt;/script&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;style&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> body { font-family: system-ui, sans-serif; margin: 2rem; }</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> #vis { overflow-x: auto; }</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> .error { color: #a61b1b; white-space: pre-wrap; }</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;/style&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;/head&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;body&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;h1&gt;</span><span style="color:#79c0ff">$encodedTitle</span><span style="color:#79c0ff">&lt;/h1&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;div id="vis"&gt;&lt;/div&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;script&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> const binary = atob("</span><span style="color:#79c0ff">$specBase64</span><span style="color:#79c0ff">");</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> const bytes = Uint8Array.from(</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> binary,</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> character =&gt; character.charCodeAt(0)</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> );</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> const spec = JSON.parse(new TextDecoder().decode(bytes));</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"/></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> vegaEmbed("#vis", spec, {</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> mode: "vega-lite",</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> renderer: "</span><span style="color:#79c0ff">$Renderer</span><span style="color:#79c0ff">",</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> actions: true</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> }).catch(error =&gt; {</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> const message = document.createElement("div");</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> message.className = "error";</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> message.textContent = error.stack || error.message;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> document.querySelector("#vis").replaceChildren(message);</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> });</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff"> &lt;/script&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;/body&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">&lt;/html&gt;</span></span></span><span style="display:flex;"><span><span style="color:#79c0ff">"@</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span>}</span></span></code></pre></td></tr></table></div></div><p>The function doesn&rsquo;t call<code>Set-Content</code>,<code>Out-File</code>,<code>Start-Process</code>, or a notebook-specific display command. That separation lets the caller choose the destination.</p><h2 id="save-the-report" class="ps-heading">Save the report<a class="ps-heading-anchor" href="#save-the-report" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p>Pipe the specification through the renderer and save the returned string:</p><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">4</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">5</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">6</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">7</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#79c0ff">$outputPath</span> = Join-Path<span style="color:#79c0ff">$PWD</span><span style="color:#a5d6ff">'penguins-report.html'</span></span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span><span style="color:#79c0ff">$reportSpec</span> |</span></span><span style="display:flex;"><span> Show-VegaLite -PageTitle<span style="color:#a5d6ff">'Palmer Penguins report'</span> |</span></span><span style="display:flex;"><span> Set-Content -Path<span style="color:#79c0ff">$outputPath</span> -Encoding utf8</span></span><span style="display:flex;"><span/></span><span style="display:flex;"><span>Get-Item<span style="color:#79c0ff">$outputPath</span></span></span></code></pre></td></tr></table></div></div><p>The resulting file contains the selected data and complete Vega-Lite specification. You can attach it to a ticket, publish it as a build artifact, copy it to static hosting, or open it locally.</p><p>It isn&rsquo;t completely offline: the HTML contains the data and chart definition, but it loads the JavaScript runtimes from jsDelivr. A fully offline variant can download those runtime files and reference local copies, at the cost of shipping several additional assets.</p><h2 id="reuse-the-same-output-elsewhere" class="ps-heading">Reuse the same output elsewhere<a class="ps-heading-anchor" href="#reuse-the-same-output-elsewhere" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><p>Returning HTML to the pipeline leaves room for other destinations. For example, a host that supports rich MIME output can render the same document directly:</p><div class="highlight"><div style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">1</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">2</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#737679">3</span></code></pre></td><td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span><span style="color:#79c0ff">$reportSpec</span> |</span></span><span style="display:flex;"><span> Show-VegaLite |</span></span><span style="display:flex;"><span> Display -MimeType<span style="color:#a5d6ff">'text/html'</span></span></span></code></pre></td></tr></table></div></div><p>The boundary stays simple: PowerShell prepares objects, Vega-Lite describes the visualization, and the last command decides whether the result becomes a file, build artifact, web page, or interactive cell.</p><h2 id="references" class="ps-heading">References<a class="ps-heading-anchor" href="#references" aria-label="Link to this section" title="Link to this section"><i class="fas fa-link" aria-hidden="true"/></a></h2><ul><li><a href="https://allisonhorst.github.io/palmerpenguins/">Palmer Penguins project and data documentation</a></li><li><a href="https://vega.github.io/vega-lite/">Vega-Lite documentation</a></li><li><a href="https://github.com/vega/vega-embed">Vega-Embed documentation</a></li></ul>
]]></content:encoded></item></channel></rss>