<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: James Swinton-Bland</title>
    <description>The latest articles on DEV Community by James Swinton-Bland (@jamesswinton).</description>
    <link>https://dev.to/jamesswinton</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1153172%2F93e26af9-8f90-4d42-8a6d-e0e4f5b27d53.jpeg</url>
      <title>DEV Community: James Swinton-Bland</title>
      <link>https://dev.to/jamesswinton</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jamesswinton"/>
    <language>en</language>
    <item>
      <title>Optimising Large Data Set Visualisations with the M4 Algorithm</title>
      <dc:creator>James Swinton-Bland</dc:creator>
      <pubDate>Tue, 14 Jan 2025 15:28:31 +0000</pubDate>
      <link>https://dev.to/ag-grid/optimising-large-data-set-visualisations-with-the-m4-algorithm-1dj2</link>
      <guid>https://dev.to/ag-grid/optimising-large-data-set-visualisations-with-the-m4-algorithm-1dj2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fve8vlte32oqf5lyp59x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fve8vlte32oqf5lyp59x1.png" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Version 11 of AG Charts, our &lt;a href="https://www.ag-grid.com/charts/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript Charting Library&lt;/a&gt;, includes significant performance enhancements to our Line Series. These improvements allow you to render over a million data points that can be zoomed, panned, and interacted with at over 60 fps, making these transitions appear seamless to users.&lt;/p&gt;

&lt;p&gt;To achieve this level of performance, we implemented the M4 algorithm: an aggregation-based time series dimensionality reduction technique that provides error-free visualizations at high data reduction rates. This blog post details our implementation of this algorithm and the performance improvements we've gained from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges in Rendering Large Datasets
&lt;/h2&gt;

&lt;p&gt;AG Charts leverages the HTML5 Canvas API for its drawing operations. We've discussed some of the techniques we apply to &lt;a href="https://blog.ag-grid.com/optimising-html5-canvas-rendering-best-practices-and-techniques/" rel="noopener noreferrer"&gt;optimize HTML5 Canvas rendering&lt;/a&gt; in a previous blog post, however, no matter what optimisations are applied, rendering a million data points in a chart is computationally intensive.&lt;/p&gt;

&lt;p&gt;If you're not already familiar with the Canvas API, drawing lines is akin to instructing a virtual pen: you issue one command to place the pen nib at specific coordinates on the screen, and another command to move the nib to a different set of coordinates, which then draws a line between the two points. This means that as the size of our data grows, so does the number of drawing operations required, which means more work for us to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing the M4 Algorithm
&lt;/h2&gt;

&lt;p&gt;Given the way the Canvas API works, the only way to reduce the work needed to draw a chart is to physically draw less, which is where the M4 algorithm comes in. According to the &lt;a href="https://www.vldb.org/pvldb/vol7/p797-jugel.pdf?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;original paper&lt;/a&gt;, the M4 algorithm &lt;em&gt;"exploits the semantics of line rasterization to drive the data reduction of high-volume time series data."&lt;/em&gt; In other words, this approach allows us to reduce the number of drawing operations required to render a line chart, whilst retaining its original characteristics.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the M4 Algorithm Works
&lt;/h3&gt;

&lt;p&gt;This algorithm might sound complicated, but it's actually quite simple. Consider the following line chart, which contains 100 data points:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyaal0ajobuf3dh51fcqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyaal0ajobuf3dh51fcqi.png" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To apply the M4 algorithm, start by determining the range of your x-values. For instance, if your x-data ranges from 100 to 200, you might divide this range into 10 equal buckets: 100–110, 110–120, and so on. In this case, we've divided our example into 5 buckets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9pypv9fb8hdj7wik0y0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9pypv9fb8hdj7wik0y0.png" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, for each bucket, identify the data points that meet the following criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum x-value&lt;/li&gt;
&lt;li&gt;Maximum x-value&lt;/li&gt;
&lt;li&gt;Minimum y-value&lt;/li&gt;
&lt;li&gt;Maximum y-value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because a data point may fit more than one criterion, each bucket will have up to four points. These have been highlighted in each bucket below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXeq2zsyaCEIq5KvGSOadW23aleUnxZnsT9LR_ionWsG_qwoTtY0_vZN0jmBjPnf8H6CiS19g1XJx8FPoBYeTIs5hYeMLXwDplgFQvXuveC1bnt68Ff_R9TICi-duBLbPOJsUFeWtOGGx_5RYhnk24IVkZnn%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXeq2zsyaCEIq5KvGSOadW23aleUnxZnsT9LR_ionWsG_qwoTtY0_vZN0jmBjPnf8H6CiS19g1XJx8FPoBYeTIs5hYeMLXwDplgFQvXuveC1bnt68Ff_R9TICi-duBLbPOJsUFeWtOGGx_5RYhnk24IVkZnn%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, connect the selected data points with lines to draw the simplified Line Series:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXdYs2qwcu6I1QZAf56hv_qryib9CE5LjhbY9aSypSA1KHIejBPHoQxmPgXBMaYnnxPDr8Nk2uBpArFb3RrqZ2eZLeJSZ6zWeyCJfksp8ErxSk7Bt6rvKp4hVbkG-StVVMuGBFYG8kqDXGs_j2RsBi93XpgK%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXdYs2qwcu6I1QZAf56hv_qryib9CE5LjhbY9aSypSA1KHIejBPHoQxmPgXBMaYnnxPDr8Nk2uBpArFb3RrqZ2eZLeJSZ6zWeyCJfksp8ErxSk7Bt6rvKp4hVbkG-StVVMuGBFYG8kqDXGs_j2RsBi93XpgK%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it... by applying the M4 algorithm we've reduced the number of drawing operations required from 100 to 18.&lt;/p&gt;

&lt;p&gt;We purposefully made our buckets large in this example to illustrate how the algorithm works. To make this optimised chart appear almost indistinguishable from if the algorithm had never been applied, you’ll want your number of buckets set so that each bucket is around a pixel wide.&lt;/p&gt;

&lt;p&gt;For example, if you're rendering a chart that's 500 pixels wide and contains one million data points, you would divide the data into 500 buckets - one bucket per pixel. Each bucket would contain 2,000 data points (since 1,000,000 divided by 500 equals 2,000). In this example, applying the M4 algorithm reduces each bucket to a maximum of four points, meaning you'd end up with up to 2,000 points in total (500 buckets × 4 points), which is just 0.2% of the original data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizing for Interactivity
&lt;/h2&gt;

&lt;p&gt;When implementing this algorithm the first problem we encountered was that iterating over a million points is slow. To achieve 60fps performance we need to render each frame in around 16ms, however, our most optimised implementation took around 100ms to complete, which made features like &lt;a href="https://www.ag-grid.com/charts/javascript/zoom/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;&lt;u&gt;Zoom&lt;/u&gt;&lt;/a&gt; feel sluggish.&lt;/p&gt;

&lt;p&gt;To fix this, we can pre-compute the M4 algorithm at different zoom levels, much like Google Maps does as you zoom out from a small street to a city. This works by starting with of snapshot of the highest detail you have available, and then gradually reducing the level of detail to generate additional snapshots until there is no value in reducing it further.&lt;/p&gt;

&lt;p&gt;For the M4 algorithm, we employ a clever technique to accelerate detail reduction. Instead of processing the original dataset at each level of detail, we utilize the results from a previous run by combining each adjacent pair of buckets, effectively halving the number of buckets.&lt;/p&gt;

&lt;p&gt;Below is an illustration of our example after merging the buckets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXe_XeppydE8Cdc1A-Qo-Scn6Hf55iEItRRI5JaTLV-fhBenbQUQMnbr9jcxq6040KPtXS8IXuffP-ANYMW-UBrv9jaeUCFt2SpvVYPBScoO91t5YKvmZM4cFOQSKVey7atxSViyQTT5XiLfUogOMsza4ZIJ%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-qw.googleusercontent.com%2Fdocsz%2FAD_4nXe_XeppydE8Cdc1A-Qo-Scn6Hf55iEItRRI5JaTLV-fhBenbQUQMnbr9jcxq6040KPtXS8IXuffP-ANYMW-UBrv9jaeUCFt2SpvVYPBScoO91t5YKvmZM4cFOQSKVey7atxSViyQTT5XiLfUogOMsza4ZIJ%3Fkey%3DeCupEZVhUad2HTY3t60hjXhi" alt="Optimising Large Data Set Visualisations with the M4 Algorithm" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach allows us to reuse the already filtered data, rather than starting from scratch with the entire dataset. When dealing with a dataset of one million points, reducing the filtered data to just a few thousand points makes a huge difference. As an added bonus, each time this step is repeated, it will take less time than the previous run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;As you can see from the chart below, these optimizations have the biggest impact on large datasets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftinaa3lxenvdl4rnfy4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftinaa3lxenvdl4rnfy4r.png" alt="JavaScript Chart Perforance" width="676" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Test the performance by yourself by selecting a large data set and zooming / scrolling in our &lt;a href="https://www.ag-grid.com/blog/charts/javascript/optimsing-javascript-charts-with-m4-algorithm/high-performance-line-chart-example/" rel="noopener noreferrer"&gt;live demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By implementing the M4 algorithm and optimizing data processing, AG Charts 11 delivers high-performance rendering of large Line Series datasets. These enhancements enable you to create interactive charts that remain fast &amp;amp; responsive, even with millions of data points.&lt;/p&gt;

&lt;p&gt;If you've made it this far, you may be interested in some of our other performance-related blogs, that discuss a range of other optimisations we've made to AG Charts to make it The Best &lt;a href="https://www.ag-grid.com/charts/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript Charting Library&lt;/a&gt; In The World:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.ag-grid.com/optimising-html5-canvas-rendering-best-practices-and-techniques/" rel="noopener noreferrer"&gt;Optimising HTML5 Canvas Rendering: Best Practices and Techniques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.ag-grid.com/building-ag-charts-efficient-javascript-charting-with-tree-based-scene-graphs/" rel="noopener noreferrer"&gt;Building AG Charts: Efficient JavaScript Charting with Tree-Based Scene Graphs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want to add high-performance &lt;a href="https://www.ag-grid.com/charts/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript Charts&lt;/a&gt; to your application? Get started today, for free:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/charts/javascript/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;Get Started&lt;/a&gt;&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>charts</category>
      <category>charting</category>
      <category>performance</category>
    </item>
    <item>
      <title>Building AG Charts: Efficient JavaScript Charting with Tree-Based Scene Graphs</title>
      <dc:creator>James Swinton-Bland</dc:creator>
      <pubDate>Thu, 26 Sep 2024 09:33:32 +0000</pubDate>
      <link>https://dev.to/ag-grid/building-ag-charts-efficient-javascript-charting-with-tree-based-scene-graphs-47ka</link>
      <guid>https://dev.to/ag-grid/building-ag-charts-efficient-javascript-charting-with-tree-based-scene-graphs-47ka</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzfo6zf11ge4bb3jmqi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzfo6zf11ge4bb3jmqi6.png" alt="Building AG Charts: Efficient JavaScript Charting with Tree-Based Scene Graphs" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AG Charts is a high-performance, canvas-based &lt;a href="https://www.ag-grid.com/charts/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript charting library&lt;/a&gt;, designed for creating complex and interactive JavaScript charts. Initially built to power &lt;a href="https://www.ag-grid.com/react-data-grid/integrated-charts/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;Integrated Charts&lt;/a&gt; in AG Grid (our &lt;a href="https://www.ag-grid.com/react-table?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;React Data Table&lt;/a&gt; library), it now stands alone with over 1 million npm downloads per month.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore how AG Charts leverages a tree-based scene graph abstraction to efficiently render complex &lt;a href="https://www.ag-grid.com/charts?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript charts&lt;/a&gt;, offering a powerful solution for developers building data visualizations in JavaScript, &lt;a href="https://www.ag-grid.com/charts/react/quick-start/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;React&lt;/a&gt;, &lt;a href="https://www.ag-grid.com/charts/angular/quick-start/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; and &lt;a href="https://www.ag-grid.com/charts/vue/quick-start/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges in JavaScript Charting with HTML Canvas
&lt;/h2&gt;

&lt;p&gt;Rendering graphics on the web can be a double-edged sword. While the HTML Canvas API provides a solid platform for drawing complex shapes and images, it comes with performance considerations, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rendering Overhead&lt;/strong&gt; : Canvas operations involve manipulating the pixels of a bitmap, which means that drawing, compositing, and transformations require direct interaction with the GPU or software rendering pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser API Overhead&lt;/strong&gt; : Each canvas API call incurs a certain amount of overhead due to interaction with the browser's rendering engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repainting and Redrawing&lt;/strong&gt; : When you draw on a canvas, the entire pixel area being modified has to be recalculated and redrawn, especially for complex shapes or animations. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-threaded Execution&lt;/strong&gt; : JavaScript and canvas rendering both run on the main thread. Intensive canvas operations can block the main thread, leading to slower response times and reduced performance for other JavaScript tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Hardware Acceleration in Some Cases&lt;/strong&gt; : While some canvas operations can be hardware accelerated, not all operations benefit from it. This inconsistency can lead to performance bottlenecks, especially with complex or frequent drawing operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given this, we needed a solution that would allow us to work with the canvas as efficiently as possible.&lt;/p&gt;

&lt;p&gt;_Enter the &lt;strong&gt;scene graph.&lt;/strong&gt; _&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is a Scene Graph?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A tree-based scene graph is a hierarchical data structure used in computer graphics to represent the spatial and logical relationships between objects in a scene. Each node in the tree corresponds to an object or entity in the scene, and the parent-child relationships between nodes define transformations such as translation, rotation, and scaling relative to their parents.&lt;/p&gt;

&lt;p&gt;In AG Charts, the scene graph is an abstraction layer over the HTML Canvas, providing a higher-level API for constructing and manipulating chart elements, such as markers, lines, circles and shapes. The scene graph also provides a layer where we can perform caching and optimise canvas rendering, negating some of the aforementioned performance considerations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Scene Graph is Essential for JavaScript Chart Libraries
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Higher-Order Abstraction for Rendering:&lt;/strong&gt; The scene graph in AG Charts was designed to simplify the low-level drawing operations required by the Canvas API. Instead of working directly with pixels, chart renderings could work with higher-order constructs like markers, lines, circles, and shapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching and Optimization:&lt;/strong&gt; One key advantage of the scene graph is its ability to cache and optimize canvas rendering. Since canvas operations are typically slower than JavaScript operations, caching results and minimizing redraws are essential for maintaining performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support for Matrix Transformations:&lt;/strong&gt; Initially, we added support for matrix transformations on the base node class of all scene graph nodes, which includes rotation, scaling and translation operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinate Conversion Utilities:&lt;/strong&gt; We also implemented methods for converting points and boxes to and from canvas coordinates. These utilities were used liberally throughout our codebase to manage positioning and layout tasks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How the Scene Graph Was Implemented in AG Charts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Our scene graph consists of nodes representing different chart elements, with a base node class that includes properties for positioning, styling, and rendering. Each node type—whether a line, shape, or marker—inherits from this base class and implements its own rendering logic.&lt;/p&gt;

&lt;p&gt;The base node class also includes support for matrix transformations. Matrix transformations are mathematical operations used to manipulate the position, scale, and rotation of objects within a 2D space. These transformations are represented as matrices, which, when applied to points or objects, alter their geometric properties. The main types of transformations are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Translation&lt;/strong&gt; : Shifts an object from one position to another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling&lt;/strong&gt; : Changes the size of an object either uniformly or non-uniformly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotation&lt;/strong&gt; : Rotates an object around a specific point or axis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In a scene graph, these transformations are applied hierarchically. Each node in the graph represents an object or a group of objects and holds its transformation matrix. The final transformation of a child node is the result of its own transformation combined with the transformations of all its parent nodes.&lt;/p&gt;

&lt;p&gt;In addition to matrix transformations, we also added methods to convert to/from canvas coordinates for points and boxes, which were liberally used around the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Continuous Improvement of AG Charts JavaScript Charts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Whilst our initial implementation of the scene graph provided many benefits, as AG Charts continues to evolve we've noticed areas for further improvement, namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overhead from Matrix Transformations:&lt;/strong&gt; Although matrix transformations were supported by default, they were unnecessary for most rendering tasks. In practice, 95% of our scene graph nodes do not require these transformations, leading to unnecessary computational overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity in Coordinate Conversions:&lt;/strong&gt; The frequent use of coordinate conversion methods added complexity to the codebase, making it harder to maintain and optimize.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Bottlenecks:&lt;/strong&gt; As our library grew, we noticed that matrix transformations were consuming a non-trivial amount of execution time, even for nodes where these transformations were not needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Our Approach to Optimizing the Scene Graph&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To address these challenges, we implemented a series of changes aimed at simplifying the scene graph and reducing performance overhead:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Selective Application of Matrix Transformations:&lt;/strong&gt; We removed all matrix support from the existing scene graph nodes and added mixin classes. This allowed us to selectively re-add matrix transforms to the specific parts of the codebase where they were still needed. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplifying Coordinate Transformations:&lt;/strong&gt; We refactored the base scene-graph nodes by replacing methods that returned canvas coordinates with helper functions using local coordinates, reducing costly matrix operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improving Hit-Testing Performance:&lt;/strong&gt; We streamlined hit testing (determining whether a mouse or touch event intersects with a specific object drawn on the canvas) by converting to local coordinates upfront and applying transforms as we traverse the scene graph, avoiding the need for continuous coordinate conversions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refactoring and Cleanup:&lt;/strong&gt; As a result of these simplifications and improvements, we were able to generally refactor and clean up redundant operations throughout our codebase, reducing our overall tech debt, and thereby improving maintainability as well as performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Key Pull Requests and Changes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These optimizations were implemented across several pull requests. Given AG Charts is entirely open-source, you can dig into these PRs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ag-grid/ag-charts/pull/2234?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;PR #2234: Clean up the Scene Graph, pt.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ag-grid/ag-charts/pull/2242?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;PR #2242: Remove translation support from Node.ts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ag-grid/ag-charts/pull/2245?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;PR #2245: Fix bbox caching &amp;amp; simplify coordinate translations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ag-grid/ag-charts/pull/2269?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;PR #2269: Clean up the Scene Graph, pt.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Results and Performance Gains&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;These changes have led to several positive outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Overhead from Unnecessary Matrix Transforms:&lt;/strong&gt; Matrix transformations are now only applied where needed, mostly in rendering leaf nodes of the scene graph, reducing unnecessary computational costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster Hit-Testing and Rendering:&lt;/strong&gt; Hit-testing operations are now cheaper and faster, thanks to optimized coordinate handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Improvements in Benchmarks:&lt;/strong&gt; Internal benchmarking shows notable performance gains in large-scale use cases, demonstrating the effectiveness of these optimizations:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvtrkj7ivof9hxkqepfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvtrkj7ivof9hxkqepfa.png" alt="Overview of scene graph performance improvements" width="800" height="920"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;bbox caching introduced in b10.1 &amp;amp; Matrix transformations removed in latest (b10.2)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By refining our use of matrix transformations and optimizing the scene graph, we've significantly improved the performance of AG Charts. These changes are now part of the latest (10.2) release, and we're excited to see how they enhance your charting experience. Stay tuned for more updates as we continue to innovate and improve AG Charts!&lt;/p&gt;

&lt;p&gt;Want to build &lt;a href="https://www.ag-grid.com/charts?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;JavaScript charts&lt;/a&gt; with AG Charts? Get Started today by visiting our documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ag-grid.com/charts/javascript/quick-start/?ref=blog.ag-grid.com" rel="noopener noreferrer"&gt;Get Started with AG Charts JavaScript Charting Library&lt;/a&gt;&lt;/p&gt;

</description>
      <category>charts</category>
    </item>
    <item>
      <title>Introducing AG Charts Enterprise</title>
      <dc:creator>James Swinton-Bland</dc:creator>
      <pubDate>Tue, 05 Dec 2023 11:37:40 +0000</pubDate>
      <link>https://dev.to/ag-grid/introducing-ag-charts-enterprise-f87</link>
      <guid>https://dev.to/ag-grid/introducing-ag-charts-enterprise-f87</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wXrUy7Od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/Introducing-AG-Charts-Enterprise-Banner.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wXrUy7Od--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/Introducing-AG-Charts-Enterprise-Banner.png" alt="Introducing AG Charts Enterprise" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://charts.ag-grid.com/?utm_source=AG+Grid+Blog&amp;amp;utm_medium=blog&amp;amp;utm_campaign=introducing_ag_charts"&gt;AG Charts&lt;/a&gt; is an open-source JavaScript charting and graphing library from the makers of AG Grid built for React, Angular and Vue. Last week saw the release of &lt;a href="https://blog.ag-grid.com/whats-new-in-ag-charts-9/"&gt;AG Charts 9&lt;/a&gt;, and, most notably, the introduction of AG Charts Enterprise.&lt;/p&gt;

&lt;p&gt;Read on to learn a bit more about the background of AG Charts, how we arrived where we are today, and what you can expect from our brand-new enterprise product 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  History of AG Charts
&lt;/h2&gt;

&lt;p&gt;AG Charts was built by the AG Grid team in 2019 as a way to power &lt;a href="https://www.ag-grid.com/react-data-grid/integrated-charts/?ref=blog.ag-grid.com"&gt;integrated charts&lt;/a&gt; in AG Grid - a feature that lets users build charts directly from AG Grid. Sticking to our roots as an open-source company, we released AG Charts as a completely free and stand-alone open-source library. We knew that we had built a great library in its own right, so why not share it? Since then, AG Charts has steadily grown in popularity, now amassing over &lt;a href="https://www.npmjs.com/package/ag-charts-community?activeTab=readme&amp;amp;ref=blog.ag-grid.com"&gt;300,000 NPM downloads/month&lt;/a&gt; (as of 04/12/2023). With this rise in popularity, we decided it was time to invest further in AG Charts which has now culminated in the release of AG Charts 9 and the introduction of AG Charts Enterprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AG Charts?
&lt;/h2&gt;

&lt;p&gt;At this point, you may be thinking: "Why another charting library?" or "Why should I use AG Charts?". Our response would be that AG Charts comes with the same performance and reliability our users have come to expect of AG Grid. This reputation, and the subsequent trust we've earned with grid developers, has consistently separated us from our competition. We're confident we can earn that same reputation and trust from Charts developers, too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise vs. Community
&lt;/h2&gt;

&lt;p&gt;The obvious next question is, what's the difference between the Enterprise and Community versions of AG Charts? Well, in a nutshell:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AG Charts Community is the original version of AG Charts that is designed to meet most use cases and is free forever.&lt;/li&gt;
&lt;li&gt;AG Charts Enterprise is an advanced version of AG Charts, with more series types, features, and dedicated Zendesk support, designed for enterprise use cases and customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's take a closer look at the series types &amp;amp; features available in AG Charts Enterprise:&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise Series Types
&lt;/h2&gt;

&lt;p&gt;AG Charts Enterprise comes with &lt;strong&gt;13 additional series types -&lt;/strong&gt; &lt;a href="https://charts.ag-grid.com/react/box-plot-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Box Plot&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/bullet-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Bullet&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/heatmap-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Heatmap&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/range-area-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Range Area&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/range-bar-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Range Bar&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/radar-area-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Radar Area&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/radar-line-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Radar Line&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/radial-bar-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Radial Bar&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/radial-column-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Radial Column&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/nightingale-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Nightingale&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/sunburst-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Sunburst&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/treemap-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Treemap&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://charts.ag-grid.com/react/waterfall-series/?ref=blog.ag-grid.com"&gt;&lt;em&gt;Waterfall&lt;/em&gt;&lt;/a&gt;&lt;em&gt;:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wF9DNqjZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/heatmap-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wF9DNqjZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/heatmap-screenshot.png" alt="Introducing AG Charts Enterprise" width="730" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P6dzIw6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/nightingale-screenshot-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P6dzIw6w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/nightingale-screenshot-2.png" alt="Introducing AG Charts Enterprise" width="375" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C6V8mkRH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/radar-area-screenshot-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C6V8mkRH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/radar-area-screenshot-2.png" alt="Introducing AG Charts Enterprise" width="427" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zMipxM9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/radial-bar-screenshot-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zMipxM9g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/radial-bar-screenshot-2.png" alt="Introducing AG Charts Enterprise" width="338" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H30ZVrl_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/range-area-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H30ZVrl_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/range-area-screenshot.png" alt="Introducing AG Charts Enterprise" width="731" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hal7Iqx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/range-bar-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hal7Iqx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/range-bar-screenshot.png" alt="Introducing AG Charts Enterprise" width="731" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uB0IJHAw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/treemap-screenshot-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uB0IJHAw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/treemap-screenshot-1.png" alt="Introducing AG Charts Enterprise" width="668" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OQFE7H4w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/waterfall-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OQFE7H4w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/waterfall-screenshot.png" alt="Introducing AG Charts Enterprise" width="729" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CagmVcFt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/box-plot-screenshot-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CagmVcFt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/box-plot-screenshot-4.png" alt="Introducing AG Charts Enterprise" width="728" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://charts.ag-grid.com/gallery/?ref=blog.ag-grid.com"&gt;gallery&lt;/a&gt; for a full list of series types &amp;amp; examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enterprise Features
&lt;/h2&gt;

&lt;p&gt;In addition to enhanced series types, AG Charts Enterprise also comes with a range of new features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/animation/?ref=blog.ag-grid.com"&gt;Animation&lt;/a&gt; of the graph or chart on load or update&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/context-menu/?ref=blog.ag-grid.com"&gt;Context Menu&lt;/a&gt; for additional actions, such as zooming, downloading or whatever else your users may need&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/axes-crosshairs/?ref=blog.ag-grid.com"&gt;Crosshairs&lt;/a&gt; for precise analysis of complex graphs&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/zoom/?ref=blog.ag-grid.com"&gt;Zoom&lt;/a&gt; into and out of data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/error-bars/?ref=blog.ag-grid.com"&gt;Error Bars&lt;/a&gt; for showing confidence intervals within data&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://charts.ag-grid.com/react/background-image/?ref=blog.ag-grid.com"&gt;Background Images&lt;/a&gt; to brand and style the chart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out the animation below that demonstrates some of these features:&lt;/p&gt;





&lt;p&gt;&lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                        &lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                        0:00&lt;br&gt;
 /0:12&lt;br&gt;
1×&lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                        &lt;br&gt;
                            &lt;br&gt;
                                &lt;br&gt;
                            &lt;br&gt;
                        &lt;/p&gt;

&lt;h2&gt;
  
  
  Framework Support
&lt;/h2&gt;

&lt;p&gt;AG Charts Community and Enterprise have both been built specifically for React, Angular, and Vue meaning you can build React Charts as easily as you can build JavaScript charts. These aren't just wrappers, either; we've built the library specifically for these frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and Upgrading
&lt;/h2&gt;

&lt;p&gt;It's free to try out AG Charts Enterprise and you do not need to contact us at all; we just ask that you don't use AG Charts Enterprise in a project intended for production without a licence.&lt;/p&gt;

&lt;p&gt;When testing without a valid license key installed, your console log will will show a watermark for 5 seconds and display a series of warnings:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FEX_Yt4E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/enterprise-console-warning.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FEX_Yt4E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://blog.ag-grid.com/content/images/2023/12/enterprise-console-warning.png" alt="Introducing AG Charts Enterprise" width="799" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you would like to remove this watermark or access support via Zendesk, you will need a trial license. Please email &lt;a href="//mailto:info@ag-grid.com"&gt;info@ag-grid.com&lt;/a&gt; to request a trial license key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;AG Charts Enterprise pricing at $399 / developer, but there is a limited-time launch price of $199 / developer. Check out the &lt;a href="https://charts.ag-grid.com/license-pricing/?ref=blog.ag-grid.com"&gt;pricing&lt;/a&gt; page for more information.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AG Charts was built in 2019 by the AG Grid team to power Integrated Charting within AG Grid.&lt;/li&gt;
&lt;li&gt;Sticking to our roots, we released AG Charts as a free, standalone, open-source library.&lt;/li&gt;
&lt;li&gt;AG Charts proved to be popular with the community, so we decided to release an Enterprise version in December 2023 with new features, series types and dedicated support.&lt;/li&gt;
&lt;li&gt;AG Charts Enterprise requires a license and AG Charts Community will remain free forever&lt;/li&gt;
&lt;li&gt;You can trial AG Charts Enterprise for free - it just displays a watermark and a console warning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to try it out? Get started with AG Charts Enterprise now 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://charts.ag-grid.com/documentation?ref=blog.ag-grid.com"&gt;Get Started&lt;/a&gt;&lt;/p&gt;




</description>
      <category>aggrid</category>
      <category>agcharts</category>
      <category>releases</category>
    </item>
    <item>
      <title>Introducing the AG Grid Figma Design System</title>
      <dc:creator>James Swinton-Bland</dc:creator>
      <pubDate>Tue, 22 Aug 2023 09:01:29 +0000</pubDate>
      <link>https://dev.to/ag-grid/introducing-the-ag-grid-figma-design-system-3g7g</link>
      <guid>https://dev.to/ag-grid/introducing-the-ag-grid-figma-design-system-3g7g</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;If you're a designer working with AG grid it's time to get very excited! With AG Grid version 30.1.0 we've released our new Figma Design System.&lt;/p&gt;

&lt;p&gt;If you want to skip the preamble and dig into the design system yourself you can download it directly from our &lt;a href="https://ag-grid.com/javascript-data-grid/ag-grid-design-system/?ref=blog.ag-grid.com"&gt;design system documentation page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everything you need to design with AG Grid
&lt;/h3&gt;

&lt;p&gt;The new design system implements our Alpine and Alpine Dark themes in Figma. All of the core AG Grid components are fully built out and ready to use, with even more components arriving in future releases. Each component has been carefully crafted to precisely mirror what's available in the AG Grid library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make it your own...
&lt;/h3&gt;

&lt;p&gt;And when you're ready to make AG Grid your own we've got you covered. The Alpine and Alpine Dark themes can be extended to create custom AG Grid themes that work with your brand. We even provide a sample style dictionary project so you can export your bespoke themes to json and quickly create custom AG Grid CSS themes.&lt;/p&gt;

&lt;p&gt;To learn more about the design system and thow it can help your design workflow watch this short video on Youtube.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/eyXUr3fYRYM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Get designing now
&lt;/h3&gt;

&lt;p&gt;Once you're ready to get started with the Figma design system checkout our &lt;a href="https://ag-grid.com/javascript-data-grid/ag-grid-design-system/?ref=blog.ag-grid.com"&gt;design system documentation page&lt;/a&gt; to download the design system and start creating with AG Grid.&lt;/p&gt;

</description>
      <category>figma</category>
      <category>designsystem</category>
      <category>design</category>
      <category>grid</category>
    </item>
  </channel>
</rss>
