<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iOS charts &#8211; swiftyplace</title>
	<atom:link href="http://www.swiftyplace.com/blog/tag/ios-charts/feed" rel="self" type="application/rss+xml" />
	<link>http://www.swiftyplace.com</link>
	<description>Learn how to build amazing apps with SwiftUI and Combine</description>
	<lastBuildDate>Tue, 09 Jan 2024 18:12:43 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>http://www.swiftyplace.com/wp-content/uploads/2023/08/cropped-logo-1-32x32.png</url>
	<title>iOS charts &#8211; swiftyplace</title>
	<link>http://www.swiftyplace.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Introduction to SwiftCharts: Creating Charts and Graphs in SwiftUI</title>
		<link>http://www.swiftyplace.com/blog/swiftcharts-create-charts-and-graphs-in-swiftui?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=swiftcharts-create-charts-and-graphs-in-swiftui</link>
					<comments>http://www.swiftyplace.com/blog/swiftcharts-create-charts-and-graphs-in-swiftui#comments</comments>
		
		<dc:creator><![CDATA[Karin Prater]]></dc:creator>
		<pubDate>Fri, 21 Jul 2023 13:25:25 +0000</pubDate>
				<category><![CDATA[SwiftUI]]></category>
		<category><![CDATA[iOS charts]]></category>
		<category><![CDATA[swift graphs]]></category>
		<category><![CDATA[swiftcharts]]></category>
		<category><![CDATA[swiftui charts]]></category>
		<guid isPermaLink="false">https://swiftyplace.com/?p=172</guid>

					<description><![CDATA[<p>Learn about 📊📈 SwiftCharts in SwiftUI and create line, bar, pie, and rule charts. With many examples and step-by-step instructions to handle data.</p>
<p>The post <a rel="nofollow" href="http://www.swiftyplace.com/blog/swiftcharts-create-charts-and-graphs-in-swiftui">Introduction to SwiftCharts: Creating Charts and Graphs in SwiftUI</a> appeared first on <a rel="nofollow" href="http://www.swiftyplace.com">swiftyplace</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Data visualization plays a crucial role in conveying information effectively and making complex data more accessible to users. In iOS development, the Swift Charts framework provides a powerful and user-friendly solution for creating stunning charts and graphs in SwiftUI. This blog post will give you an introduction to SwiftCharts and show you how to create visually appealing and informative charts in your iOS and macOS apps.</p>



<div style="height:26px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_examples.jpg" alt="SwiftCharts Examples in SwiftUI"/></figure>
</div>


<div style="height:26px" aria-hidden="true" class="wp-block-spacer"></div>



<p>In this blog post, I will share my experience and insights into using Swift Charts to create various types of charts, including bar charts, line charts, point charts, area charts, ruler charts, rectangle charts, and pie charts. I will provide step-by-step examples and explanations to help you understand the fundamentals of each chart type and demonstrate how to customize them to suit your specific needs.</p>



			
			
										
			
			


<div style="height:45px" aria-hidden="true" class="wp-block-spacer"></div>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b07.png" alt="⬇" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Get the example project files from this&nbsp;<a style="color: #40d9ed; transition: 0.25s; margin-bottom: 10px; line-height: 28px;" href="https://github.com/gahntpo/BookstoreStategist" target="_blank" rel="noopener">GitHub repo</a>!</p>



<p>So, if you’re ready to take your data visualization skills to the next level and create compelling charts in your iOS apps, let’s dive into the world of Swift Charts!</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">How to create Charts in Swift?</h2>



<p>To start using Swift Charts in your SwiftUI app, you need to import the SwiftCharts framework:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="import Charts" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Charts</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>You can then use the Chart view in SwiftUI:.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="import SwiftUI
import Charts
struct ContentView: View {
  var body: some View {
      Chart {
          // Add chart content
      }
     //Add chart modifiers to customize the axis, legends and grids
      .chartXScale(domain: 25...225)
      .chartLegend(.hidden)
        .chartXAxis(.hidden)
        .chartYAxis {
            AxisMarks { _ in
                AxisValueLabel()
            }
        }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">SwiftUI</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Charts</span></span>
<span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">      Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">          </span><span style="color: #7B7F8B">// Add chart content</span></span>
<span class="line"><span style="color: #F6F6F4">      }</span></span>
<span class="line"><span style="color: #F6F6F4">     </span><span style="color: #7B7F8B">//Add chart modifiers to customize the axis, legends and grids</span></span>
<span class="line"><span style="color: #F6F6F4">      .</span><span style="color: #97E1F1">chartXScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">25</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">225</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">      .</span><span style="color: #97E1F1">chartLegend</span><span style="color: #F6F6F4">(.hidden)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXAxis</span><span style="color: #F6F6F4">(.hidden)</span></span>
<span class="line"><span style="color: #F6F6F4">        .chartYAxis {</span></span>
<span class="line"><span style="color: #F6F6F4">            AxisMarks { </span><span style="color: #BF9EEE">_</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">AxisValueLabel</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>The content of the chart can be set by various chart marker types. Here is an example chart with bar marks:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="import SwiftUI
import Charts
struct ContentView: View {
    var body: some View {
        Chart {
            BarMark(x: .value(&quot;Type&quot;, &quot;bird&quot;),
                    y: .value(&quot;Population&quot;, 1))
            .foregroundStyle(.pink)

            BarMark(x: .value(&quot;Type&quot;, &quot;dog&quot;),
                    y: .value(&quot;Population&quot;, 2))
            .foregroundStyle(.green)

            BarMark(x: .value(&quot;Type&quot;, &quot;cat&quot;),
                    y: .value(&quot;Population&quot;, 3))
            .foregroundStyle(.blue)
        }
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">SwiftUI</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Charts</span></span>
<span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(.pink)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(.green)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(.blue)</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_mark_example-copy.jpg" alt="swiftui chart with bar marks"/></figure>
</div>
</div>



<div style="height:15px" aria-hidden="true" class="wp-block-spacer"></div>



<p>For the x and y values you have to specify a&nbsp;PlottableValue instance. This requires a label string value describing the axis name and an actual value. The above example shows values for population of different pet types. If you work with Date type, PlottableValue makes it easy to define date units. In the following example, a bar chart with weekly bars is defined:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="BarMark(
     x: .value(&quot;Week&quot;, $0.day, unit: .weekOfYear),
     y: .value(&quot;Sales&quot;, $0.sales)
)" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span></span>
<span class="line"><span style="color: #F6F6F4">     </span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Week</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.day, </span><span style="color: #97E1F1">unit</span><span style="color: #F6F6F4">: .weekOfYear),</span></span>
<span class="line"><span style="color: #F6F6F4">     </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Sales</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.sales)</span></span>
<span class="line"><span style="color: #F6F6F4">)</span></span></code></pre></div>



<div style="height:22px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Other markers are RuleMark, PointMark, SectionMark, and AreaMark. You will find examples of these further down in this blog post.</p>



<div style="height:56px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">What data can I use with SwiftCharts?</h2>



<p>Swift Charts allow you to work with different types of data, such as numerical values, strings, and dates.&nbsp;You can organize your data into arrays or collections and pass them to the appropriate chart type for rendering.&nbsp;Swift Charts also supports dynamic data, enabling you to update and animate your charts in real-time as the data changes.</p>



<p>In the following, I will walk you through how to handle your data with SwiftCharts from simple static data to more complex dynamic data.</p>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="gb-container gb-container-c5dedc2e">
<div class="gb-container gb-container-f7a433c7">
<div class="gb-container gb-container-7a8dc7a3">

<figure class="gb-block-image gb-block-image-f04fbbad"><a href="https://www.swiftyplace.com/free-swiftui-layout-cookbook" target="_blank" rel="noopener noreferrer"><img fetchpriority="high" decoding="async" width="640" height="500" class="gb-image gb-image-f04fbbad" src="http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview.webp" alt="swiftui roadmap " title="swiftui_roadmap_preview" srcset="http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview.webp 640w, http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview-300x234.webp 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></figure>

</div>

<div class="gb-container gb-container-98352fe6">

<h2 class="gb-headline gb-headline-4aacd94c gb-headline-text">Feeling Lost in SwiftUI?</h2>



<p class="gb-headline gb-headline-5e6c4f85 gb-headline-text">This SwiftUI roadmap shows you what to learn next.</p>



<ul style="margin-top:0;margin-bottom:0;font-size:18px" class="wp-block-list">
<li>Key concepts at a glance</li>



<li>Spot your knowledge gaps</li>



<li>Guide your learning path</li>
</ul>


<div class="gb-container gb-container-34a8ad02">

<a class="gb-button gb-button-63e90e76 gb-button-blue" href="https://school.swiftyplace.com/f/swiftui-roadmap" target="_blank" rel="noopener noreferrer"><span class="gb-button-text">Get the FREE PDF</span><span class="gb-icon"><svg aria-hidden="true" role="img" height="1em" width="1em" viewBox="0 0 256 512" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"></path></svg></span></a>

</div>


<p class="gb-headline gb-headline-7ef80e86 gb-headline-text">Ideal for beginners and self-learners.</p>

</div>
</div>
</div>


<div style="height:56px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">How to create Charts with Static Data</h3>



<p>When working with static data, you can easily create charts in SwiftUI using the Swift Charts framework. You can pass static data to the Chart Marks:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="import SwiftUI
import Charts
struct ContentView: View {
    var body: some View {
            Chart {
                BarMark(x: .value(&quot;Type&quot;, &quot;bird&quot;),
                        y: .value(&quot;Population&quot;, 1))
                .opacity(0.5)

                BarMark(x: .value(&quot;Type&quot;, &quot;dog&quot;),
                        y: .value(&quot;Population&quot;, 2))
                .opacity(0.5)

                BarMark(x: .value(&quot;Type&quot;, &quot;cat&quot;),
                        y: .value(&quot;Population&quot;, 3))
            }
            .aspectRatio(1, contentMode: .fit)
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">SwiftUI</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Charts</span></span>
<span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">            Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:17px" aria-hidden="true" class="wp-block-spacer"></div>



<p>SwiftCharts are build for composition and you use as many different chart types together. For example you can show and hide a rule marker that highlights the average value in a bar chart. In the following example, I created a state property ´averageIsShown´ that the user can change with a toggle. I then use this property with an if statement to show or hide the RuleMarker:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct ContentView: View {
    @State private var averageIsShown = false
    var body: some View {
        VStack {
            Chart {
                BarMark(x: .value(&quot;Type&quot;, &quot;bird&quot;),
                        y: .value(&quot;Population&quot;, 1))
                .opacity(0.5)

                BarMark(x: .value(&quot;Type&quot;, &quot;dog&quot;),
                        y: .value(&quot;Population&quot;, 2))
                .opacity(0.5)

                BarMark(x: .value(&quot;Type&quot;, &quot;cat&quot;),
                        y: .value(&quot;Population&quot;, 3))
            }
            .aspectRatio(1, contentMode: .fit)

            if averageIsShown {
                RuleMark(y: .value(&quot;Average&quot;, 1.5))
                    .foregroundStyle(.gray)
                    .annotation(position: .bottom,
                                alignment: .bottomLeading) {
                        Text(&quot;average 1.5&quot;)
                    }
            }

                .aspectRatio(1, contentMode: .fit)

            Toggle(averageIsShown ? &quot;show average&quot; : &quot;hide average&quot;,
                   isOn: $averageIsShown.animation())
        }
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">@State</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">private</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> averageIsShown </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        VStack {</span></span>
<span class="line"><span style="color: #F6F6F4">            Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> averageIsShown {</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">RuleMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Average</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1.5</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(.gray)</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">annotation</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">position</span><span style="color: #F6F6F4">: .bottom,</span></span>
<span class="line"><span style="color: #F6F6F4">                                </span><span style="color: #97E1F1">alignment</span><span style="color: #F6F6F4">: .bottomLeading) {</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">Text</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">average 1.5</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                    }</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">Toggle</span><span style="color: #F6F6F4">(averageIsShown </span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">show average</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">hide average</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">                   </span><span style="color: #97E1F1">isOn</span><span style="color: #F6F6F4">: $averageIsShown.</span><span style="color: #97E1F1">animation</span><span style="color: #F6F6F4">())</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:17px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="gb-container gb-container-d44090e0">
<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_composition.jpg" alt="swiftui chart with bar marks and a rule mark"/></figure>
</div>
</div>


<div style="height:55px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Working with Dynamic Data and Swift Charts</h3>



<p>Most apps have more complex data and need to effiencently show charts. Let&#8217;s have a look at an example where I want to show the statistics for the population of different pet breeds. I start by defining a data model with 2 properties for the type of pet and the count of this pet:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct ChartData: Identifiable, Equatable {
    let type: String
    let count: Int

    var id: String { return type }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ChartData</span><span style="color: #F6F6F4">: Identifiable, Equatable {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> type: </span><span style="color: #97E1F1; font-style: italic">String</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> count: </span><span style="color: #97E1F1; font-style: italic">Int</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> id: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4"> { </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> type }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>I can generate a data array in my SwiftUI view and also calculate the most popular pet type ´maxChartData´:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct DynamicChartView: View {

    let data = [ChartData(type: &quot;bird&quot;, count: 1),
                ChartData(type: &quot;dog&quot;, count: 2),
                ChartData(type: &quot;cat&quot;, count: 3)]

    var maxChartData: ChartData? {
        data.max { $0.count &lt; $1.count }
    }
    var body: some View {
        Chart {
            ...
        }
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">DynamicChartView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> data </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">)]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> maxChartData: ChartData</span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">        data.</span><span style="color: #97E1F1">max</span><span style="color: #F6F6F4"> { </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$1</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4"> }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #F286C4">...</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Dynamic data arrays can be shown like in any other SwiftUI container view (e.g. List, Stacks, and Tables) &nbsp;with an ForEach. I made the data model conform to ´Identifiable´ for convenience. This allows me to iterate over the array of pet statistics data and show a bar for each data point:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="Chart {
    ForEach(data) { dataPoint in
        BarMark(x: .value(&quot;Type&quot;, dataPoint.type),
                y: .value(&quot;Population&quot;, dataPoint.count))
        .opacity(maxChartData == dataPoint ? 1 : 0.5)
        .foregroundStyle(maxChartData == dataPoint ? Color.accentColor : Color.gray)
    }

    RuleMark(y: .value(&quot;Average&quot;, 1.5))
        .foregroundStyle(.gray)
        .annotation(position: .bottom,
                    alignment: .bottomLeading) {
            Text(&quot;average 1.5&quot;)
        }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(data) { dataPoint </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.type),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(maxChartData </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> dataPoint </span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(maxChartData </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> dataPoint </span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> Color.accentColor </span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> Color.gray)</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">RuleMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Average</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1.5</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(.gray)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">annotation</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">position</span><span style="color: #F6F6F4">: .bottom,</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">alignment</span><span style="color: #F6F6F4">: .bottomLeading) {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">Text</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">average 1.5</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>This results in the same chart as above where I used static data.</p>



<div style="height:59px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Working with Multiple Data Series´ in SwiftUI</h3>



<p>When working with data visualization, it’s common to have multiple data series that you want to display in a chart. Swift Charts provides a convenient way to handle and present these multiple data series effectively. In this section, I will guide you through the process of working with multiple data series in Swift Charts.</p>



<p>As a first step, you need to organize your data into separate data series. Each data series represents a distinct set of data that you want to display in the chart.For example, if you are comparing the population for different pet types in Germany&nbsp;over a period of time, you would have a separate data series for each pet type:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="let catData: [PetData] = [PetData(year: 2000, population: 6.8),
                          PetData(year: 2010, population: 8.2),
                          PetData(year: 2015, population: 12.9),
                          PetData(year: 2022, population: 15.2)]
let dogData: [PetData] = [PetData(year: 2000, population: 5),
                          PetData(year: 2010, population: 5.3),
                          PetData(year: 2015, population: 7.9),
                          PetData(year: 2022, population: 10.6)]" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData: [PetData] </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2000</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">6.8</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2010</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">8.2</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2015</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">12.9</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2022</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">15.2</span><span style="color: #F6F6F4">)]</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> dogData: [PetData] </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2000</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2010</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">5.3</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2015</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">7.9</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">PetData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">year</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2022</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">population</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">10.6</span><span style="color: #F6F6F4">)]</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Use the ForEach view to iterate over your data series array and create a separate line for each data series:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="Chart {
    ForEach(catData) { data in
        BarMark(x: .value(&quot;Year&quot;, data.year),
                y: .value(&quot;Population&quot;, data.population))
    }

    ForEach(dogData) { data in
        BarMark(x: .value(&quot;Year&quot;, data.year),
                y: .value(&quot;Population&quot;, data.population))
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(catData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(dogData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>If you have many data series to compare, it can be more convenient to collect all individual series into one array. For example, you can use an array of Tuple</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="var data: [(type: String, petData: [PetData])] {
        [(type: &quot;cat&quot;, petData: catData),
         (type: &quot;dog&quot;, petData: dogData)]
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> data: [(type: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">, petData: [PetData])] {</span></span>
<span class="line"><span style="color: #F6F6F4">        [(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: catData),</span></span>
<span class="line"><span style="color: #F6F6F4">         (</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: dogData)]</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Or generate a data wrapper that you use for the collection:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct PetDataSeries: Identifiable {
    let type: String
    let petData: [PetData]
    var id: String { type }
}

let catData = PetData.catExample
let dogData = PetData.dogExamples

var data: [PetDataSeries] {
    [PetDataSeries(type: &quot;cat&quot;, petData: catData),
     PetDataSeries(type: &quot;dog&quot;, petData: dogData)]
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">PetDataSeries</span><span style="color: #F6F6F4">: Identifiable {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> type: </span><span style="color: #97E1F1; font-style: italic">String</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> petData: [PetData]</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> id: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4"> { type }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.catExample</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> dogData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.dogExamples</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> data: [PetDataSeries] {</span></span>
<span class="line"><span style="color: #F6F6F4">    [</span><span style="color: #97E1F1">PetDataSeries</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: catData),</span></span>
<span class="line"><span style="color: #F6F6F4">     </span><span style="color: #97E1F1">PetDataSeries</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: dogData)]</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Both cases work well with SwiftChart and you can now create 2 ForEach: one for iterating over all series and one ForEach to iterate over the data points:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct ContentView: View {
    let catData = PetData.catExample
    let dogData = PetData.dogExamples

    var data: [(type: String, petData: [PetData])] {
        [(type: &quot;cat&quot;, petData: catData),
         (type: &quot;dog&quot;, petData: dogData)]
    }

    var body: some View {
        Chart(data, id: \.type) { dataSeries in
            ForEach(dataSeries.petData) { data in
                LineMark(x: .value(&quot;Year&quot;, data.year),
                         y: .value(&quot;Population&quot;, data.population))
            }
            .foregroundStyle(by: .value(&quot;Pet type&quot;, dataSeries.type))
            .symbol(by: .value(&quot;Pet type&quot;, dataSeries.type))
        }
        .chartXScale(domain: 1998...2024)
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.catExample</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> dogData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.dogExamples</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> data: [(type: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">, petData: [PetData])] {</span></span>
<span class="line"><span style="color: #F6F6F4">        [(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: catData),</span></span>
<span class="line"><span style="color: #F6F6F4">         (</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: dogData)]</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">Chart</span><span style="color: #F6F6F4">(data, </span><span style="color: #97E1F1">id</span><span style="color: #F6F6F4">: \.type) { dataSeries </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(dataSeries.petData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">LineMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                         </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">symbol</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1998</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">2024</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_linemark_example.jpg" alt="swiftui chart with line marker and symbol"/></figure>
</div>
</div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Make sure that each data series is identifiable by assigning a unique identifier to it. This will allow Swift Charts to differentiate between the different data series.</p>



<p>I also had to tell charts to treat this as two different series by adding the style chart modifier:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code=".foregroundStyle(by: .value(&quot;Pet type&quot;, dataSeries.type))" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span></code></pre></div>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>



<p>This tells charts to create 2 series of data lines which are distinguished by the data series type property. Otherwise one continues line would be shown.</p>



<div style="height:21px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="gb-container gb-container-c5dedc2e">
<div class="gb-container gb-container-f7a433c7">
<div class="gb-container gb-container-7a8dc7a3">

<figure class="gb-block-image gb-block-image-f04fbbad"><a href="https://www.swiftyplace.com/free-swiftui-layout-cookbook" target="_blank" rel="noopener noreferrer"><img fetchpriority="high" decoding="async" width="640" height="500" class="gb-image gb-image-f04fbbad" src="http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview.webp" alt="swiftui roadmap " title="swiftui_roadmap_preview" srcset="http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview.webp 640w, http://www.swiftyplace.com/wp-content/uploads/2024/01/swiftui_roadmap_preview-300x234.webp 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></figure>

</div>

<div class="gb-container gb-container-98352fe6">

<h2 class="gb-headline gb-headline-4aacd94c gb-headline-text">Feeling Lost in SwiftUI?</h2>



<p class="gb-headline gb-headline-5e6c4f85 gb-headline-text">This SwiftUI roadmap shows you what to learn next.</p>



<ul style="margin-top:0;margin-bottom:0;font-size:18px" class="wp-block-list">
<li>Key concepts at a glance</li>



<li>Spot your knowledge gaps</li>



<li>Guide your learning path</li>
</ul>


<div class="gb-container gb-container-34a8ad02">

<a class="gb-button gb-button-63e90e76 gb-button-blue" href="https://school.swiftyplace.com/f/swiftui-roadmap" target="_blank" rel="noopener noreferrer"><span class="gb-button-text">Get the FREE PDF</span><span class="gb-icon"><svg aria-hidden="true" role="img" height="1em" width="1em" viewBox="0 0 256 512" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"></path></svg></span></a>

</div>


<p class="gb-headline gb-headline-7ef80e86 gb-headline-text">Ideal for beginners and self-learners.</p>

</div>
</div>
</div>


<div style="height:49px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Examples of Different Chart Types</h2>



<p>Swift Charts offers several types of charts, including bar charts, line charts, point charts, area charts, ruler charts, rectangle charts, and pie charts.</p>



<p>Each chart type has its own unique characteristics and use cases, allowing you to choose the most suitable one for your data visualization needs.</p>



<div style="height:49px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">How to create a Bar Chart in SwiftUI</h3>



<p>Bar charts are ideal for comparing different categories or data sets.&nbsp;With Swift Charts, you can easily create bar charts and customize their appearance to suit your app’s design. Simply use the ´BarMark´ in your chart. In the following example, I used the pet population number in the x-axis and the pet type in the y-axis. This generates a chart with vertical stacked bars:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct BarChartExampleView: View {
    let data = [ChartData(type: &quot;fish&quot;, count: 10),
                ChartData(type: &quot;reptils&quot;, count: 21),
                ChartData(type: &quot;bird&quot;, count: 18),
                ChartData(type: &quot;dog&quot;, count: 40),
                ChartData(type: &quot;cat&quot;, count: 65)]
    var body: some View {
        Chart(data) { dataPoint in
            BarMark(x: .value(&quot;Population&quot;, dataPoint.count),
                    y: .value(&quot;Type&quot;, dataPoint.type))
            .foregroundStyle(by: .value(&quot;Type&quot;, dataPoint.type))
            .annotation(position: .trailing) {
                Text(String(dataPoint.count))
                    .foregroundColor(.gray)
            }
        }
        .chartLegend(.hidden)
        .chartXAxis(.hidden)
        .chartYAxis {
            AxisMarks { _ in
                AxisValueLabel()
            }
        }
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">BarChartExampleView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> data </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">fish</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">reptils</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">21</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">18</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">40</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">65</span><span style="color: #F6F6F4">)]</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">Chart</span><span style="color: #F6F6F4">(data) { dataPoint </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.type))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.type))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">annotation</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">position</span><span style="color: #F6F6F4">: .trailing) {</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">Text</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">(dataPoint.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                    .</span><span style="color: #97E1F1">foregroundColor</span><span style="color: #F6F6F4">(.gray)</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartLegend</span><span style="color: #F6F6F4">(.hidden)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXAxis</span><span style="color: #F6F6F4">(.hidden)</span></span>
<span class="line"><span style="color: #F6F6F4">        .chartYAxis {</span></span>
<span class="line"><span style="color: #F6F6F4">            AxisMarks { </span><span style="color: #BF9EEE">_</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">AxisValueLabel</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_barmark_example.jpg" alt="swiftui chart with bar marks vertically stacked for dense data"/></figure>
</div>
</div>



<div style="height:23px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Note that I customised the bar appearance with</p>



<ul class="wp-block-list">
<li>removing the legend with <strong>.</strong><strong>chartLegend</strong><strong>(.</strong><strong>hidden</strong><strong>)</strong>&nbsp;</li>



<li>removed the x-axis and grid with <strong>.</strong><strong>chartXAxis</strong><strong>(.</strong><strong>hidden</strong><strong>)</strong>&nbsp;</li>



<li>only showed the y-axis labels with <strong>.</strong><strong>chartYAxis</strong><strong> {</strong> &#8230; }</li>
</ul>



<div style="height:62px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Line, Point and Area Charts in SwiftUI</h3>



<p>Line, point and area&nbsp;charts are perfect for visualizing trends and changes over time.&nbsp;Swift Charts allows you to create dynamic line charts that can be updated with real-time data.&nbsp; Simply use the ´LineMark´ in your chart. In the following example, shows the population of cat and dogs in Germany in the years from 2000 to 2022:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct LineChartExampleView: View {
    let catData = PetData.catExample
    let dogData = PetData.dogExamples

    var data: [(type: String, petData: [PetData])] {
        [(type: &quot;cat&quot;, petData: catData),
         (type: &quot;dog&quot;, petData: dogData)]
    }

    var body: some View {
        Chart(data, id: \.type) { dataSeries in
            ForEach(dataSeries.petData) { data in
                LineMark(x: .value(&quot;Year&quot;, data.year),
                         y: .value(&quot;Population&quot;, data.population))
            }
            .foregroundStyle(by: .value(&quot;Pet type&quot;, dataSeries.type))
            .symbol(by: .value(&quot;Pet type&quot;, dataSeries.type))
        }
        .chartXScale(domain: 1998...2024)
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">LineChartExampleView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.catExample</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> dogData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.dogExamples</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> data: [(type: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">, petData: [PetData])] {</span></span>
<span class="line"><span style="color: #F6F6F4">        [(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: catData),</span></span>
<span class="line"><span style="color: #F6F6F4">         (</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">petData</span><span style="color: #F6F6F4">: dogData)]</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">Chart</span><span style="color: #F6F6F4">(data, </span><span style="color: #97E1F1">id</span><span style="color: #F6F6F4">: \.type) { dataSeries </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(dataSeries.petData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">LineMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                         </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">symbol</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1998</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">2024</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_linemark_example.jpg" alt="swiftui chart with line marker and symbol"/></figure>
</div>
</div>



<div style="height:22px" aria-hidden="true" class="wp-block-spacer"></div>



<p>I am also showing symbols markers for each data point by using the chart modifier:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code=".symbol(by: .value(&quot;Pet type&quot;, dataSeries.type))" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">symbol</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataSeries.type))</span></span></code></pre></div>



<div style="height:22px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Which creates different symbol markers depending on the datas eries type property.</p>



<p>Similar to line marks, you can also show scatter plots with ´PointMark´ and area plots with ´AreaMark´:</p>



<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_linemark_pointmark_areamark_example.jpg" alt="SwiftCharts examples for point, line and area charts."/><figcaption class="wp-element-caption">Examples of charts with the same data but different marker types: left &#8211; PointMark, center &#8211; LineMarker, and right &#8211; AreaMarker</figcaption></figure>



<div style="height:51px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">How to make a line chart with a gradient background</h3>



<p>You can use AreaMark to add an additional gradient background. First, define a gradient. The following example defines a linear gradient with the accent color and gets&nbsp;more opaque:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="let linearGradient = LinearGradient(gradient: Gradient(colors: [Color.accentColor.opacity(0.4), Color.accentColor.opacity(0)]),
                                    startPoint: .top,
                                    endPoint: .bottom)" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> linearGradient </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">LinearGradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">gradient</span><span style="color: #F6F6F4">: </span><span style="color: #97E1F1">Gradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">colors</span><span style="color: #F6F6F4">: [Color.accentColor.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.4</span><span style="color: #F6F6F4">), Color.accentColor.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0</span><span style="color: #F6F6F4">)]),</span></span>
<span class="line"><span style="color: #F6F6F4">                                    </span><span style="color: #97E1F1">startPoint</span><span style="color: #F6F6F4">: .top,</span></span>
<span class="line"><span style="color: #F6F6F4">                                    </span><span style="color: #97E1F1">endPoint</span><span style="color: #F6F6F4">: .bottom)</span></span></code></pre></div>



<div style="height:23px" aria-hidden="true" class="wp-block-spacer"></div>



<p>You can then use this gradient for the foreground style of the chart like so:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="ForEach(catData) { data in
          AreaMark(x: .value(&quot;Year&quot;, data.year),
                   y: .value(&quot;Population&quot;, data.population))
 }
.foregroundStyle(linearGradient)" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(catData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">          </span><span style="color: #97E1F1">AreaMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                   </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4"> }</span></span>
<span class="line"><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(linearGradient)</span></span></code></pre></div>



<div style="height:23px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Combining a line and area chart gives you a great-looking chart with a gradient highlight:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct GradientAreaChartExampleView: View {
    let catData = PetData.catExample
    let linearGradient = LinearGradient(gradient: Gradient(colors: [Color.accentColor.opacity(0.4),
                                                                    Color.accentColor.opacity(0)]),
                                        startPoint: .top,
                                        endPoint: .bottom)
    var body: some View {
        Chart {
            ForEach(catData) { data in
                LineMark(x: .value(&quot;Year&quot;, data.year),
                         y: .value(&quot;Population&quot;, data.population))
            }
            .interpolationMethod(.cardinal)
            .symbol(by: .value(&quot;Pet type&quot;, &quot;cat&quot;))

            ForEach(catData) { data in
                AreaMark(x: .value(&quot;Year&quot;, data.year),
                         y: .value(&quot;Population&quot;, data.population))
            }
            .interpolationMethod(.cardinal)
            .foregroundStyle(linearGradient)
        }
        .chartXScale(domain: 1998...2024)
        .chartLegend(.hidden)
        .chartXAxis {
            AxisMarks(values: [2000, 2010, 2015, 2022]) { value in
                AxisGridLine()
                AxisTick()
                if let year = value.as(Int.self) {
                    AxisValueLabel(formatte(number: year),
                                   centered: false,
                                   anchor: .top)
                }
            }
        }
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">GradientAreaChartExampleView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.catExample</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> linearGradient </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">LinearGradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">gradient</span><span style="color: #F6F6F4">: </span><span style="color: #97E1F1">Gradient</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">colors</span><span style="color: #F6F6F4">: [Color.accentColor.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.4</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                                                                    Color.accentColor.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0</span><span style="color: #F6F6F4">)]),</span></span>
<span class="line"><span style="color: #F6F6F4">                                        </span><span style="color: #97E1F1">startPoint</span><span style="color: #F6F6F4">: .top,</span></span>
<span class="line"><span style="color: #F6F6F4">                                        </span><span style="color: #97E1F1">endPoint</span><span style="color: #F6F6F4">: .bottom)</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(catData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">LineMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                         </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">interpolationMethod</span><span style="color: #F6F6F4">(.cardinal)</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">symbol</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Pet type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(catData) { data </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">AreaMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Year</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.year),</span></span>
<span class="line"><span style="color: #F6F6F4">                         </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, data.population))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">interpolationMethod</span><span style="color: #F6F6F4">(.cardinal)</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(linearGradient)</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1998</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">2024</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartLegend</span><span style="color: #F6F6F4">(.hidden)</span></span>
<span class="line"><span style="color: #F6F6F4">        .chartXAxis {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">AxisMarks</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">values</span><span style="color: #F6F6F4">: [</span><span style="color: #BF9EEE">2000</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2010</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2015</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">2022</span><span style="color: #F6F6F4">]) { value </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">AxisGridLine</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">AxisTick</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> year </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> value.</span><span style="color: #F286C4">as</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">Int</span><span style="color: #F6F6F4">.</span><span style="color: #F286C4">self</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">AxisValueLabel</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">formatte</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">number</span><span style="color: #F6F6F4">: year),</span></span>
<span class="line"><span style="color: #F6F6F4">                                   </span><span style="color: #97E1F1">centered</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">                                   </span><span style="color: #97E1F1">anchor</span><span style="color: #F6F6F4">: .top)</span></span>
<span class="line"><span style="color: #F6F6F4">                }</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_gradient_line_example.jpg" alt="SwiftCharts example with line and area mark to show gradient highlight"/></figure>
</div>
</div>



<div style="height:23px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">How to add RuleMark to Charts in SwiftUI</h3>



<p>If you want to create a horizontal indicator, you can use ´RuleMark´. This is useful to show a threshold or average value in your chart. For example, I could show the average population:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);--cbp-line-highlight-color:rgba(251, 251, 239, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct ContentView: View {
    let data = [ChartData(type: &quot;bird&quot;, count: 1),
                ChartData(type: &quot;dog&quot;, count: 2),
                ChartData(type: &quot;cat&quot;, count: 3)]

    var maxChartData: ChartData? {
        data.max { $0.count &lt; $1.count }
    }

    var body: some View {
        Chart {
            ForEach(data) { dataPoint in

                BarMark(x: .value(&quot;Type&quot;, dataPoint.type),
                        y: .value(&quot;Population&quot;, dataPoint.count))
                .foregroundStyle(Color.gray.opacity(0.5))
            }

            RuleMark(y: .value(&quot;Average&quot;, 1.5))
                .annotation(position: .bottom,
                            alignment: .bottomLeading) {
                    Text(&quot;average 1.5&quot;)
                        .foregroundColor(.accentColor)
                }
        }
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ContentView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> data </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bird</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">2</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">ChartData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">count</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">3</span><span style="color: #F6F6F4">)]</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> maxChartData: ChartData</span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">        data.</span><span style="color: #97E1F1">max</span><span style="color: #F6F6F4"> { </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$1</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4"> }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        Chart {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">ForEach</span><span style="color: #F6F6F4">(data) { dataPoint </span><span style="color: #F286C4">in</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">                </span><span style="color: #97E1F1">BarMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">x</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.type),</span></span>
<span class="line"><span style="color: #F6F6F4">                        </span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Population</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataPoint.</span><span style="color: #BF9EEE">count</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(Color.gray.</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">RuleMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">y</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Average</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">1.5</span><span style="color: #F6F6F4">))</span></span>
<span class="line cbp-line-highlight"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">annotation</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">position</span><span style="color: #F6F6F4">: .bottom,</span></span>
<span class="line"><span style="color: #F6F6F4">                            </span><span style="color: #97E1F1">alignment</span><span style="color: #F6F6F4">: .bottomLeading) {</span></span>
<span class="line"><span style="color: #F6F6F4">                    </span><span style="color: #97E1F1">Text</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">average 1.5</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                        .</span><span style="color: #97E1F1">foregroundColor</span><span style="color: #F6F6F4">(.accentColor)</span></span>
<span class="line"><span style="color: #F6F6F4">                }</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_rulemark_example.jpg" alt=""/></figure>
</div>
</div>



<div style="height:57px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Creating Charts with RectangleMark</h3>



<p>´RectangleMark´ can be used to mark certain areas in you charts. In the following example, I am generating a heat map with ´RectangleMark´:</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct HeatMapExampleView: View {
    let heatData: [HeatData] = HeatData.exampleData

    var body: some View {
        Chart(heatData) {
            RectangleMark(xStart: .value(&quot;start location x&quot;, $0.locationX - 25),
                          xEnd: .value(&quot;end location x&quot;, $0.locationX + 25),
                          yStart: .value(&quot;start location y&quot;, $0.locationY - 25),
                          yEnd: .value(&quot;end location y&quot;, $0.locationY + 25))
            .foregroundStyle(by: .value(&quot;Number&quot;, $0.temperatur))
        }
        .chartXScale(domain: 25...225)
        .chartYScale(domain: 25...225)
        .aspectRatio(1, contentMode: .fit)
        .padding()
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">HeatMapExampleView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> heatData: [HeatData] </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> HeatData.exampleData</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">Chart</span><span style="color: #F6F6F4">(heatData) {</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">RectangleMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">xStart</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">start location x</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.locationX </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">25</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">xEnd</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">end location x</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.locationX </span><span style="color: #F286C4">+</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">25</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">yStart</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">start location y</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.locationY </span><span style="color: #F286C4">-</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">25</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                          </span><span style="color: #97E1F1">yEnd</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">end location y</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.locationY </span><span style="color: #F286C4">+</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">25</span><span style="color: #F6F6F4">))</span></span>
<span class="line"><span style="color: #F6F6F4">            .</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Number</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.temperatur))</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartXScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">25</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">225</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">chartYScale</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">domain</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">25</span><span style="color: #F286C4">...</span><span style="color: #BF9EEE">225</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">aspectRatio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">contentMode</span><span style="color: #F6F6F4">: .fit)</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">padding</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_rectanglemark_heatmap_example.jpg" alt="SwiftCharts example showing a heat map with rectangle markers"/></figure>
</div>
</div>



<div style="height:31px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct HeatData: Identifiable {
    let locationX: Int
    let locationY: Int
    let temperatur: Double
    let id = UUID()

    static var exampleData: [HeatData] {
        [HeatData(locationX: 50, locationY: 50, temperatur: 23.0),
         HeatData(locationX: 50, locationY: 100, temperatur: 15.0),
         HeatData(locationX: 50, locationY: 150, temperatur: 25.0),
         HeatData(locationX: 50, locationY: 200, temperatur: 22.5),

         HeatData(locationX: 100, locationY: 50, temperatur: 20.0),
         HeatData(locationX: 100, locationY: 100, temperatur: 26.5),
         HeatData(locationX: 100, locationY: 150, temperatur: 29.4),
         HeatData(locationX: 100, locationY: 200, temperatur: 17.0),

         HeatData(locationX: 150, locationY: 50, temperatur: 24.0),
         HeatData(locationX: 150, locationY: 100, temperatur: 23.5),
         HeatData(locationX: 150, locationY: 150, temperatur: 21.5),
         HeatData(locationX: 150, locationY: 200, temperatur: 15.0),

         HeatData(locationX: 200, locationY: 50, temperatur: 10.0),
         HeatData(locationX: 200, locationY: 100, temperatur: 26.5),
         HeatData(locationX: 200, locationY: 150, temperatur: 27.0),
         HeatData(locationX: 200, locationY: 200, temperatur: 17.0)
        ]
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">HeatData</span><span style="color: #F6F6F4">: Identifiable {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> locationX: </span><span style="color: #97E1F1; font-style: italic">Int</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> locationY: </span><span style="color: #97E1F1; font-style: italic">Int</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> temperatur: </span><span style="color: #97E1F1; font-style: italic">Double</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> id </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UUID</span><span style="color: #F6F6F4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">static</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> exampleData: [HeatData] {</span></span>
<span class="line"><span style="color: #F6F6F4">        [</span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">23.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">15.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">25.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">22.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">20.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">26.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">29.4</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">17.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">24.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">23.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">21.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">15.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">50</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">10.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">100</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">26.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">150</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">27.0</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">         </span><span style="color: #97E1F1">HeatData</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">locationX</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">locationY</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">temperatur</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">17.0</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        ]</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<div style="height:79px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Donut and Pie Charts for iOS 17 and macOS 14</h3>



<p>Donut and Pie charts are effective for displaying proportions and percentages.&nbsp;New with iOS 17 and macOS 14, charts now can also generate pie and donut charts. In the following donut chart, I am comparing the cat and dog population in Germany over the last 20 years:&nbsp;&nbsp;</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="struct PieChartExampleView: View {
    let catData = PetData.catExample
    let dogData = PetData.dogExamples
    var catTotal: Double {
        catData.reduce(0) { $0 + $1.population }
    }

    var dogTotal: Double {
        dogData.reduce(0) { $0 + $1.population }
    }

    var data: [(type: String, amount: Double)] {
        [(type: &quot;cat&quot;, amount: catTotal),
         (type: &quot;dog&quot;, amount: dogTotal)
        ]
    }

    var maxPet: String? {
        data.max { $0.amount &lt; $1.amount }?.type
    }

    var body: some View {
        Chart(data, id: \.type) { dataItem in
            SectorMark(angle: .value(&quot;Type&quot;, dataItem.amount),
                       innerRadius: .ratio(0.5),
                       angularInset: 1.5)
                .cornerRadius(5)
                .opacity(dataItem.type == maxPet ? 1 : 0.5)
        }
        .frame(height: 200)
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">struct</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">PieChartExampleView</span><span style="color: #F6F6F4">: View {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> catData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.catExample</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> dogData </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> PetData.dogExamples</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> catTotal: </span><span style="color: #97E1F1; font-style: italic">Double</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">        catData.</span><span style="color: #97E1F1">reduce</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0</span><span style="color: #F6F6F4">) { </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$1</span><span style="color: #F6F6F4">.population }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> dogTotal: </span><span style="color: #97E1F1; font-style: italic">Double</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">        dogData.</span><span style="color: #97E1F1">reduce</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0</span><span style="color: #F6F6F4">) { </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$1</span><span style="color: #F6F6F4">.population }</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> data: [(type: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F6F6F4">, amount: </span><span style="color: #97E1F1; font-style: italic">Double</span><span style="color: #F6F6F4">)] {</span></span>
<span class="line"><span style="color: #F6F6F4">        [(</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cat</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">amount</span><span style="color: #F6F6F4">: catTotal),</span></span>
<span class="line"><span style="color: #F6F6F4">         (</span><span style="color: #97E1F1">type</span><span style="color: #F6F6F4">: </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">dog</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, </span><span style="color: #97E1F1">amount</span><span style="color: #F6F6F4">: dogTotal)</span></span>
<span class="line"><span style="color: #F6F6F4">        ]</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> maxPet: </span><span style="color: #97E1F1; font-style: italic">String</span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">        data.</span><span style="color: #97E1F1">max</span><span style="color: #F6F6F4"> { </span><span style="color: #BF9EEE; font-style: italic">$0</span><span style="color: #F6F6F4">.amount </span><span style="color: #F286C4">&lt;</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$1</span><span style="color: #F6F6F4">.amount }</span><span style="color: #F286C4">?</span><span style="color: #F6F6F4">.type</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">var</span><span style="color: #F6F6F4"> body: </span><span style="color: #F286C4">some</span><span style="color: #F6F6F4"> View {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #97E1F1">Chart</span><span style="color: #F6F6F4">(data, </span><span style="color: #97E1F1">id</span><span style="color: #F6F6F4">: \.type) { dataItem </span><span style="color: #F286C4">in</span></span>
<span class="line"><span style="color: #F6F6F4">            </span><span style="color: #97E1F1">SectorMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">angle</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataItem.amount),</span></span>
<span class="line"><span style="color: #F6F6F4">                       </span><span style="color: #97E1F1">innerRadius</span><span style="color: #F6F6F4">: .</span><span style="color: #97E1F1">ratio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">),</span></span>
<span class="line"><span style="color: #F6F6F4">                       </span><span style="color: #97E1F1">angularInset</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">1.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">cornerRadius</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">                .</span><span style="color: #97E1F1">opacity</span><span style="color: #F6F6F4">(dataItem.type </span><span style="color: #F286C4">==</span><span style="color: #F6F6F4"> maxPet </span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">        }</span></span>
<span class="line"><span style="color: #F6F6F4">        .</span><span style="color: #97E1F1">frame</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">height</span><span style="color: #F6F6F4">: </span><span style="color: #BF9EEE">200</span><span style="color: #F6F6F4">)</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure class="wp-block-image"><img decoding="async" src="https://www.swiftyplace.com/wp-content/uploads/2023/08/chart_sectionlemark_piechart_example-736x1024.jpg" alt="SwiftCharts example with pie and donut chart"/></figure>
</div>
</div>



<div style="height:31px" aria-hidden="true" class="wp-block-spacer"></div>



<p>To generate pie charts use the ´SectorMark´ like so:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="SectorMark(angle: .value(&quot;Type&quot;, dataItem.amount))" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #97E1F1">SectorMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">angle</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataItem.amount))</span></span></code></pre></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>To change to a pie chart, use the innerRadius property. For example, set the donut width to 50% with the ratio:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="SectorMark(angle: .value(&quot;Type&quot;, dataItem.amount),
                       innerRadius: .ratio(0.5))" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #97E1F1">SectorMark</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">angle</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataItem.amount),</span></span>
<span class="line"><span style="color: #F6F6F4">                       </span><span style="color: #97E1F1">innerRadius</span><span style="color: #F6F6F4">: .</span><span style="color: #97E1F1">ratio</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">0.5</span><span style="color: #F6F6F4">))</span></span></code></pre></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p>If you want to use different colors for the sections use:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono-NL.ttf" style="font-size:1rem;font-family:Code-Pro-JetBrains-Mono-NL,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code=".foregroundStyle(by: .value(&quot;Type&quot;, dataItem.type))" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">.</span><span style="color: #97E1F1">foregroundStyle</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1">by</span><span style="color: #F6F6F4">: .</span><span style="color: #BF9EEE">value</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Type</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">, dataItem.type))</span></span></code></pre></div>



<div style="height:55px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">Conclusion</h2>



<p>In conclusion, mastering Swift Charts is a valuable skill for any iOS developer looking to create visually appealing and informative data visualizations in their apps. With the Swift Charts framework, you have access to a wide range of chart types and customization options, allowing you to present data in a way that is both visually engaging and easily understandable for users. By following the step-by-step guides and exploring the examples provided, you can confidently implement bar charts, line charts, pie charts, and more, while also incorporating advanced techniques such as animation and accessibility. So, dive into the world of Swift Charts and unlock the potential to create stunning data visualizations that enhance the user experience in your iOS and macOS&nbsp;apps.</p>
<p>The post <a rel="nofollow" href="http://www.swiftyplace.com/blog/swiftcharts-create-charts-and-graphs-in-swiftui">Introduction to SwiftCharts: Creating Charts and Graphs in SwiftUI</a> appeared first on <a rel="nofollow" href="http://www.swiftyplace.com">swiftyplace</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.swiftyplace.com/blog/swiftcharts-create-charts-and-graphs-in-swiftui/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: www.swiftyplace.com @ 2026-04-13 02:56:47 by W3 Total Cache
-->