<?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: Andrew Bt</title>
    <description>The latest articles on DEV Community by Andrew Bt (@andyb1979).</description>
    <link>https://dev.to/andyb1979</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%2F1233455%2F27189099-3715-470f-9973-3001cc86a694.png</url>
      <title>DEV Community: Andrew Bt</title>
      <link>https://dev.to/andyb1979</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andyb1979"/>
    <language>en</language>
    <item>
      <title>Powering Research. Development. Innovation worldwide</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 15:06:38 +0000</pubDate>
      <link>https://dev.to/andyb1979/powering-research-development-innovation-worldwide-4d2</link>
      <guid>https://dev.to/andyb1979/powering-research-development-innovation-worldwide-4d2</guid>
      <description>&lt;p&gt;At SciChart we are proud to support Innovation &amp;amp; Research worldwide. As part of an educational license program, we grant licenses in many cases for free, or at low cost to Universities for non-profit R&amp;amp;D worldwide. We have astounding list of over 145 Universities which use SciChart in their projects, including MIT, Stanford, Imperial College London and more. These projects have powered cutting-edge research and advanced the frontiers of science, using our high-performance, real-time charting libraries to visualise data.&lt;/p&gt;

&lt;h2&gt;
  
  
  List of Projects Showcased in this Article
&lt;/h2&gt;

&lt;p&gt;We’ve taken a handful of the best student &amp;amp; University research projects to showcase in this article. For a look at what SciChart can do, and some of the incredible research, read on!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project 1: The University of Illinois reduced cancer screening time from weeks to hours in research of methods being used for classification of tissue thin sections identifying tumorous regions.&lt;/li&gt;
&lt;li&gt;Project 2: The NTNU Norwegian University students built an electric race car from scratch and participate in Formula Student every year. They have created their own dashboard to monitor and adjust car performance with the data from more than 300 sensors.&lt;/li&gt;
&lt;li&gt;Project 3: A FH Joanneum University student developed a wearable device and App, enabling researchers to conduct vital signs analysis from raw sensor data for personal health. The main goal is to increase diagnostic accuracy.&lt;/li&gt;
&lt;li&gt;Project 4: A student at Vellore Institute of Technology and created a low-cost non-invasive healthcare solution for the clinical needs of India and the rest of the world, a cheap portable ECG device that could achieve medical grade clarity with realtime data plotting.&lt;/li&gt;
&lt;li&gt;Project 15 MIT students have created a robotic smart shoe with the skin surface like sensors. Its telemetry data prevents robot from falling. The ultimate goal is to assist elderly with fall prevention and athletes with training data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project 1: High-Definition Realtime Visualization of IR QCL Spectroscopy for Diagnostic Tissue Imaging
&lt;/h2&gt;

&lt;p&gt;The University of Illinois departments of Bioengineering, Mechanical Science &amp;amp; Electrical Computer Engineering were researching alternatives to Fourier-transform infrared spectroscopy for use in Medical Diagnostics and methods being used for classification of tissue thin sections identifying tumorous regions.&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%2Fsvn2g27a22bg1mxqgegu.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%2Fsvn2g27a22bg1mxqgegu.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&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%2Fw2s4pgjzbdrjdwo37i2l.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%2Fw2s4pgjzbdrjdwo37i2l.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&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%2Ff1h8jg7ug8z9or04n82j.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%2Ff1h8jg7ug8z9or04n82j.png" alt=" " width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite exponential growth of the field and its world-wide research, the clinical sphere has been limited by data management. With over a 100 million data points generated in realtime, current imaging technologies were limited to less than 1% of the data set.&lt;/p&gt;

&lt;p&gt;This study turned into the cutting-edge research project where SciChart’s WPF charting library is used to display Realtime High Definition Heatmaps from Quantum Cascade Laser (QCL) Infrared (IR) Spectroscopy.&lt;/p&gt;

&lt;p&gt;SciChart helped with handling over 1 million points of data in real time with the capacity to increase to 10 million. This allowed the advent of HD Realtime IR imaging and reduced the screening time from weeks to hours. In this field time is indeed the invaluable resource.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 2: Data visualization of more than 300 race car sensors
&lt;/h2&gt;

&lt;p&gt;Revolve team from NTNU used SciChart’s High Performance WPF Charting Library to handle their complex data from over 300 sensors in their electric Race Car.&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%2Fl8fyl44zy9en5gcaadu3.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%2Fl8fyl44zy9en5gcaadu3.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&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%2Fu5hum7aed7pjjyv6babn.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%2Fu5hum7aed7pjjyv6babn.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&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%2F831soejyt6xg8u6r86oi.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%2F831soejyt6xg8u6r86oi.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Revolve NTNU Norwegian University of Science &amp;amp; Technology is an independent student organization engaged in Formula Student, Europe’s most established educational motorsport competition. Creating new iterations of their Race Car each year, Revolve needed to be able to visualization their multi-stream, high-bandwidth data from their hundreds of sensors in Realtime to ensure top performance and allow for torque vectoring and testing of their car.&lt;/p&gt;

&lt;p&gt;Realtime race visualisation for Formula race cars using SciChart. Showing Battery Management System Heatmap, Scatter Maps, Damper Rate, Realtime Laps Map, Break Sensor Data and more.&lt;/p&gt;

&lt;p&gt;The charting library allowed the team to do performance analysis and testing, they are ranked number 10 in the world now and surely are some of the most talented engineering students in the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 3: Medical-grade wearable device that offers real-time physiological data acquisition
&lt;/h2&gt;

&lt;p&gt;A student from FH Joanneum University of Applied Science has developed an Android Application to record acquired sensor data via Bluetooth and to allow synchronization with the Empatica(E4) and Google Fit cloud storage solutions.&lt;/p&gt;

&lt;p&gt;The E4 is a medical-grade wearable device that offers real-time physiological data acquisition.&lt;/p&gt;

&lt;p&gt;Since there is no universal standard for data exchange the goal is to enable the researchers to conduct in-depth analysis from the raw sensors data visualised and exported. The SciChart Android Charting library was used to visualise the raw data received from sensors via Bluetooth.&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%2Fsz919jlrta5l56n79ykv.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%2Fsz919jlrta5l56n79ykv.png" alt=" " width="797" height="1010"&gt;&lt;/a&gt;&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%2F55hgq7m1y1g4h6k7mi15.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%2F55hgq7m1y1g4h6k7mi15.png" alt=" " width="431" height="763"&gt;&lt;/a&gt;&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%2Fat8s77bh9etv3x2e2c7r.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%2Fat8s77bh9etv3x2e2c7r.png" alt=" " width="430" height="763"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The E4 wearable device and the Android application data visualization&lt;br&gt;
It measures blood volume pulse (BVP), from which heart rate variability can be derived. The 3-axis accelerometer captures motion-based activity. An EDA sensor (GSR Sensor) measures the constantly fluctuating changes in certain electrical properties of the skin. An infrared thermopile reads peripheral skin temperature.&lt;/p&gt;

&lt;p&gt;As the result of the study the heart rate variability (HRV) was calculated using the interbeat interval between all successive heartbeats.&lt;/p&gt;

&lt;p&gt;Needless to say, that the implications of the personal health devices can increase diagnostic accuracy, enhance physician efficiency and allow more convenient data collection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 4: Visualization of ECG signals in Realtime on a low cost portable device
&lt;/h2&gt;

&lt;p&gt;A student at Vellore Institute of Technology, Vellore as a part of Cardea Labs &amp;amp; Cardea Biomedical Technologies Pvt. Ltd team had a challenge to create a low-cost non-invasive healthcare solution for the clinical needs of India and the rest of the world. It had to be an affordable portable ECG device that could achieve medical grade clarity, therefore the challenge was in the reliable realtime data visualization with smooth interactions.&lt;/p&gt;

&lt;p&gt;SciChart’s WPF extensive charting library was used to create the FIFO functionality required, which generated a Realtime scrolling ECG monitor. The chart is dynamically updating at 250 points per second with data acquisition through Bluetooth connection for an ECG device derived from the miBEAT hardware platform.&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%2Foe31l8wjlmyvvm0bchra.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%2Foe31l8wjlmyvvm0bchra.png" alt=" " width="472" height="469"&gt;&lt;/a&gt;&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%2F75aoi5bt8g5iq2f7ljmn.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%2F75aoi5bt8g5iq2f7ljmn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&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%2F8znpysjv940p90slpkiz.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%2F8znpysjv940p90slpkiz.png" alt=" " width="442" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was combined with export function that allowed users to export in numerous formats, so the data could be collated outside of the application. The session window allows to Pan, Zoom &amp;amp; Scroll making the UI intuitive and user friendly, all this being used on smaller portable devices.&lt;/p&gt;

&lt;p&gt;From the Author&lt;br&gt;
My students’ years were enriched by being a part of Students’ Organizations. I was a member and a leader of a local group of the Board of European Students of Technology –  a non-profit organization with the mission to empower diversity.  I also joined the Enactus team at Graceland University during my exchange year abroad program. Enactus is an organization has the vision to create better more sustainable world. These experiences shaped me and my career as it is now. This is where I gained my skills to land the first job and my drive to progress at what I do.&lt;/p&gt;

&lt;p&gt;I am happy to work at a place that supports students as much. SciChart has an academic free license for the students’ university projects and research. SciChart is an innovative company at its heart and investing into students, who have the spirit and unstoppable willingness to make a difference gives us an interesting mix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project 5: MIT / Realtime Android charting for Robotics Telemetry
&lt;/h2&gt;

&lt;p&gt;MIT Biomimetic Robotics Lab used SciChart for Android to display and interpret Realtime telemetry data from Smart shoe sensors designed to capture measurements of force-data during movement.&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%2F2tw6kfyoe2zbspftblao.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%2F2tw6kfyoe2zbspftblao.png" alt=" " width="688" height="373"&gt;&lt;/a&gt;&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%2F0iu8mfawu7xftd4y08q0.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%2F0iu8mfawu7xftd4y08q0.png" alt=" " width="800" height="603"&gt;&lt;/a&gt;&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%2F2uy9kujom2g797bwnb75.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%2F2uy9kujom2g797bwnb75.png" alt=" " width="464" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Organic organisms contain an abundance of surface skin sensors that can determine pressure, vibrations and forces which in turn feedback and allow calibration of movement. The Biomimetic Robotics lab at MIT aimed to develop a similar multi-axis force sensor for use in the next generation of legged robots by mapping the local sampling of stress inside their custom polymeric footpad.&lt;/p&gt;

&lt;p&gt;SciChart’s Android charts were used in the application for reading and visualising multiple streams of data at 1kHz amounting to hundreds of thousands of data points, collected from smart shoe telemetry.&lt;/p&gt;

&lt;p&gt;The team’s goal is to use these force sensing shoes not only in robotics, such as the famous Cheetah Robot, but also to help assist the elderly and disabled during walking for fall prevention and mitigation as well as to provide athletes with training data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enjoyed our Case Studies?
&lt;/h2&gt;

&lt;p&gt;Find more case studies here: Desktop Case Studies, Mobile Case Studies, Consultancy Project Case Studies.&lt;/p&gt;

&lt;p&gt;p.s. Interesting, that the sphere where students’ projects have been performed align perfectly with the domains of commercials SciChart customers, including 60% of top global semiconductor companies, 80% of global MedTech, 80% of top US Banks, All top F1 Teams, Top Global Petrochemical companies and thousands more.&lt;/p&gt;

&lt;p&gt;p.p.s.Vrije Universiteit Amsterdam, ranked in the top 100 of global universities is now teaching SciChart to its computer science students in the construction of real time applications. SciChart is being taught at several leading educational establishments meaning that our software is being used to train the next generation of the workforce in cutting edge technology.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SciChart – The Fastest WPF Charts. Period. 2021 Test Results Update</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:55:00 +0000</pubDate>
      <link>https://dev.to/andyb1979/scichart-the-fastest-wpf-charts-period-2021-test-results-update-4m09</link>
      <guid>https://dev.to/andyb1979/scichart-the-fastest-wpf-charts-period-2021-test-results-update-4m09</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Performance has always been one of the main aims of SciChart’s WPF chart libraries. Our customers include engineering, financial and medical companies who demand the very best performance, flexibility, reliability, integrity of our staff as well as excellent customer service.&lt;/p&gt;

&lt;p&gt;We’re proud to announce that &lt;a href="https://www.scichart.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; is used by not one, but directly by five Formula One teams! As well as indirect usage in all F1 teams via vendor software in some shape or form.&lt;/p&gt;

&lt;p&gt;Defence companies and even governments that demand reliability of our software and integrity of our engineers are repeat customers of SciChart. Medical companies who create cutting edge medical-devices, participate in bleeding edge cancer research use SciChart. They all require high performance.&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%2Fo1axz2y8tz3g8epd0kvd.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%2Fo1axz2y8tz3g8epd0kvd.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SciChart is used in demanding applications. 5 Formula One teams use SciChart!&lt;/p&gt;

&lt;p&gt;Having the &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Fastest WPF Charts&lt;/a&gt; is a great selling point but it’s not the only reason to use our Software.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; is also incredible easy to use, flexible and has a depth of features like no other.&lt;/li&gt;
&lt;li&gt;SciChart has an intuitive, XAML &amp;amp; MVVM-friendly API out of the box.&lt;/li&gt;
&lt;li&gt;Hundreds of customers rate SciChart 5-stars so we’re doing something right.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;You can find more reasons at Why SciChart: The Best WPF Charts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nevertheless, &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Chart Performance matters to our customers&lt;/a&gt;, so we test exhaustively to ensure that SciChart WPF has the best possible performance your demanding applications.&lt;/p&gt;

&lt;p&gt;So how do we do that?&lt;/p&gt;

&lt;h2&gt;
  
  
  SciChart WPF – Fastest WPF Charts by a mile
&lt;/h2&gt;

&lt;p&gt;We’ve previously talked about SciChart WPF being the Best WPF Chart, and the Fastest WPF Chart control. If you haven’t read it, have a look at SciChart WPF v6 ‘Xccelerated Edition’ Up to 100x (10,000%) Faster WPF Charts where we discuss why we focussed on improving performance in 2019/2020, the steps we’ve taken to ensure that every aspect of our pipeline is optimised and some test results vs. competitors.&lt;/p&gt;

&lt;p&gt;Using claims such as ‘Best’ or ‘Fastest’ on our website and marketing is bold but they are backed up by solid data! We’ve carried out extensive performance testing in-house. I’m going to share some of the latest test results below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updated WPF Chart Performance Comparison (November 2021)
&lt;/h2&gt;

&lt;p&gt;It’s worth a note that Open Source WPF charts and almost all Commercial WPF Charts don’t come close to SciChart’s performance. As a result they cannot even register on our demanding test suite. So instead, we’ve compared the latest test results vs. our strongest competitor in terms of performance.&lt;/p&gt;

&lt;p&gt;We’ve constructed a &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Chart Performance Test Suite&lt;/a&gt; with over 70 test high-stress test cases covering a wide variety of conditions to assess performance between SciChart &amp;amp; ‘Competitor A’.&lt;/p&gt;

&lt;p&gt;Test cases are varied and include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thousands of line series. Up to 4,000 series on screen with 4,000 datapoints per series.&lt;/li&gt;
&lt;li&gt;Realtime line series (scrolling, old data discarded). Up to 10 Billion datapoints on screen with 1 Million new data-points per second.&lt;/li&gt;
&lt;li&gt;Realtime line series with old data kept on screen. Chart auto-fit enabled. Up to 25 Million new data-points appended per second.&lt;/li&gt;
&lt;li&gt;Scatter charts &amp;amp; Scatter (XY) line series. Up to 30 Million data-points.&lt;/li&gt;
&lt;li&gt;Other WPF chart types including Candlestick, Columns, Bars, Area, Mountain. Up to 30 Million data-points.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the test results below:&lt;/p&gt;

&lt;h2&gt;
  
  
  SciChart vs. ‘Competitor A’ 2021 Test Results
&lt;/h2&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%2Fzmamlq9odw1t61occoi3.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%2Fzmamlq9odw1t61occoi3.png" alt=" " width="800" height="1144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WPF Chart Performance Comparison between SciChart WPF &amp;amp; Competitor A, November 2021.&lt;/p&gt;

&lt;p&gt;Note: Why have we hidden the test case names? Because in-depth expert analysis of chart performance is valuable and we don’t want to tip our competitors off!&lt;/p&gt;

&lt;h2&gt;
  
  
  WPF Chart Rendering Speed: FPS or ‘Frames per Second’
&lt;/h2&gt;

&lt;p&gt;On the Green/Yellow/Red column you can see FPS. This stands for ‘Frames per Second’ and is a measure of how many times the chart draws per second. This number is averaged out over the window for each test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The maximum FPS for SciChart is capped at 60 FPS&lt;/li&gt;
&lt;li&gt;The average FPS for SciChart over 70 test cases is 47 FPS&lt;/li&gt;
&lt;li&gt;The median FPS for SciChart over the test cases is 58.2 FPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile …&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Competitor A also achieved a max of 60 FPS (capped at 60)&lt;/li&gt;
&lt;li&gt;An average of 22 FPS&lt;/li&gt;
&lt;li&gt;and a median of just 9 FPS&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Over 70 demanding &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Chart Performance test cases,&lt;/a&gt; SciChart outperformed the strongest competitor on the market by an average (mean) of 455% faster rendering. A max of 3,893% faster rendering and a median of 156% faster rendering was observed in like-for-like WPF Chart Performance tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Several tests performed by Competitor A have FPS=0. This means that a prior test scored low, hanged or crashed and the test was halted for this test group. In this case the SciChart performance increase was effectively infinite, so how can we calculate speed improvement?&lt;/p&gt;

&lt;p&gt;What we can do is multiply FPS x Number of data-points in the group to determine a speed score or ‘Datapoints per second’. Then, calculate a maximum speed increase based on which chart was able to render or draw the highest number of 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%2Fflvwd0ttqytthi66i3op.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%2Fflvwd0ttqytthi66i3op.png" alt=" " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SciChart (Left Column) vs. Competitor A (Right Column). Tests in a Group with an FPS below 2 or where the competitor chart failed were halted&lt;/p&gt;

&lt;p&gt;Each Test group was a &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;specific WPF Chart test case&lt;/a&gt;. In Test Group 5, Competitor A struggled to draw 1,000,000 (1 Million) data-points at 2 FPS for this test case while SciChart was able to draw 10,000,000 (10 Million) datapoints at 58.7 FPS.&lt;/p&gt;

&lt;p&gt;Thus the Data-point per second calculation is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SciChart: 58.7 x 10M  = Can render 587,000,000 data-points per second&lt;/li&gt;
&lt;li&gt;Competitor A: 2 x 1M = Can render 2Million data-points per second&lt;/li&gt;
&lt;li&gt;Result: SciChart is up to 293.5 x faster for this test case!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test Group 6 was another WPF Chart Type. Competitor A struggled to draw only 10,000 data-points at 1.5 FPS while SciChart was able to draw 10,000,000 (10 Million) datapoints at 58.5 FPS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SciChart: 58.7 x 10M  = Can render 585,000,000 data-points per second&lt;/li&gt;
&lt;li&gt;Competitor A: 1.5 x 10k = Can render 15,000 data-points per second&lt;/li&gt;
&lt;li&gt;Result: SciChart is up to 39,000 x faster for this test case!&lt;/li&gt;
&lt;li&gt;So there you have it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Demanding WPF Chart Performance tests&lt;/a&gt;, SciChart 🥇 was able to outperform ‘Competitor A’ (the 2nd fastest WPF Chart 🥈) by rendering 39,000x more data-points per second in one test case and 293.5x more data-points per second in another test case, by using the Datapoints Per Second methodology above.&lt;/p&gt;

&lt;h2&gt;
  
  
  WPF Chart CPU Usage
&lt;/h2&gt;

&lt;p&gt;CPU usage is also important to our users. What if the chart is the fastest but uses all the CPU resources, making the rest of your application slow?&lt;/p&gt;

&lt;p&gt;SciChart is strictly single threaded for rendering, and while we allow you to append data from a background thread (SciChart WPF is thread safe: we handle the locking &amp;amp; synchronisation), there’s very little parallel processing inside SciChart itself. Instead we favour fastest single-threaded path for code, using low-level optimisations as part of our Visual Xccelerator® Engine typically only found in the gaming industry.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SciChart CPU usage is on average 5% lower&lt;/strong&gt; than competitor A for the 70 WPF Performance test cases we carried out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SciChart CPU usage is a median of 7% lower&lt;/strong&gt; over the test cases carried out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WPF Chart Memory Usage
&lt;/h2&gt;

&lt;p&gt;Memory in a C# .NET application is also very important. What we found in our testing was that SciChart used considerably less memory than Competitor A to achieve it’s record high performance, meaning there is more memory available for the rest of your application.&lt;/p&gt;

&lt;p&gt;At SciChart we’ve optimised not only rendering performance (being fully GPU accelerated), CPU usage (using low-level gaming industry optimization techniques) but also memory making us suitable for the most demanding applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  SciChart: Experts in High Performance Charts &amp;amp; Data Visualization
&lt;/h2&gt;

&lt;p&gt;At SciChart we are experts in our field. I personally hold a Masters Degree (MEng) and PhD in Electronics, covering the topics of electronic hardware design, embedded systems and signal processing. You can see this post on Linked In here with some of the work I’ve done in this field.&lt;/p&gt;

&lt;p&gt;I’ve designed pieces of low-cost electronic measurement hardware which outperformed much more expensive scientific instruments in terms of accuracy. I’ve written algorithms for Fast Fourier Transform on GPUs before the days of nVidia Cuda or OpenCL, have coded several algorithms and hand-tuned the performance of critical sections of C++ &amp;amp; C# code. My team and I understand at a very low level what’s happening on-chip when you process data or perform certain operations in software.&lt;/p&gt;

&lt;p&gt;At SciChart we are a team of low-level software optimisation experts. Our experience spans not just C# .NET and WPF, but also Graphics, GPU acceleration, languages such as C++, Swift, Kotlin, Typescript, multiple 3d libraries such as DirectX, OpenGL/OpenGLES, WebGL, Metal and low level performance optimization techniques used in the gaming industry.&lt;/p&gt;

&lt;p&gt;We’ve transferred that knowledge into SciChart to bring you an incredibly complex piece of software which looks simple on the surface: &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF – The Best (and Fastest) WPF Chart&lt;/a&gt;. All in a package which is easy to use and ‘just works’ out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you need more Performance in WPF Applications with Charts?
&lt;/h2&gt;

&lt;p&gt;If you do find a use-case where SciChart performs less than optimal, &lt;a href="https://www.scichart.com/contact-us/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;then do contact us&lt;/a&gt;. We often have customers reach out with performance issues but it turns out a small tweak in the usage of the library can result in huge performance improvements.&lt;/p&gt;

&lt;p&gt;We’ve also carried out bespoke consultancy work for customers in the F1 sector and Financial services to performance tune their apps. Integrating SciChart to a large or complex app requires sometimes the knowledge from our engineers to get the &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;best possible performance out of the library&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Is WPF Dead? The Data Says Anything But, here’s why</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:45:49 +0000</pubDate>
      <link>https://dev.to/andyb1979/is-wpf-dead-the-data-says-anything-but-heres-why-4mjl</link>
      <guid>https://dev.to/andyb1979/is-wpf-dead-the-data-says-anything-but-heres-why-4mjl</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TLDR: We review the status of Windows Presentation Foundation (WPF) in 2024 and beyond, whether it’s usage is increasing or declining and if this is a good platform to develop on for the long term. We talk about &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;why WPF is still popular for performance or critical apps&lt;/a&gt;, particularly in the scientific, engineering or medical fields, and what alternatives there are for enterprise software development. Plus, our views on the ever changing landscape for desktop or cross-platform application development both now and in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is WPF?
&lt;/h2&gt;

&lt;p&gt;WPF or Windows Presentation Foundation is a graphical framework by Microsoft for building rich interactive and visually appealing desktop applications. WPF has been around since 2006 where it was first introduced as codename ‘Avalon’ in Microsoft .NET Framework v3.0. Since then, WPF has undergone many evolutions and is actively maintained by Microsoft almost 20 years later! Supporting desktop application development on Windows, WPF is dependent on Microsoft .NET and applications can be built in C# or Visual Basic .NET.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF features&lt;/a&gt; a declarative markup language known as XAML, allowing clean separation of View (user-interface) and Model (data). It has many benefits such as rich vector graphics, resolution independence, DirectX hardware acceleration, a powerful data-binding engine and the ability to create entirely custom user interfaces or controls via Templates and Styles.&lt;/p&gt;

&lt;p&gt;Below we will expand on the reasons why WPF continues to be popular, and what the future holds for this platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Alternatives to WPF?
&lt;/h2&gt;

&lt;p&gt;Past &amp;amp; Present alternatives to WPF on the XAML / C# stack in chronological order include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avalonia (2011 – present), an open source platform XAML / C# framework&lt;/li&gt;
&lt;li&gt;Xamarin (2011 – 2024), a Cross-platform XAML / C# application framework for building mobile apps and desktop apps, which will be deprecated this year&lt;/li&gt;
&lt;li&gt;WinRT (2012 – 2015), a Microsoft Windows 8 based replacement for WPF which was ultimately deprecated.&lt;/li&gt;
&lt;li&gt;UWP (2015 – present), a Microsoft Windows 10 based replacement for WPF which is still active, but somewhat superseded by WinUI&lt;/li&gt;
&lt;li&gt;WinUI (2018 – present), a Microsoft Windows 10 based successor to WPF&lt;/li&gt;
&lt;li&gt;MAUI (2022 – present), a Microsoft cross-platform XAML / C# application framework which replaces Xamarin and with a focus on mobile apps&lt;/li&gt;
&lt;li&gt;Avalonia XPF (iii) (2023 – present), a 100% feature compatible replacement for WPF by the Avalonia team which allows &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF applications&lt;/a&gt; to run on Linux and macOS without code changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, there are other cross-platform or desktop frameworks that are not based on C#. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter: A cross-platform Dart framework for building mobile apps&lt;/li&gt;
&lt;li&gt;Qt: C++ based user interface framework for cross-platform applications&lt;/li&gt;
&lt;li&gt;JavaScript / React: Various flavours of JavaScript (or TypeScript) plus React or React Native allow creating cross platform applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is Javascript / React a Viable Alternative to WPF?
&lt;/h2&gt;

&lt;p&gt;This article is primarily focussed on Microsoft or Xaml / C# frameworks, however, let’s cover quickly the topic of whether JavaScript / React is a viable alternative to WPF.&lt;/p&gt;

&lt;p&gt;There are many applications which were developed on &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF&lt;/a&gt; which could be ported to JavaScript. However, there is still a large subset of applications for which WPF is a great choice vs. JavaScript or browser technologies. Those include, applications which require: &lt;br&gt;
_&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native performance&lt;/li&gt;
&lt;li&gt;64-bit memory addressing on the client&lt;/li&gt;
&lt;li&gt;Multi-threading and making use of all cores on the client&lt;/li&gt;
&lt;li&gt;In addition, there are other advantages of &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;developing for WPF&lt;/a&gt;, which are listed below.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the Advantages of WPF?
&lt;/h2&gt;

&lt;p&gt;As a C# based user-interface framework with a long track record of stability and performance, WPF has many advantages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rapid Application Development
&lt;/h3&gt;

&lt;p&gt;One of the reasons &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF continues to be popular&lt;/a&gt;, especially in enterprise and industries is the fact you can click File -&amp;gt; New Project in Visual Studio, write an app, compile it, and deploy it by copying to a shared drive or distribute via clickonce installer. It’s fast &amp;amp; easy.&lt;/p&gt;

&lt;p&gt;Compared to the tech-stack of JavaScript apps where you will need to learn React, Redux, Typescript, HTMl, CSS, Node, Npm, REST, Websockets, a server platform, database platform, plus deploy your application to an environment before it’s available to others, it’s clear to see why rapid prototyping or building of internal tools tends to favour simpler alternatives such as WPF.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mature Toolchain
&lt;/h3&gt;

&lt;p&gt;Tools such as Visual Studio provide a visual designer, hot-reload, visual as well as code debugging.&lt;/p&gt;

&lt;p&gt;Extensions like Resharper, NUnit or MSTest allow creating testable applications, supporting Test-Driven-Development (TDD).&lt;/p&gt;

&lt;p&gt;Finally, third party tools and a rich ecosystem of third party free or paid components &amp;amp; libraries such as charts, graphs, datagrids on NuGet enhance the development experience further.&lt;/p&gt;

&lt;h3&gt;
  
  
  C# is a Great Programming Language
&lt;/h3&gt;

&lt;p&gt;With it’s dependence on C# .NET it is possible to create powerful multi-threaded thick-client or &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;thin-client applications in WPF&lt;/a&gt;, with best practices in software (such as dependency injection, model-view-view-model or MVVM patterns).&lt;/p&gt;

&lt;p&gt;With 64-bit memory addressing in C#, near optimal performance and multi-threading you can build complex and &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;high performing applications in WPF&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Complex &amp;amp; High Performance Desktop Apps
&lt;/h3&gt;

&lt;p&gt;WPF continues to benefit from advancements in the evolution of .NET – allowing client / server applications with Azure Functions (Microsoft’s equivalent to AWS) to be written in the same language. Performance techniques like SIMD and vectorisation are now available in C#. Multi-threading and async/await as we mentioned before, plus C++ interop if you need to integrate to legacy code or high performance code.&lt;/p&gt;

&lt;p&gt;Many users in the scientific, engineering, medical, automotive, motorsports or aerospace industries cannot sacrifice performance, and WPF gives you just that – full access to low level routines which will utilise the most from your CPU / GPU and disk.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Popular is WPF in 2024?
&lt;/h2&gt;

&lt;p&gt;In 2024, WPF continues to be popular for enterprise software development, with some estimates saying there are a half a million to one million actively developed applications worldwide.&lt;/p&gt;

&lt;p&gt;Despite rumours of WPF’s untimely demise, the data shows a different story.&lt;/p&gt;

&lt;p&gt;Below are a few data-points talking about the current state of the platform which shed some light on it’s future.&lt;/p&gt;

&lt;h3&gt;
  
  
  WPF Activity on Github
&lt;/h3&gt;

&lt;p&gt;WPF was partially open sourced by Microsoft in 2018 (ii), and as of today it’s GitHub repository has 6,700 Github stars, 1,100 forks, 142 contributors and over 5,200 commits spanning a 5 year period.&lt;/p&gt;

&lt;p&gt;There are active projects such as Avalonia XPF (iii) which are looking to make &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF into a cross-platform framework&lt;/a&gt;. More on this below.&lt;/p&gt;

&lt;p&gt;Strong support from the community as well as Microsoft means it’s likely that WPF will be here for many years to come.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Trend Searches for WPF vs. WinUI, MAUI
&lt;/h3&gt;

&lt;p&gt;Google Trends (i) is a great tool to estimate the relative popularity of something worldwide and see the search trends over time. On it’s own, in a 5-year time period, there is a slight decline in searches for WPF. However, when compared against search trends for competing platforms such as WinUI, MAUI (Microsoft), Avalonia and Windows Forms, WPF continues to be dominant and show relative strength.&lt;/p&gt;

&lt;h3&gt;
  
  
  Activity for Nuget Packages
&lt;/h3&gt;

&lt;p&gt;Nuget is the package manager for C# libraries including WPF. You can estimate the popularity of WPF vs. other similar frameworks by looking at download trends of popular libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WPF Toolkit&lt;/strong&gt;: a collection of free open source controls on WPF such as a DataGrid, ColorPicker and Charts has almost 12 million downloads (iv), and continues to uptrend.&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%2Ffkrw4v7txu6v8b2ucyb7.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%2Ffkrw4v7txu6v8b2ucyb7.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prism&lt;/strong&gt;: a popular dependency injection framework has libraries for WPF, Windows (UWP), MAUI and Uno. You can see in the download trends (v), Prism.WPF outstrips all the others by a large margin.&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%2Fep3xrizadmymilscbanr.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%2Fep3xrizadmymilscbanr.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oxyplot&lt;/strong&gt;: an open source charting library has implementations for WPF, Windows Forms and Windows (UWP / WinUI). Also here &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF leads the crowd&lt;/a&gt; and has the largest number of downloads by all&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%2F7u194nlz9kp94lhwar7i.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%2F7u194nlz9kp94lhwar7i.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SciChart&lt;/strong&gt;: provides a &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;high performance WPF Chart Control&lt;/a&gt; which was first released in 2012. On NuGet the package has reached 700,000 downloads, and continues to uptrend strongly – quite a lot for a closed-source commercial library!&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%2F7l3667k2t8r1hrd6nsu8.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%2F7l3667k2t8r1hrd6nsu8.png" alt=" " width="768" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Popularity in Enterprise
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In 2024, WPF continues to be popular for enterprise software development, with over some estimates showing a half a million to one million actively developed applications and two million developers worldwide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While not much chatter or excitement for what is no longer a new technology, WPF still has a lot of demand in internal and business-critical applications.&lt;/p&gt;

&lt;p&gt;Anecdotally, several recent posters on a reddit topic about the future of WPF (vii) commented very positive things about the framework:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Basically it is a lot more popular than it appears on the outside. WPF is kind of like Cobol. You won’t see many posts about it, but it’s used quite a lot in enterprise and financial institutions for internal applications and tools.&lt;/p&gt;

&lt;p&gt;We use it a lot in the automation industry – and after years of using it I like it. We have to live with supporting old WinForms here. It is ok but I like WPF more. WPF is in between the old WinForms and currently still buggy MAUI for me (personally)…&lt;/p&gt;

&lt;p&gt;WPF here too, we routinely evaluate alternatives but have never found something that is absolutely better in every way given our requirements.&lt;/p&gt;

&lt;p&gt;I’ve been developing &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF desktop applications&lt;/a&gt; for the last ten years. I can say that WPF is more popular within “traditional” industries like the banking, medical and defence. So if you see yourself in one of those industries WPF (with MVVM) is a good choice.&lt;/p&gt;

&lt;p&gt;Since 2020, I’ve worked on a massive WPF project. If you need to do native windows desktop development, WPF is the best choice in my opinion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What’s the Future of WPF?
&lt;/h2&gt;

&lt;p&gt;As well as alternative Xaml / C# frameworks, there are some exciting developments which may one day become the future of WPF. One of them is Avalonia’s XPF (iii). Brought to you by the Avalonia team, this is a 100% compatible replacement for WPF’s low level code which runs entirely on Linux and macOS as well as Windows. Users have reported being able to re-target a &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF application&lt;/a&gt; using Avalonia XPF and compile / deploy to macOS &amp;amp; Linux in minutes.&lt;/p&gt;

&lt;p&gt;Mobile (iOS / Android) and web browser support is on the roadmap from the XPF team, meaning one day we could see a truly cross-platform version of WPF.&lt;/p&gt;

&lt;p&gt;Cross-platform may be low on many enterprise WPF developers wish-lists however being able to port applications to Linux just be retargetting / recompiling is a huge value-add for organisations that require the highest possible performance, or OEM deployments into embedded systems which require Linux. Plus, by replacing the legacy DirectX9 renderer with OpenGL / Vulkan, Avalonia XPF conveys several advantages and shows a positive evolution in WPF.&lt;/p&gt;

&lt;p&gt;Below here’s a prototype showing &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; running on Linux under Avalonia XPF. Our team has been actively investigating this and cross-compiling our C++ engine to Linux, abstracting all DirectX calls to OpenGL. We hope to make an announcement soon that SciChart will be available on Linux &amp;amp; macOS under XPF, allowing to developers of embedded systems, OEM applications and performance-heavy scientific and medical applications to target this platform.&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%2F4ou56p7fgldkx2vkwd13.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%2F4ou56p7fgldkx2vkwd13.png" alt=" " width="768" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above: SciChart on Linux! Using Avalonia XPF, plus an internal build of our cross-platform engine, we are able to run SciChart’s High Performance 2D &amp;amp; 3D Charts on Linux and macOS&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Is WPF Dead?
&lt;/h3&gt;

&lt;p&gt;Far from being dead, we believe WPF will be here for years to come. Here are the key reasons why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WPF has stood the test of time and is still active in enterprise software development 18 years after first release&lt;/li&gt;
&lt;li&gt;It continues to be compatible with the latest versions of Windows and no sign this will change.&lt;/li&gt;
&lt;li&gt;WPF is now open source, and has an active Github repository with hundreds of contributors, thousands of stars&lt;/li&gt;
&lt;li&gt;Google Trends and NuGet data show &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF packages&lt;/a&gt; continues to outpace alternatives in the C# / XAML space such as MAUI / WinUI&lt;/li&gt;
&lt;li&gt;Exciting projects such as Avalonia XPF extend the lifespan of existing WPF apps, allowing them to target multi platforms such as macOS and Linux and in future, iOS / Android / Browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finally, Our Roadmap
&lt;/h2&gt;

&lt;p&gt;We are making steps now to make the SciChart library platform agnostic and as a first step, will be releasing a version of SciChart to support Avalonia XPF soon.&lt;/p&gt;

&lt;p&gt;This will be a drop-in replacement, allowing applications which used &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; to ‘Just Work’ on Linux or macOS without code changes. We’re excited about this step in our evolution as a large proportion of our customers build for embedded devices, OEM systems or require the highest possible performance – which Linux helps to provide.&lt;/p&gt;

&lt;p&gt;From a commercial point of view we are personally yet to see the demand for platforms such as WinUI or MAUI to match or replace WPF, however we are monitoring the situation closely. We are considering ways to make our technology available to more C# / XAML frameworks.&lt;/p&gt;

&lt;p&gt;As a whole, we continued to be excited about XAML / C# based frameworks. We see a bright future in scientific, engineering and financial software which require the highest possible performance and will be continuing to invest in them.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Running SciChart WPF on Linux? It’s possible, here’s how</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:37:18 +0000</pubDate>
      <link>https://dev.to/andyb1979/running-scichart-wpf-on-linux-its-possible-heres-how-2ao5</link>
      <guid>https://dev.to/andyb1979/running-scichart-wpf-on-linux-its-possible-heres-how-2ao5</guid>
      <description>&lt;p&gt;Over the years the question has cropped up many times “Can you run SciChart on Linux?”&lt;/p&gt;

&lt;p&gt;SciChart – a cross platform chart library with implementations for Windows Presentation Foundation (&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF&lt;/a&gt;), JavaScript, as well as native iOS (Swift/Objective-C) and Android (Java/Kotlin) is based on a proprietary C++ rendering engine codenamed Visual Xccelerator®. This provides the speed, performance that SciChart is well known for, but also a secondary benefit is this engine brings a single shared codebase across platforms for drawing high performance scientific, financial &amp;amp; medical charts &amp;amp; graphs with hardware acceleration in DirectX, OpenGL, Metal and WebGL.&lt;/p&gt;

&lt;p&gt;As of yet, there is no pure C++ version of SciChart that could run in say, Qt, however, we have been making steps towards Linux support for SciChart.&lt;/p&gt;

&lt;p&gt;Read on to learn how…&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SciChart on Linux?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF applications&lt;/a&gt; are typically Windows applications, as they require Microsoft .NET and the Windows Presentation Foundation to run. However, a subset of extremely demanding scientific, financial or medical applications require charts that run on Linux. This could be for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedded systems&lt;/li&gt;
&lt;li&gt;Custom portable hardware&lt;/li&gt;
&lt;li&gt;Electronic test equipment&lt;/li&gt;
&lt;li&gt;Radio Frequency or Spectrum Analyzers&lt;/li&gt;
&lt;li&gt;Oscilloscopes&lt;/li&gt;
&lt;li&gt;Terminals or kiosks in factories, industrial processes or oil rigs&lt;/li&gt;
&lt;li&gt;Maritime vessel instrumentation&lt;/li&gt;
&lt;li&gt;Aircraft instrumentation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;By running Linux on an embedded system the cost basis goes down significantly for manufacturers of embedded devices, who won’t have to pay for a Windows license.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In addition, the RTOS (real time operating system) nature of Linux makes it perfect for high performance, critical embedded systems which require high performance, big-data or real-time charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can WPF Run on Linux?
&lt;/h2&gt;

&lt;p&gt;Microsoft introduced .NET Core in 2014, later superseded by .NET, which aimed to be a cross platform implementation of the .NET Framework. It’s no secret that C# code and .NET has been able to run on Linux (and macOS) for many years, but what about WPF?&lt;/p&gt;

&lt;p&gt;According to Microsoft official sources, WPF is only for Windows, as this part of the framework was not ported over to Linux. However, the geniuses at Avalonia have actually achieved something astonishing: they’ve managed to make a completely cross platform framework called Avalonia XPF, a version of the Windows Presentation Foundation that runs using OpenGL instead of DirectX.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Avalonia XPF?
&lt;/h2&gt;

&lt;p&gt;Avalonia XPF is a proprietary, cross-platform implementation of Windows Presentation Foundation (WPF) brought to you by the developers of Avalonia UI. This enables full &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF compatibility&lt;/a&gt; of legacy and existing applications but allows them to run on Windows, Linux and macOS. It achieves this by substituting the DirectX and MilCore Windows specific functions and routines in WPF for equivalents in OpenGL and C++. The result is, &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;existing WPF applications&lt;/a&gt; can be ported to run on Linux, often without any code change and in minutes.&lt;/p&gt;

&lt;p&gt;It can’t be stressed enough what an enormous timesaver this is for teams who have large existing &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF applications&lt;/a&gt; that want to target multiple platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing SciChart for Avalonia XPF
&lt;/h2&gt;

&lt;p&gt;SciChart has been working with the Avalonia team for some time, to bring you an Avalonia XPF compatible version of &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; that will run on Linux.&lt;/p&gt;

&lt;p&gt;Here’s what we’ve done / how we’ve done it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our C++ Visual Xccelerator® engine has been retargeted to Linux and is compiled using CMake&lt;/li&gt;
&lt;li&gt;We’ve swapped out all the DirectX rendering in SciChart, for dynamic choosing of DirectX or OpenGL depending on platform.&lt;/li&gt;
&lt;li&gt;We’ve built a side-by side solution for &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF&lt;/a&gt; that will run targeting Avalonia XPF, as well as the existing .NET Framework, .NET 6,7,8 etc…&lt;/li&gt;
&lt;li&gt;The examples app &amp;amp; demos have all been tested in the new environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to state we had to make almost no code changes to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF itself&lt;/a&gt;, and no changes to the API. This is a fully 100% compatible version of SciChart that just magically works on Linux, when targetting Avalonia XPF.&lt;/p&gt;

&lt;h2&gt;
  
  
  Early Preview – SciChart for XPF on Linux
&lt;/h2&gt;

&lt;p&gt;Below, here’s a video of SciChart for Avalonia XPF running on Linux.&lt;/p&gt;

&lt;p&gt;We’re using Visual Studio Code to compile the examples / demo application, and run a number of examples inside an Ubuntu VM.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s important to note this is the exact same code, and API as &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF for Windows&lt;/a&gt;, meaning your Windows applications will be compatible and able to run on Linux when targeting Avalonia XPF.&lt;/p&gt;
&lt;/blockquote&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%2Fujwd8a59q904h3lhgquu.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%2Fujwd8a59q904h3lhgquu.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first demo is the Spectrogram (Spectrum Analyzer) demo, showing the real-time capabilities of SciChart for real-time charts on Linux, followed by the ECG Monitor demo, a real-time medical vital signs monitor.&lt;/p&gt;

&lt;p&gt;We then showcase the Digital Analyzer Performance demo – a big data demo which loads multiple channels of digital data each with millions (or even hundreds of millions) of data-points. Useful for creating Logic Analyzer hardware.&lt;/p&gt;

&lt;p&gt;At the time of writing, all the 2D examples have been enabled. 3D charts and examples also work however we have one or two bugs to work out before releasing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beta Version
&lt;/h2&gt;

&lt;p&gt;A BETA version of SciChart for Avalonia XPF, with 100% compatible code and API to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF will be available soon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We’re going to be publishing a BETA with the demos example application that you can run on both Windows and Linux under the Avalonia XPF framework.&lt;/p&gt;

&lt;p&gt;Pricing and Licensing is to be announced, but during the BETA phase we will be making long-term trials available to customers of &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF in order to try out&lt;/a&gt; and provide feedback.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How is Oil and Gas Wellsite Data Visualized?</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:33:36 +0000</pubDate>
      <link>https://dev.to/andyb1979/how-is-oil-and-gas-wellsite-data-visualized-7e5</link>
      <guid>https://dev.to/andyb1979/how-is-oil-and-gas-wellsite-data-visualized-7e5</guid>
      <description>&lt;p&gt;Visualizing wellsite data is highly complex due to the high volume and variety of data. Diverse data sources need to be visualized concurrently and often in real-time to enable rapid decision-making in safety-critical settings. With vast data sets accrued from multiple locations in varying time frames, visualization helps analysts interpret this complex data.&lt;/p&gt;

&lt;p&gt;This guide explores the available coding languages and devices, as well as specific examples of charts and the types of data and metrics they can display to help data scientists and decision-makers work together to make profit-based decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Language and Platform Should You Use?
&lt;/h2&gt;

&lt;p&gt;The programming language and platform you want to use depends on the specific use case. Data sets can be processed and displayed using high-performance charting solutions on &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF &lt;/a&gt;and &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;—both allow installations on common hardware. &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Benefits of JavaScript&lt;/a&gt; include its versatility as a browser-based solution as well as a remote device solution, meaning custom, embedded or web-based deployments can be leveraged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF &lt;/a&gt;however, has advantages out of the box for performance, but a smaller number of developers compared to JavaScript. In another blog, we explore whether WPF is dead (it’s not!) and the &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;performance capabilities of JavaScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Accessing through hand-held devices is important for a field test engineer who may need a portable device that can sync with a JavaScript version of the oil and gas data dashboards.&lt;/p&gt;

&lt;p&gt;It can be complicated to choose which one is right—there are performance &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;benefits to using WPF&lt;/a&gt;, but &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript is more flexible and versatile&lt;/a&gt;. However, both are viable with the correct data visualization solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Visualizations for Wellsites
&lt;/h2&gt;

&lt;p&gt;The data visualizations for wellsites outlined in this guide help decision-makers identify trends, anomalies, and insights that contribute to a healthy, safe, compliant, productive and profitable management of an oil or gas wellsite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time Series Charts
&lt;/h2&gt;

&lt;p&gt;Time series charts show trends or numerical values over time. Line charts and strip charts, in particular, are commonly used to provide real-time insights and historical data analysis, making them invaluable for understanding changes in operational metrics and identifying patterns.&lt;/p&gt;

&lt;p&gt;Line charts visualize changes in data over time, such as drilling depth, pressure, flow rates and temperature. Often in complex dashboards with multiple parameters, these are plotted on the same chart surface for comparative analysis, requiring annotations, overlays and trend lines.&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%2F9culwey70bokl2e98fhb.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%2F9culwey70bokl2e98fhb.png" alt=" " width="758" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strip charts are used in real-time monitoring to display data trends in drilling rate or mud weight over time, with the ability to zoom and pan through time periods from extensive time-series data sets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wellbore Schematics
&lt;/h2&gt;

&lt;p&gt;Wellbore schematics provide a visual representation of the downhole installation, including equipment and components, as well as tracking information on the history of the wellsite. These schematics track the history of the wellsite, providing a detailed overview of the well’s structure over time. By keeping accurate and up-to-date schematics, operators can easily reference past work and make informed decisions about future operations and maintenance work.&lt;/p&gt;

&lt;p&gt;Vertical wellbore diagrams show casing strings, tubing and associated downhole equipment to see the well’s structure and completion design. With the inclusion of DAS and DTS, these diagrams can display real-time data or include other customized overlays.&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%2Fqu78key5q906z526spri.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%2Fqu78key5q906z526spri.png" alt=" " width="751" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deviation plots show the deviation of the wellbore from vertical and are used in direction drilling and dashboards alongside wellbore diagrams. This data visualization offers a complete view of the well’s orientation and structure.&lt;/p&gt;

&lt;p&gt;This combination of tools helps operators avoid potential hazards, reach target formations more efficiently, and optimize the drilling process.&lt;/p&gt;

&lt;h2&gt;
  
  
  3D Wellbore and Reservation Models
&lt;/h2&gt;

&lt;p&gt;3D wellbore and reservoir models show the well path, geological formations and surrounding area, including porosity, permeability, fluid saturations and other properties. Typically, this includes Isosurfaces with 3D contours to represent various properties, e.g., specific pressure or saturation level, color coding or further overlaid data depending on requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Geological and Geophysical Visualizations
&lt;/h2&gt;

&lt;p&gt;Modelling geologic structures and formations helps decision-makers better understand the subsurface environment, improve drilling accuracy, and maximize the potential of both current and future wellbores.&lt;/p&gt;

&lt;p&gt;Accurate log plots are designed to align drilling operations with the geological reality of the site. Displaying geophysical data along the depth of the well, resistivity, gamma ray, and porosity logs are shown side by side, allowing operators to identify distinct formation layers and fluid contacts.&lt;/p&gt;

&lt;p&gt;This type of visualization helps interpret the rock and fluid properties of the subsurface, supporting decision-makers with their strategic placement of wellbore sections, casing points, and production intervals.&lt;/p&gt;

&lt;p&gt;Mapped through seismic data, cross-sections display two-dimensional slices of the subsurface, which show faults, well paths, and other structural features. They help decision-makers and engineers understand the spatial relationship between various geologic features and the wellbore.&lt;/p&gt;

&lt;p&gt;These visualizations support the planning process for directional drilling, ensuring that well trajectories avoid problematic areas, such as fault zones. Not just a way to avoid problematic areas, it can also make targeting productive formations easier, supporting profitable oil and gas exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mapping and Spatial Analysis
&lt;/h2&gt;

&lt;p&gt;If you want to optimize extraction and delivery processes at your wellsite, mapping and spatial analysis charts could be one way to achieve that. This includes heat maps and contour maps. By better understanding spatial relationships between geological features and environmental conditions, decision-makers can make informed choices about factors such as the placement of the well.&lt;/p&gt;

&lt;p&gt;Heat maps show the distribution of temperature, pressure or production rates across a wellsite or reservoir. Operators can quickly identify high or low-performing areas and make operational adjustments to enhance productivity. For instance, a heat map illustrating pressure changes can help pinpoint regions where additional interventions may be needed to maintain optimal extraction rates.&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%2F1rfqb6gbfedgcmk133kf.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%2F1rfqb6gbfedgcmk133kf.png" alt=" " width="752" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contour maps feature contoured lines that indicate areas of equal values. By plotting contour lines, these maps enable operators to visualize gradients and identify trends across a site. The data visualization can illustrate geological areas of equal pressure, elevation, or thickness. This information is invaluable for understanding the subsurface geology, planning well trajectories, and making adjustments to drilling techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production and Performance Charts
&lt;/h2&gt;

&lt;p&gt;Initial production (IP) and cumulative production rank well performance data and offer comparisons to predict future reserve output. By analyzing IP and cumulative production, decision-makers can make informed choices about resource allocation, drilling priorities, and long-term field development.&lt;/p&gt;

&lt;p&gt;Production decline curves show production rates over time to estimate reserve production. Meanwhile, performance plots compare actual production of drilling against targets or models to highlight deviation and opportunity for optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety and Environmental Monitoring
&lt;/h2&gt;

&lt;p&gt;Safety and environmental monitoring provides metrics and alerts relating to emissions and health and safety incidents. Collectively, these charts enable proactive management of safety risks and environmental concerns, which are key to maintaining regulatory compliance and avoiding costly incidents.&lt;/p&gt;

&lt;p&gt;But what options are available?&lt;/p&gt;

&lt;p&gt;Alarm histograms help identify patterns in safety incidents and overlay into other analysis. They visually represent the frequency and timing of incidents, helping operators pinpoint recurring issues or areas of concern.&lt;/p&gt;

&lt;p&gt;Meanwhile, environmental monitoring dashboards provide real-time display of emission data and spills, with alerts for compliance. Alerts for regulatory breaches, such as exceeding allowable emissions levels, facilitate prompt corrective actions to prevent environmental harm and potential legal penalties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Statistical Visualizations
&lt;/h2&gt;

&lt;p&gt;Statistical visualizations make data more palatable and actionable. Insights collected can be more easily communicated with stakeholders and decision-makers to help showcase areas for improvement.&lt;/p&gt;

&lt;p&gt;Histograms and bar charts show the distribution of data, such as frequency of pressure ranges or rate-of-penetration (ROP) values. Understanding the distribution of parameters like pressure can be critical for ensuring the wellbore’s structural integrity. For example, a histogram can be used to display the frequency of different pressure levels encountered during drilling, which can help identify potential challenges or anomalies.&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%2Fgnd6ypj8tl12wjg8g4bl.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%2Fgnd6ypj8tl12wjg8g4bl.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scatter plots visualize relationships between different variables. As an example, a scatter plot of ROP vs. pressure could reveal that drilling speeds are lower at higher pressures, suggesting that adjustments to the drilling fluid composition or bit type might be necessary to maintain optimal performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive Data Exploration Tools
&lt;/h2&gt;

&lt;p&gt;Digital twins and multivariate analysis tools to explore relationships between multiple variables simultaneously or compare virtual models of the same wellsite.&lt;/p&gt;

&lt;p&gt;Interactive dashboards cater to multiple stakeholders, often onsite and remote, interactive dashboard visualizations are compiled to get real-time and in-review analysis. Software UIs need to permit manipulation of chart surfaces, legends, tooltips, on-click behaviour and selective synchronization across surfaces.&lt;/p&gt;

&lt;p&gt;Vertical wellsite depictions require synchronized and asynchronized zooming and panning on toggle, while all data needs to be monitored carefully, without failure due to data rates, and with precision to enable real-time decision-making in a safety-critical setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create All These and More with SciChart’s Cross-Platform Charting Software
&lt;/h2&gt;

&lt;p&gt;The benefits of choosing high-performance, big data software from SciChart is that you can build out across &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF&lt;/a&gt;, mobile android and &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript &lt;/a&gt;as it’s cross-platform compatible.&lt;/p&gt;

&lt;p&gt;Other charting solutions struggle to support the big data requirements in the scientific niches. Using standard tools will make you the same as everyone else on the market. To unlock new metrics and overlays that contribute to enhanced profitability, you need the customisation levels that SciChart has to offer with their oil and gas data dashboards.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WPF vs. JavaScript: Which Is Best for Your Charting Project?</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:29:44 +0000</pubDate>
      <link>https://dev.to/andyb1979/wpf-vs-javascript-which-is-best-for-your-charting-project-17p1</link>
      <guid>https://dev.to/andyb1979/wpf-vs-javascript-which-is-best-for-your-charting-project-17p1</guid>
      <description>&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Windows Presentation Foundation (WPF)&lt;/a&gt; and &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript (JS)&lt;/a&gt; are popular framework and language options for developing client applications with user interfaces, but they offer distinct advantages and limitations that can impact your decision-making process. Choosing the right technology for your new data visualization or charting project can make a significant difference in both the development process and the final product’s performance. &lt;/p&gt;

&lt;p&gt;If the buck stops with you on deciding whether to use &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF &lt;/a&gt;or JavaScript, you’ll want to feel confident in your choice and justify it to the team and stakeholders. You’ll want to know what the wider community thinks, while separating the myths from the facts. Even better, it would help if you had access to data and case studies to demonstrate the effectiveness of one framework over the other. &lt;/p&gt;

&lt;p&gt;Ultimately, you want to say a project generated optimum results, and savvy research and decisions from the offset can help make that happen. This guide is one piece of the giant jigsaw puzzle of getting your data to work for your organization in the most efficient way possible. While JavaScript is taking a bold stand as a popular language to build impressive dashboards of charts, we’re looking at &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;why WPF can be more powerful&lt;/a&gt; than JavaScript, particularly in high-performance, data-intensive applications, and where JavaScript may fall short. &lt;/p&gt;

&lt;p&gt;There are some rumours in the technical community that WPF may be phased out, but this is far from true, and we covered this in detail in our article: Is WPF Dead? In fact, it’s estimated that there are around one million actively &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;developed WPF applications worldwide&lt;/a&gt;, suggesting that WPF isn’t going anywhere anytime soon. &lt;/p&gt;

&lt;h2&gt;
  
  
  Support Ecosystem and Documentation
&lt;/h2&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%2Fs94k1j68ed7ghp6c2umq.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%2Fs94k1j68ed7ghp6c2umq.png" alt=" " width="512" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When choosing a development framework, your developers want access to comprehensive documentation, examples, and support. WPF, a mature and well-established framework, boasts an extensive collection of resources.&lt;/p&gt;

&lt;p&gt;Microsoft’s official documentation, along with community-driven platforms like GitHub and Stack Overflow, provides developers with numerous reference points and practical insights. However, for the most up-to-date, comprehensive and easily accessible documentation, that’s where partnering with experts in &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF charts&lt;/a&gt; makes all the difference. It’s about getting the right support for your project to ensure your team members are aligned and up-to-speed with the best practices that get results. &lt;/p&gt;

&lt;p&gt;SciChart’s leading WPF charting library also offers extensive technical support, training materials and documentation. And yes, we ease the onboarding process for new team members! We offer hundreds of code examples, thousands of forum questions, and hundreds of documentation, including tutorials on how to add annotations, cursors, and code for building chart series.&lt;/p&gt;

&lt;p&gt;In contrast, &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;, particularly when used with open-source chart libraries, may lack this level of support. While there is a large community of JavaScript developers, the quality and consistency of documentation can vary significantly, potentially leading to longer development times and higher costs due to the need for additional troubleshooting and support. &lt;/p&gt;

&lt;p&gt;Check out our series of articles on alternatives to popular &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript Chart libraries&lt;/a&gt;, which highlight the pros and cons of open source data visualization, such as Chart.js and D3.js. &lt;/p&gt;

&lt;p&gt;Good documentation is only one consideration among many as to why you’d choose &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF &lt;/a&gt;over JavaScript, which we explore in the remainder of this article. &lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&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%2Fpzjys2lthxvd1ql10n12.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%2Fpzjys2lthxvd1ql10n12.png" alt=" " width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Performance is a key differentiator between WPF and &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript applications&lt;/a&gt;. This is particularly true for applications that require extreme performance and efficient data handling. But which one comes out on top for performance, and why?&lt;/p&gt;

&lt;p&gt;As a native desktop framework, &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF offers unparalleled advantages&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;It allows direct access to low-level hardware acceleration, such as GPU (graphics processing unit) via DirectX, and vectorization, which are crucial for rendering complex visualizations quickly and efficiently. Meanwhile, JavaScript has some access to the GPU via WebGL but no direct hardware access, introducing some overhead compared to desktop applications such as WPF.&lt;br&gt;
&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF applications allow 64-bit memory addressing&lt;/a&gt;, allowing them to handle large volumes of data with minimal overhead, making them ideal for data-intensive tasks, such as real-time stock market applications or scientific simulations. In comparison, JavaScript has a limit of 4GB in the Chrome browser, and memory may be limited to 2GB for your client applications.&lt;br&gt;
Multi-threading and use of multiple CPU cores (parallel processing) can only be done in desktop applications, such as &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF&lt;/a&gt;, as &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript applications&lt;/a&gt; are typically limited to a single thread. &lt;br&gt;
On the other hand, JavaScript, despite its versatility and widespread use in web applications, faces inherent limitations due to the browser environment. The data transfer bottlenecks and rendering constraints within a browser can significantly impact performance, especially for applications requiring high-speed data processing. While memory limits are core issues, SciChart offers workarounds for these, no matter which supported framework or language you choose for your application. &lt;/p&gt;

&lt;p&gt;While &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript frameworks&lt;/a&gt; can be optimized to some extent, they often cannot match the efficiency and speed of native &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF applications&lt;/a&gt;. For example, real-time F1 Pit Strategy Management software built with JavaScript can experience lag or slower data processing, whereas, a &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF-based platform&lt;/a&gt; can handle the data throughput more effectively. In fact, to talk numbers, WPF can render tens of billions of data points with ease, compared to tens of millions for &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;. 10 million is still impressive, but simply doesn’t quite live up to the data possibilities that WPF has to offer. &lt;/p&gt;

&lt;p&gt;WPF is ideal for building complex, high-performance desktop applications that require close integration with the underlying operating system and hardware. Industries such as medical imaging, financial modeling, and scientific simulations benefit from &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF’s ability to utilize low-level routines&lt;/a&gt; for optimal CPU, GPU, and disk performance. Limited by the browser sandbox, JavaScript cannot provide the same level of control or efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Resources and Long-Term Costs
&lt;/h2&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%2Fqmuxzigt9yxhavkacast.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%2Fqmuxzigt9yxhavkacast.png" alt=" " width="600" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re a product owner or team lead, the availability and cost of developer resources may well sway your decision when choosing between WPF and JavaScript.&lt;/p&gt;

&lt;p&gt;JavaScript developers are more abundant and cheaper to hire, and for that reason it may be a better choice. However, some projects can only be done with WPF, including those with the highest performance needs. WPF also provides more rapid prototyping due to its simpler Microsoft technology stack, especially if you have in-house engineers with C# experience.&lt;/p&gt;

&lt;p&gt;Developing complex, high-performance applications in JavaScript can require more time and resources, leading to higher long-term costs. Additionally, the learning curve for transitioning between technologies should not be underestimated. &lt;/p&gt;

&lt;p&gt;WPF developers can leverage the extensive documentation and support ecosystem to maintain and expand applications more efficiently, potentially leading to better long-term outcomes. It’s fast and easy. In fact, it’s possible to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;create a WPF chart&lt;/a&gt; with a clickonce installer, compared to JS which comes with a mountain of tech stack and proficient knowledge in React, Typescript, HTML, and much more. That takes years of training, and developers with this skill set are likely to charge more (and we’re not blaming them). But it’s something to bear in mind. &lt;/p&gt;

&lt;p&gt;Conversely, hiring a seasoned JavaScript developer and training them on WPF might yield better long-term results than continuously dealing with &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript’s performance&lt;/a&gt; limitations. &lt;/p&gt;

&lt;p&gt;This approach not only ensures the application meets performance expectations, but also reduces the need for constant troubleshooting and optimization, which can be both time-consuming and costly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote Possibilities
&lt;/h2&gt;

&lt;p&gt;WPF previously needed to be processed through a desktop application, a potentially restrictive way to visualize data. After all, the modern world of work often requires remote access to information through a portable device—something that JavaScript seamlessly enables. A field test engineer, for instance, may want to sync the content to a portable device. However, with the advent of Avalonia XPF and Scichart’s support for this, &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF apps are now cross-platform&lt;/a&gt;. This means a WPF app can be developed for Windows and Linux.&lt;/p&gt;

&lt;p&gt;If you require native performance, 64-bit memory, or multi-threading, WPF is typically recommended over JavaScript.&lt;/p&gt;

&lt;p&gt;That being said, with the right software provider and pre-processing data planning, you can port &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF charts&lt;/a&gt; into JavaScript. SciChart is a cross-platform solution that lets you work with the optimum charting language for each specific application you require it for. We’ve made SciChart for &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript charting&lt;/a&gt; as optimal as possible, using WebGL and WebAssembly to get near desktop performance levels. This allows our users to create medical devices, measure rocket telemetry, or even manage Formula One cars using &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript dashboards&lt;/a&gt;. Between 2011 and 2020, we increased our &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF chart controls&lt;/a&gt; from 20,000 data points to 10 billion data points, significantly improving the possibilities for our users. Likewise, our &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript chart controls&lt;/a&gt; reach millions of data points without slowdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Is the Verdict?
&lt;/h2&gt;

&lt;p&gt;We’ve offered our insights, but it’s important to weigh up the strengths and weaknesses of &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF &lt;/a&gt;and JavaScript for yourself. &lt;/p&gt;

&lt;p&gt;WPF offers a robust support ecosystem, superior performance capabilities, and long-term cost-effectiveness, making it an ideal choice for high-performance, data-intensive applications. &lt;/p&gt;

&lt;p&gt;In contrast, while JavaScript may seem more accessible due to its widespread use and lower initial costs, it may fall short in delivering the performance and efficiency required for complex applications.&lt;/p&gt;

&lt;p&gt;Ultimately, the decision should be based on a comprehensive understanding of your project’s specific needs and the technological capabilities of each framework. By carefully considering these factors, you can make an informed choice that aligns with your project’s goals and ensures long-term success.&lt;/p&gt;

&lt;p&gt;Reluctant to commit to a single solution for your data visualization projects? SciChart offers both WPF and &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript charts&lt;/a&gt;, and we are the only native cross-platform library that works across WPF, JavaScript, iOS, and Android. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Showcase of the Best WPF Charts and Graphs Demos</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:25:07 +0000</pubDate>
      <link>https://dev.to/andyb1979/showcase-of-the-best-wpf-charts-and-graphs-demos-3lok</link>
      <guid>https://dev.to/andyb1979/showcase-of-the-best-wpf-charts-and-graphs-demos-3lok</guid>
      <description>&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Charts&lt;/a&gt; are indispensable for visualizing and interacting with big data sets, especially in industries where performance, precision, and customization are critical. The &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF framework&lt;/a&gt; is a preferred choice for developing bespoke, complex applications in engineering, scientific research, medical fields, and other domains requiring high-performance data visualizations.&lt;/p&gt;

&lt;p&gt;A well-designed &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Chart Library&lt;/a&gt; does more than display data—it empowers developers to create dynamic, intuitive dashboards in C# .NET and MVVM, tailored to handle the complexities of real-time analytics and actionable insights. These libraries enable the development of custom solutions, perfect for meeting the unique demands of specialized applications.&lt;/p&gt;

&lt;p&gt;Whether you’re monitoring financial markets, monitoring patient health, managing industrial operations, or building dashboards for power stations, &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF Charts&lt;/a&gt; offer the flexibility and power needed to bring intricate data to life. Their combination of performance, adaptability, and ease of use makes them the go-to choice for professionals tackling complex, data-heavy challenges.&lt;/p&gt;

&lt;p&gt;In this guide, we explore the &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;best WPF Charts and Graphs&lt;/a&gt; that stand out in the realm of .NET development, demonstrating how they can transform dense big data into captivating and informative visual narratives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore our &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Advanced WPF Charts &amp;amp; Graphs Examples&lt;/a&gt; for Various Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Realtime WPF Audio/Spectrum Analyzer Demo
&lt;/h3&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%2F9d7civk5s0q801e9ep1w.jpg" 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%2F9d7civk5s0q801e9ep1w.jpg" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Spectrogram Demo shows how to mix a 2D line chart showing a Fast Fourier Transform (FFI) of a waveform, and also show a spectrogram (scrolling heatmap) of the same data. The scrolling heatmap is achieved using a SciChartSurface with a FastHeatMapRenderableSeries and by updating the data on a Heatmap2DArrayData Series. The result is a smooth 30FPS scrolling heatmap, allowing you to visually inspect your spectrum data. &lt;/p&gt;

&lt;h3&gt;
  
  
  Big-Data 1-Billion Datapoint WPF Chart Demo
&lt;/h3&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%2F3ckvqdz8w2c0lcj74bny.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%2F3ckvqdz8w2c0lcj74bny.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fifo 1 Billion Points Demo
&lt;/h3&gt;

&lt;p&gt;Our 1 billion points demo showcases the incredible performance when rendering streaming (scrolling) line charts. It showcases that SciChart is capable of rendering 1 billion (1,000,000,000) points in real-time at 60 fps.&lt;/p&gt;

&lt;p&gt;From real-time monitoring to visualizing the output of telemetry sensors, this chart renders huge data sets with speed and precision. Leveraging the FIFO series, the chart automatically discards old data points once a predefined number of points is met. This type of data series is extremely efficient for scrolling charts, where you do not care about discarded (off-screen) data.&lt;/p&gt;

&lt;p&gt;This demo is possible due to our newly introduced Visual Xccelerator(TM) engine, a completely in-house, proprietary, cross-platform C++ game engine, fully GPU-accelerated using pixel and vertex shaders, which we’ve built layers on top of to create 2D/D charts. With the &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart WPF Xccelerated Edition&lt;/a&gt;, you can achieve up to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;100x Faster WPF Charts&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Digital Logic Analyzer Demo
&lt;/h3&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%2Fnk31ft5q04w4if93st8o.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%2Fnk31ft5q04w4if93st8o.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digital Logic Analyzer in WPF - big data charts, high performance with interactive zooming, panning and scrolling&lt;/p&gt;

&lt;p&gt;The WPF Digital Logic Analyzer Demo captures and displays multiple signals from a piece of hardware, such as a Data Acquisition Card or Logic Analyzer. &lt;/p&gt;

&lt;p&gt;In the above example, you can see multiple channels with randomly generated binary data with a common XAxis. It is implemented using the MVVM pattern to display multi-surface pane rendering FastLineRenderableSeries that use UniformXyDataSeries as a data source. &lt;/p&gt;

&lt;p&gt;Requiring Y-Values only, this DataSeries type reduces memory consumption. &lt;/p&gt;

&lt;p&gt;With all this in mind, it is possible to display tens of billions of points on a single view. This specific demo loads up to 64 billion data points with 64GB RAM. 100 billion data points are also possible with 128GB of RAM.&lt;/p&gt;

&lt;p&gt;ChartModifiers also provide interactivity to create a more engaging chart experience. We support the following interactions, and much more besides:&lt;/p&gt;

&lt;p&gt;[CTRL + MouseWheel] to scroll channels up and down&lt;br&gt;
[SHIFT + MouseWheel] to change the height of channels&lt;br&gt;
[Mousewheel) to zoom channels data in and out&lt;/p&gt;

&lt;h3&gt;
  
  
  Vital Signs ECG/EKG Patient Monitor Demo
&lt;/h3&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%2Ftsx4iq5gaang45tlnua5.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%2Ftsx4iq5gaang45tlnua5.png" alt=" " width="768" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this WPF vital signs ECG/EKG monitor demo, you can see how the Line Series is used to draw real-time FIFO data for use in a medical context. The example simulates four channels that enable health professionals to monitor heart rate, body temperature, blood pressure, pulse, SP02 blood oxygen and volumetric flow simultaneously in one real-time ECG/EKG data visualization.&lt;/p&gt;

&lt;p&gt;SciChart provides the shortcuts your development team needs, providing rich, real-time, high performance and reliable charts for medical and healthcare applications. There is also the Scatter Series used for a single point at the beginning of the lines. The fading effect is achieved with the Palette Provider API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building WPF Charts with MVVM
&lt;/h3&gt;

&lt;p&gt;If you want to improve code reuse opportunities across your application and create a clean distinction between your user interface and application logic, you may prefer to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;build your WPF charts&lt;/a&gt; with MVVM. SciChart has specific demos for this, including examples of how to bind multiple charts and add a zoom history function.&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%2Fskvuq2wk4fnvlybkom5p.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%2Fskvuq2wk4fnvlybkom5p.png" alt=" " width="768" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above demo demonstrates how to undo/redo Zoom and Pan (Zoom History) by using the ZoomHistoryManager type in an MVM application. The ZoomHistoryManager is attached to the chart via the SciChartSurface.Z.comHistoryManager property.&lt;/p&gt;

&lt;p&gt;All zoom and pan operations then become tracked, and you can undo or redo the zoom function via the ZoomHistoryManager.Undo and ZoomHistoryManager.Redo methods.&lt;/p&gt;

&lt;p&gt;In MVM applications, you can also bind to and execute the ZoomHistoryManager.UndoCommand and ZoomHistoryManager.RedoCommand.&lt;/p&gt;

&lt;h3&gt;
  
  
  WPF Chart Types
&lt;/h3&gt;

&lt;p&gt;With 35 2D and 15 3D WPF charts, SciChart doesn’t just support out-of-the-box graphs but also enables endless customizations so you can visualize large data sets however you want. &lt;/p&gt;

&lt;p&gt;A &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;WPF animation API&lt;/a&gt; and interactive chart applications let you create engaging visuals that help the end user glean the information they require. It’s all about making data accessible and visually appealing without draining your development resources. &lt;/p&gt;

&lt;p&gt;SciChart’s easy-to-use interface and guides ensure developers have all the tools they need to &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;get started and produce the best WPF charts&lt;/a&gt; and graphs quickly and efficiently. We have hundreds of forums and documentation to help developers of any level &lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;build the best WPF charts and graphs&lt;/a&gt; with ease.  &lt;/p&gt;

&lt;p&gt;You’ll also have access to a theme manager for styling changes and a powerful annotations API, helping you present data in the most effective way for your business, stakeholders, and end users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Uses SciChart?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/wpf-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart’s fully customizable WPF Charts&lt;/a&gt; are used by investment banks, space agencies, top Formula 1 teams and companies in the tech, medical, engineering, electrical, and oil and gas domains. As you can see from the showcase above, we support a diverse range of customized features to help your users get the most out of their data.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Showcase of the Best React Charts and Graphs</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Tue, 24 Jun 2025 14:14:58 +0000</pubDate>
      <link>https://dev.to/andyb1979/showcase-of-the-best-react-charts-and-graphs-kg3</link>
      <guid>https://dev.to/andyb1979/showcase-of-the-best-react-charts-and-graphs-kg3</guid>
      <description>&lt;p&gt;Liquid syntax error: Unknown tag 'endembed'&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Showcase of the Best React Charts and Graphs</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Mon, 31 Mar 2025 11:00:12 +0000</pubDate>
      <link>https://dev.to/andyb1979/showcase-of-the-best-react-charts-and-graphs-32ad</link>
      <guid>https://dev.to/andyb1979/showcase-of-the-best-react-charts-and-graphs-32ad</guid>
      <description>&lt;p&gt;&lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React Charts&lt;/a&gt; are revolutionizing the way we visualize and interact with complex data. These charts are not just tools for displaying information; they are gateways to deeper insights and analytics. &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React’s robust framework&lt;/a&gt;, combined with advanced charting libraries, empowers developers to build intuitive and responsive dashboards that can handle the complexities of real-time analytics &amp;amp; data visualization.&lt;/p&gt;

&lt;p&gt;Whether you’re monitoring financial markets, analyzing health data, or tracking sports statistics, &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React Charts bring data to life&lt;/a&gt;. Their versatility and performance cater to a broad spectrum of industries, enabling users to dissect and comprehend intricate datasets with ease. In this guide, we &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;explore the best React Charts and Graphs&lt;/a&gt; that stand out in the realm of web development, demonstrating how they can transform dense data into captivating and informative visual narratives.&lt;/p&gt;

&lt;p&gt;Join us as we explore the realm of &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React Charts&lt;/a&gt;. Here, every graph and chart is more than just a visual representation; it’s an essential tool for insightful data analysis, unlocking the full potential of your datasets in clear and compelling ways.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Explore our Advanced React Charts &amp;amp; Graphs Examples for Various Applications
&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Realtime Updates in React Charts&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React Charts can be used to display data in dashboards&lt;/a&gt;, analytics applications and more. However some applications require real-time updates and high performance to ensure data which is dynamically changing can be visualized fast.&lt;br&gt;
 &lt;/p&gt;

&lt;h3&gt;Real-time React Chart Performance Demo&lt;/h3&gt;

&lt;p&gt;Demonstrates appending millions of points to a react line chart. Dynamic data updates previously have been a performance problem in &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React applications&lt;/a&gt; but with this demo 300k points per second are added to the chart. Millions of datapoints can be rendered in &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React Charts with scichart.js&lt;/a&gt; without performance problems!&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%2Fpwffgw9bxussfja89leo.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%2Fpwffgw9bxussfja89leo.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.scichart.com/javascript/chart-realtime-performance-demo" rel="noopener noreferrer"&gt;Realtime React Chart Performance Demo&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;h3&gt;React Big-Data Dashboard demo&lt;/h3&gt;

&lt;p&gt;Dashboards with tens, hundreds of charts and millions of datapoints were previously impossible in React. In this performance demo we show how you can have 64-charts all updating at once, with millions of points streaming dynamically in real-time.&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%2Fr9x2t31iglfxfov0v4ev.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%2Fr9x2t31iglfxfov0v4ev.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://demo.scichart.com/javascript/multiple-chart-dashboard-performance-demo" rel="noopener noreferrer"&gt;React Dashboard Big-Data Performance Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  React Financial Charts
&lt;/h2&gt;

&lt;p&gt;Financial charts in react could include stock charts, price charts, trading charts with technical indicators. &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Charts for React&lt;/a&gt; Trading applications need to be highly interactive, show cursors, legends and tooltips, allow zooming and panning, as well as updating data in real-time.&lt;/p&gt;

&lt;p&gt;Some examples are included below.&lt;br&gt;
 &lt;/p&gt;

&lt;h3&gt;React Stock Chart with Technical Indicators&lt;/h3&gt;

&lt;p&gt;In this demo we show how to create a React Stock Chart with technical indicators. MACD and RSI indicator are added onto separate chart panes. Moving averages are added onto the main pane. There is an active legend and crosshair which tracks the mouse. The entire example can be zoomed or panned via touch or mouse interactions.&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%2Fut8183qxrka80m7p14n9.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%2Fut8183qxrka80m7p14n9.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.scichart.com/javascript/multi-pane-stock-charts-sync-technique" rel="noopener noreferrer"&gt;React Multi-Pane Stock Charts Example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Realtime Stock Charts in React&lt;/h3&gt;

&lt;p&gt;Connecting a React Candlestick Chart to financial data in an exchange is easy. In this example, price data is fetched from an exchange via REST API, then dynamically updated using a WebSocket. Candlestick charts are updated on price tick. Technical indicators (moving average) are calculated, and the chart allows zooming, panning to view older data.&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%2Fxw8h6s01n06o0d9gefrs.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%2Fxw8h6s01n06o0d9gefrs.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.scichart.com/javascript/realtime-ticking-stock-charts" rel="noopener noreferrer"&gt;JavaScript Realtime Ticking Stock Charts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Medical &amp;amp; Scientific Charts in React
&lt;/h2&gt;

&lt;p&gt;Medical applications are more and more being ported to React. Before, they were often C++ or C# applications. Medical device &amp;amp; medical software manufacturers expect high performance, reliability and low memory usage in charts &amp;amp; graphs. A showcase of examples can be found below.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Visualising Cardiac Telemetry: ECG/EKG Heart Rate Monitors in React&lt;/h3&gt;

&lt;p&gt;Plotting a sweeping medical ECG is easy in React with this software. Cardiac telemetry often needs to be visualised on medical devices or patient monitoring systems. Data traces can be cardiac telemetry, heart rate, blood oxygen, SPO2, blood pressure are plotted to the right of the graph, then wrap around to the beginning. This is possible with SciChart.js’ Fifo Sweeping Mode.&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%2F22e8hbygwkzn536a7hvn.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%2F22e8hbygwkzn536a7hvn.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.scichart.com/javascript/vital-signs-ecg-medical-chart-example" rel="noopener noreferrer"&gt;JavaScript Vital Signs ECG/EKG Medical Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Creating Echocardiograms, Ultrasound &amp;amp; Sonar in React&lt;/h3&gt;

&lt;p&gt;Echocardiograms, Ultrasound, Sonar, Thermal imaging and more can be &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;created in React&lt;/a&gt;. Using a dynamic heatmap chart type&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%2Ffrah0qcb0t1ncstk5tpv.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%2Ffrah0qcb0t1ncstk5tpv.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.scichart.com/javascript/heatmap-chart" rel="noopener noreferrer"&gt;React Heatmap / Spectrogram Chart Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  React Chart Types
&lt;/h2&gt;

&lt;p&gt;It’s not just complex financial &amp;amp; medical charts that can bring a new lease of life to your data visualizations. &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;Variations in React Line Chart&lt;/a&gt; include a wide range of different line styles, such as simple lines, digital lines, tooltips, dashes, gaps, labels, hovering lines and more.&lt;/p&gt;

&lt;p&gt;React Donut Chart&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%2Fsuow3pl7z33qqvlo53uw.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%2Fsuow3pl7z33qqvlo53uw.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Pie Chart&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%2Fab9zfrqg11rpfym3mldt.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%2Fab9zfrqg11rpfym3mldt.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Stacked Area or Stacked Mountain Chart&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%2Fjzp3ofthlc3xq94opvsk.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%2Fjzp3ofthlc3xq94opvsk.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Stacked Bar or Stacked Column Chart&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%2Fszn4liz55jdaqa7c19lt.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%2Fszn4liz55jdaqa7c19lt.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React 3D Bubble Chart&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%2Fs4i5jcpxxi676vtok1bc.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%2Fs4i5jcpxxi676vtok1bc.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Line Charts&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%2Fls2oefafqu3aip0locap.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%2Fls2oefafqu3aip0locap.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Who Uses SciChart?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart’s fully customizable React Charts&lt;/a&gt; are used by investment banks, NASA, top Formula 1 teams and companies in the tech, medical, engineering, electrical, and oil and gas domains. As you can see from the showcase above, we support a diverse range of customized features to help your users get the most out of their data.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What is React Strict Mode, and why is my Application Double Re-Rendering?</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Mon, 31 Mar 2025 10:24:58 +0000</pubDate>
      <link>https://dev.to/andyb1979/what-is-react-strict-mode-and-why-is-my-application-double-re-rendering-5akj</link>
      <guid>https://dev.to/andyb1979/what-is-react-strict-mode-and-why-is-my-application-double-re-rendering-5akj</guid>
      <description>&lt;p&gt;&lt;em&gt;React StrictMode is a development tool intended for producing hints about potential issues in &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React applications&lt;/a&gt;. With the release of React v18, Strict Mode was extended with a new feature which brought some unusual behaviour. Specifically, implicitly calling the rendering related functions extra times.&lt;br&gt;
While this feature is useful for finding bugs, the unexpected flow it introduced compared to the normal React lifecycle may be redundant and requires extra effort to deal with in some applications.&lt;br&gt;
In this article we explore what is React StrictMode, why this causes your application to double re-render, and how this impacts performance and memory when rendering charts in &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React apps&lt;/a&gt;. Finally, how to solve the problem by applying additional logic to handle strict mode.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  What is Strict Mode in React?
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
React StrictMode applies a set of behaviours and warnings that can help spotting different kinds of React related bugs. The list includes incorrect logic of the lifecycle methods (e.g. missing cleanup logic) and usage of the deprecated APIs.&lt;/p&gt;

&lt;p&gt;StrictMode can be enabled by wrapping a whole component tree or a part of it with  component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { StrictMode } from "react";

// ...

&amp;lt;StrictMode&amp;gt;
  &amp;lt;App /&amp;gt;
&amp;lt;/StrictMode&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The component doesn’t add any UI elements to the render result and doesn’t affect the production build as this is a development-only. &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;React-based frameworks&lt;/a&gt; can expose a config option to toggle the StrictMode on and off, so it is worth to be aware if it is enabled by default.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  What Happens in Strict Mode?
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
To help detecting a missing state reset or cleanup, React StrictMode executes extra calls of a render function as well as effect hooks. Extra execution of effects happens only upon an initial render, while the component function is always called twice.&lt;/p&gt;

&lt;p&gt;The behaviour effect is similar for different arguments provided as an effect hook dependencies list. The most confusing and error-prone case is when a hook is expected to run only once. So let’s look at a component that has an effect hook with an empty dependencies list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function TestComponent() {
  console.log("Rendering TestComponent");

  useEffect(() =&amp;gt; {
    console.log("Executing Effect");

    return () =&amp;gt; {
      console.log("Executing Effect Destructor");
    };
  }, []);

  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;h1&amp;gt;Random generated number&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;{Math.random()}&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will create a simple setup which allows us to render a component and then unmount it using a conditional rendering.&lt;/p&gt;

&lt;p&gt;As expected during normal rendering we would get a following console output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rendering TestComponent
Executing Effect
Executing Effect Destructor // - appears after the component is unmounted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With StrictMode on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rendering TestComponent
Rendering TestComponent
Executing Effect
Executing Effect Destructor
Executing Effect
Executing Effect Destructor // - appears after the component is unmounted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see useEffect is executed twice when StrictMode is enabled, and the cleanup function (or destructor) is also executed twice. This can cause unwanted effects, or performance problems if useEffect has a lot of code to execute, or if the cleanup function is not implemented properly.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  Why Strict Mode is useful
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
So what do we get from this behaviour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calling the component twice could uncover potential issues of side effects that may occur within the render function.&lt;/li&gt;
&lt;li&gt;Calling the effect and effect destructor twice guarantees that the destructor will run at least once, so the cleanup logic will be tested immediately.
So as result of these, an error is more likely to happen and thus more likely to be discovered during development. Usually these problems are caused by breaking the Rules of React.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Why Strict Mode may cause problems
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Depending on the logic and structure of an application side effects and their cleanup could be implemented differently.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In some cases it may be harder to implement logic that would handle Strict Mode gracefully&lt;/li&gt;
&lt;li&gt;Sometimes code that is breaking in Strict Mode could be still safely executed in production.&lt;/li&gt;
&lt;li&gt;Enabling Strict Mode could make the app execution different from what it would be in production.&lt;/li&gt;
&lt;li&gt;This could greatly affect the performance of the application as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complexity of handling the cleanup logic becomes even more difficult in combination with asynchronous code.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Handling React StrictMode Correctly
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Obviously if Strict Mode interrupts your development process a lot or you just don’t want to use it, you can always turn it off. The affected area of an application could be limited to specific component tree area.&lt;/p&gt;

&lt;p&gt;But if that is not viable option or you need to create a sharable component that works properly with or without StrictMode, than you have to build the component accordingly to the Rules of React.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  Preventing useEffect from running twice on mount
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
There are techniques that allow handling the double useEffect execution in StrictMode by conditionally preventing the effect logic execution in one of the calls. Be aware that they aren’t something you should use.&lt;/p&gt;

&lt;p&gt;Let’s assume we have heavy computation logic that we don’t wont to be executed more than once when a component renders. Also the execution of such logic may create side effects which require cleanup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const performSideEffectLogic = () =&amp;gt; {
  console.log("Perform Side Effect");
};

const cleanupSideEffectResult = () =&amp;gt; {
  console.log("Cleanup Side Effect Result");
};

function TestComponent() {
  console.log("Rendering TestComponent");

  useEffect(() =&amp;gt; {
    console.log("Executing Effect");
    performSideEffectLogic();

    return () =&amp;gt; {
      console.log("Executing Effect Destructor");
      cleanupSideEffectResult();
    };
  }, []);

  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;h1&amp;gt;Random generated number&amp;lt;/h1&amp;gt;
      &amp;lt;h2&amp;gt;{Math.random()}&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to just ignore the double execution of the effect and call performSideEffectLogic only once, we can add a flag to our component state that will identify if the effect has already been executed.&lt;br&gt;
Since the second execution of the effect with empty dependencies list in same instance component would normally run only once, if it does otherwise we can treat it as being in Strict Mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const effectWasExecuted = useRef(false);

const [data, setData] = useState&amp;lt;number&amp;gt;(undefined);

useEffect(() =&amp;gt; {
  console.log("Executing Effect");
  if (effectWasExecuted.current) {
    performSideEffectLogic();
  }

  const cleanup = () =&amp;gt; {
    console.log("Cleanup");
    setData;
  };

  return () =&amp;gt; {
    console.log("Executing Effect Destructor");

    if (process.env.NODE_ENV !== "production" &amp;amp;&amp;amp; effectWasExecuted.current) {
      cleanupSideEffectResult();
    }
    effectWasExecuted.current = true;
  };
}, []);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that this is an easy workaround, but definitely not a recommended approach. Also StrictMode behaviour is related to the new features that may appear in React and this trick is likely to no longer work in the future releases.&lt;/p&gt;

&lt;p&gt;The correct approach is to build logic the way it would handle the double effect execution.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  How React Strict Mode Affects JavaScript Charts
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
When developing applications in React, it is critical it is to understand the proper lifecycle of a React component. This is amplified when an application uses heavy performance and memory operations.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.scichart.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart.js library&lt;/a&gt; is designed to be a high performance chart for use in data-intensive applications, and setup and cleanup of big-data charts needs to be made as efficient as possible. The performance metrics of SciChart.js are profiled often, and the documentation has many tips on how to use the library optimally for best performance in your application.&lt;/p&gt;

&lt;p&gt;However, Strict Mode can cause double re-render which means setup and teardown logic of the charts can occur twice, impacting performance in development mode and even causing ‘false positive’ memory leaks.&lt;/p&gt;

&lt;p&gt;Testing with a disabled Strict Mode is important as well as testing the production build, and ensuring that you adjust your application to handle and deal with double re-render.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  How Double Re-Render Affects SciChart
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://www.scichart.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart.js is a high performance JavaScript Chart library&lt;/a&gt; that requires a few setup prerequisites.&lt;/p&gt;

&lt;p&gt;First of all it loads a WebAssembly modules. This may require a network request and compilation execution. Both are asynchronous operations.&lt;/p&gt;

&lt;p&gt;Then a chart could be created via an asynchronous function. A chart instance is an entity that requires an explicit cleanup by calling the sciChartSurface.delete() function. In addition to that SciChart creates DOM elements on a page.&lt;/p&gt;

&lt;p&gt;This presents a tricky problem of embedding the logic into a component lifecycle. Things become even more confusing when the StrictMode behaviour takes effect.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  How we solved the problem of StrictMode with SciChart-React
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart-React is an open source library&lt;/a&gt; which applies additional logic to handle both normal flow and strict mode when using &lt;a href="https://www.scichart.com/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart.js High Performance React Charts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It doesn’t prevent the double execution of lifecycle methods. To handle async function execution we chain the deletion to to the init promise. Also we track if the component is mounted and check if the destructor was called. It is also important to set the state accordingly.&lt;/p&gt;

&lt;p&gt;Here’s an extract from scichart-react SciChart.tsx file showing how we do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;useEffect(() =&amp;gt; {
        // generate guid to distinguish between effect calls in StrictMode
        const chartId = generateGuid();
        groupContext?.addChartToGroup(chartId, false, null);

        const rootElement = innerContainerRef.current;
        rootElement!.appendChild(chartRoot as Node);

        const initializationFunction = initChart
            ? initChart
            : (createChartFromConfig&amp;lt;TSurface&amp;gt;(config) as TInitFunction&amp;lt;TSurface, TInitResult&amp;gt;);

        let cancelled = false;

        const runInit = async (): Promise&amp;lt;TInitResult&amp;gt; =&amp;gt;
            initializationFunction(chartRoot as HTMLDivElement).then(result =&amp;gt; {
                if (!result.sciChartSurface) {
                    throw new Error(wrongInitResultMessage);
                }
                // check if the component was unmounted before init finished
                if (isMountedRef.current &amp;amp;&amp;amp; chartRoot) {
                    groupContext?.addChartToGroup(chartId, true, result);
                    initResultRef.current = result;
                    setIsInitialized(true);

                    if (onInit) {
                        cleanupCallbackRef.current = onInit(result);
                    }
                } else {
                    cancelled = true;
                }

                return result;
            });

        // workaround to handle StrictMode
        const initPromise = initPromiseRef.current ? initPromiseRef.current.then(runInit) : runInit();
        initPromiseRef.current = initPromise;

        const performCleanup = (initResult: TInitResult) =&amp;gt; {
            if (!cancelled &amp;amp;&amp;amp; cleanupCallbackRef.current) {
                cleanupCallbackRef.current();
                cleanupCallbackRef.current = undefined;
            }

            if (!cancelled &amp;amp;&amp;amp; onDelete) {
                onDelete(initResult);
            }

            initResultRef.current = null;
            setIsInitialized(false);

            groupContext?.removeChartFromGroup(chartId);
            initResult.sciChartSurface!.delete();
        };

        return () =&amp;gt; {
            // wait for init to finish before deleting it
            initPromise.then(performCleanup);
        };
    }, []);

    const groupContext = useContext(SciChartGroupContext);

    return (
        &amp;lt;!-- DOM elements omitted for brevity -&amp;gt;
    );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using code like this we’re able to handle the asynchronous creation of SciChart.js charts and the proper cleanup, whether the application is run in strict mode or not. Extra handling around asynchronous calls is required to ensure that cleanup code is executed once only, and always when the component is unmounted.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Should you use React StrictMode?
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
We believe you should. Strict Mode will help you by reminding about proper component lifecycle handling and will emphasize the potential issues. Thus, it is worth using it.&lt;/p&gt;

&lt;p&gt;However,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it is important to be aware whether an application has the mode enabled.&lt;/li&gt;
&lt;li&gt;Application testing should better be performed both with the mode enabled and disabled.&lt;/li&gt;
&lt;li&gt;You must ensure that you correctly handle useEffect cleanup, especially when initialization of a component has asynchronous code&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How to change the dash, stroke or point style of a specific section of a line chart in JavaScript</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Mon, 31 Mar 2025 10:05:41 +0000</pubDate>
      <link>https://dev.to/andyb1979/how-to-change-the-dash-stroke-or-point-style-of-a-specific-section-of-a-line-chart-in-javascript-35in</link>
      <guid>https://dev.to/andyb1979/how-to-change-the-dash-stroke-or-point-style-of-a-specific-section-of-a-line-chart-in-javascript-35in</guid>
      <description>&lt;p&gt;In this blog post will cover how to change the style of a specific part of a line, scatter, column or  mountain chart in JavaScript.&lt;/p&gt;

&lt;p&gt;Perhaps you want to create a JavaScript Line Chart where part of the line is dashed and part is solid.&lt;/p&gt;

&lt;p&gt;Or perhaps a JavaScript scatter chart where different point-markers (e.g. circle, cross, triangle, square) are displayed on different parts of the chart 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F985wlbpw4fjp08isd8oy.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%2F985wlbpw4fjp08isd8oy.png" alt=" " width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Above: React Chart with Multi Series Style example, showing how to dynamically switch styles in a javascript/react chart&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This could be an important use-case in real-time analytics, where you want to show additional states on a JavaScript chart, for example, data with low confidence could be displayed as a dashed line or semi-transparent line, whereas data with high confidence could be displayed as a solid line.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  Solution 1 – Multiple Series
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Until now, various &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript chart libraries&lt;/a&gt; can only achieve changing the style of a line chart dynamically using multiple series.&lt;/p&gt;

&lt;p&gt;For example, in order to achieve a JavaScript line chart where different segments are dashed and solid, you would need to have two separate line series on the same 2D chart.&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%2F5bbcxv0hbmjcwqsznbgl.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%2F5bbcxv0hbmjcwqsznbgl.png" alt=" " width="602" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many chart libraries such as chart.js will allow you to display a line chart with both solid and dashed line by using this technique, for example having two datasets with two different styles on the same chart (see StackOverflow: Can we draw a line chart with both solid and dotted line in it).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;lineChartData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;E&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;G&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My First dataset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#66f&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderDash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},{&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My First dataset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#66f&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;myChart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lineChartData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This results in the following output (JSFiddle: &lt;a href="https://jsfiddle.net/uwb8357r" rel="noopener noreferrer"&gt;https://jsfiddle.net/uwb8357r&lt;/a&gt;)&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%2F2xpw9h2yt19n09l20r75.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%2F2xpw9h2yt19n09l20r75.png" alt=" " width="602" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apache eCharts also has a similar way of handling splitting of series of different styles. For example, this stackoverflow post titled How to Change the style of a specific section/part of a line to dotted/dashed describes how you can change the style of a specific section/part of a line chart to dotted/dashed lines in eCharts, and the only solution is to have two series, one for each line. One for solid line, one for dashed line, with two separate datasets.&lt;/p&gt;

&lt;p&gt;This is not a bad solution, however in the case where you have multiple series on a chart, or where you have a legend, or want to handle selection / clicking / hovering callbacks or drilldowns on a chart, having extra series present in the data model can confuse your software developers by making the code more complex than it needs to be and more difficult to understand or maintain.&lt;/p&gt;

&lt;p&gt;It would be a better solution to have a single line series with multiple styles applied to the same series. However, how can this be done in &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 2 – Using the Render Data Transform API in SciChart.js
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart.js – a High Performance JavaScript and React Chart library&lt;/a&gt; for scientific, engineering, medical and financial applications features an API called Render Data Transforms.&lt;/p&gt;

&lt;p&gt;This API allows you to transform your data immediately before it is drawn, affecting the final visual output on the screen while keeping your data unchanged.&lt;/p&gt;

&lt;p&gt;It also allows you to perform visual transformations in a &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript chart&lt;/a&gt;, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interpolating data to insert extra points (spline, Bezier transformation)&lt;/li&gt;
&lt;li&gt;Switching styles on a series, for example having dashed/solid lines as part of the same line chart&lt;/li&gt;
&lt;li&gt;Splitting line segments, for example inserting extra points to deal with color-transitions at thresholds where a line goes above/below a threshold value
One such use-case of the RenderDataTransforms API would be to allow you to switch styles between solid and dashed lines in a &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript chart&lt;/a&gt;, using the same dataset &amp;amp; single series.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this worked example we’ll use the same dataset as the chart.js example previousl provided, however with an additional third parameter called dash which is 0 or 1 (where 0 means solid line, 1 means dashed line).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;Dash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;_It’s important to note that a 1 in the Dash[] array means this point has a dashed line, however a dashed line segment must be defined by two points. Therefore an array for dashes of [0,0,0,0,1,1,1] would actually result in two dashed segments at the end of the chart. _&lt;/p&gt;

&lt;p&gt;In SciChart.js, X,Y data can be stored in a XyDataSeries, and additional information can be stored in a flexible JavaScript object called Metadata. To declare a data series with the above data, use this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create the data. X,Y values are numeric&lt;/span&gt;
&lt;span class="c1"&gt;// dashValues are mapped to metadata (javascript objects)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;yValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataSeries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to setup a chart which will render the data as a line series.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Create a SciChartSurface with X,Y Axis&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;divElementId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SciChartJsNavyTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;xAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;growBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumberRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)}));&lt;/span&gt;

  &lt;span class="c1"&gt;// Create the data. X,Y values are numeric&lt;/span&gt;
  &lt;span class="c1"&gt;// dashValues are mapped to metadata (javascript objects)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;yValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataSeries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;metadata&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;  
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lineSeries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FastLineRenderableSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dataSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SteelBlue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pointMarker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EllipsePointMarker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SteelBlue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderableSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To split the style in the series based on the metadata[i].dash value, we need to use a RenderDataTransform. We can also inject something called a DrawingProvider into the line series to draw the alternate points. Let’s setup this code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashedOrSolidRenderDataTransform&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;XyyBaseRenderDataTransform&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nf"&gt;runTransformInternal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;renderPassData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RenderPassData&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;IPointSeries&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Guard in case the incoming data is empty&lt;/span&gt;
  &lt;span class="c1"&gt;// If you want to do nothing and draw the original data, you don't need to copy it, you can just return renderPassData.pointSeries&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;renderPassData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointSeries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// It is important to reuse this.pointSeries.  Do NOT create a new pointSeries on each transform&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;oldI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;resampled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;renderPassData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indexes&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Clear the target vectors&lt;/span&gt;
  &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// indexRange tells the drawing to only use a subset of the data.  If data has been resampled, then always use all of it&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resampled&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;renderPassData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;iEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resampled&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;renderPassData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexRange&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSeries&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prevDash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;iStart&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;iEnd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resampled&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;oldI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMetadataAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="nx"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="c1"&gt;// Add normal point if the current or previous is not dashed&lt;/span&gt;
            &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dash&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prevDash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   
            &lt;span class="c1"&gt;// Add dashed point if the current or previous is dashed&lt;/span&gt;
            &lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevDash&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dash&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dash&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prevDash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Add a break in the normal if the current is dashed but the previous was not&lt;/span&gt;
              &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
              &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
              &lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dash&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;prevDash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="c1"&gt;// Add a break in the dashed if the current is not dashed but the previous was&lt;/span&gt;
              &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
              &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oldY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
              &lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;prevDash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Return the transformed point series&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Render Data Transform must be applied to a series like this before the series is added to the chart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add the new drawingProvider to the series. The selector ps.y1Values means use the alternate data provided by the render transform&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LineSeriesDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drawingProviders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parentSeries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isDigitalLine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lineType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;drawNaNAs&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parentSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nx"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;strokeDashArray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Here's where we swap out stroke-dashing&lt;/span&gt;
     &lt;span class="nx"&gt;isDigitalLine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;lineType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;drawNaNAs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;containsNaN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        
  &lt;span class="p"&gt;};&lt;/span&gt;          
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Create the transform and add it to the series. Pass only the lineDrawingProviders&lt;/span&gt;
&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderDataTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DashedOrSolidRenderDataTransform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drawingProviders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s the output result:&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%2Fnc5jt0375gd05dwrnlw1.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%2Fnc5jt0375gd05dwrnlw1.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Simplifying the Solution by Encapsulating Logic into a Custom Series
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
The solution provided relies on a lot of boilerplate code, which can be simplified greatly be encapsulating into a Custom Series.&lt;/p&gt;

&lt;p&gt;One of the benefits of SciChart.js is that it’s an extremely extensible &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript Chart Library&lt;/a&gt;, meaning that you can write your own series types, extensions, interaction types or &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;custom rendering in JavaScript&lt;/a&gt;, allowing you to infinitely configure the charts in your application to meet user requirements.&lt;/p&gt;

&lt;p&gt;Here’s a class for a custom series called DashDottedLineSeries which is based on the FastLineRenderableSeries and the RenderDataTransforms API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashDottedLineSeries&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FastLineRenderableSeries&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateStrokeDashArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateStroke&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Orange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Add the new drawingProvider to the series&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LineSeriesDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;y1Values&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drawingProviders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parentSeries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isDigitalLine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lineType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;drawNaNAs&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parentSeries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateStroke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;strokeDashArray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alternateStrokeDashArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;isDigitalLine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;lineType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nx"&gt;drawNaNAs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;containsNaN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Create the transform and add it to the series. Pass only the lineDrawingProviders&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderDataTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DashedOrSolidRenderDataTransform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;drawingProviders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;dashedDrawingProvider&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the usage comes down simply to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create a SciChartSurface with X,Y Axis&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;divElementId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SciChartJsNavyTheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;xAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Create the data. X,Y values are numeric&lt;/span&gt;
&lt;span class="c1"&gt;// dashValues are mapped to metadata (javascript objects)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;yValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataSeries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;metadata&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;  
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lineSeries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DashDottedLineSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dataSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SteelBlue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pointMarker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EllipsePointMarker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SteelBlue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderableSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lineSeries&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s the simplified output result:&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%2Fo37nbbhjtkgymrji3suo.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%2Fo37nbbhjtkgymrji3suo.png" alt=" " width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

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

&lt;p&gt; &lt;br&gt;
In JavaScript or React it’s possible to create data-analytics applications where certain sections of a line chart are dotted/dashed while other sections are solid. It’s also possible to dynamically change the stroke color, stroke thickness, or pointmarker of a &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;line chart in JavaScript&lt;/a&gt; for sections of the data with higher/lower confidence, or to signify events or areas of importance in the data.&lt;/p&gt;

&lt;p&gt;This can be achieved in SciChart.js by using a Render Data Transforms API, which allows you to inject styles or extra data-points into a &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;JavaScript chart&lt;/a&gt; immediately before draw.&lt;/p&gt;

&lt;p&gt;Finally, to simplify your application code, logic for the Render Transform can be encapsulated into a custom series, which can then be re-used throughout your application.&lt;/p&gt;

</description>
      <category>ui</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>React Charts with SciChart.js: Introducing scichart-react</title>
      <dc:creator>Andrew Bt</dc:creator>
      <pubDate>Mon, 31 Mar 2025 09:23:01 +0000</pubDate>
      <link>https://dev.to/andyb1979/react-charts-with-scichartjs-introducing-scichart-react-280</link>
      <guid>https://dev.to/andyb1979/react-charts-with-scichartjs-introducing-scichart-react-280</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TLDR: In this blog post we introduce a brand new open source library called scichart-react (npm, GitHub). This makes it easy to create stunning high-performance charts and data visualizations in React.&lt;/p&gt;

&lt;p&gt;SciChart-React has now been released and is on npm as scichart-react. Examples, samples, documentation &amp;amp; tutorials are coming soon.&lt;/p&gt;

&lt;p&gt;The official SciChart / React package solves the problem of component lifecycle with SciChart.js and avoids common pitfalls when creating charts in React. Code examples are given below of how to create React Charts, as well as where to find further information about this new React chart component.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose React JS for Chart Creation?
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
React JS has become the preferred choice for enterprises seeking robust and efficient application development, largely due to its component-based architecture, high performance, and rich ecosystem. Unlike other frameworks like Angular, React stands out for its virtual DOM, which ensures faster rendering and smooth handling of complex, data-intensive visualizations. Its modular nature allows for the creation of reusable, maintainable chart components, streamlining development and scalability. Additionally, React’s vast library of tools and strong community support offers a wealth of resources, making it more adaptable to various charting requirements. The combination of flexibility, efficient data handling, and cross-platform compatibility positions React as a dominant force in the realm of enterprise-level data visualization, outpacing competitors in terms of performance and versatility.&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  Why Choose SciChart.js for React Charts?
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
SciChart.js is an &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;advanced react chart library for&lt;/a&gt; use in complex and advanced mission critical applications. SciChart’s key features include extremely high performance for big-data sets, a wide set of chart types, deep features and customisability.&lt;/p&gt;

&lt;p&gt;For a full run-down of SciChart.js’ features and why you should consider it for enterprise apps with complex requirements, read the following post:&lt;br&gt;
&lt;a href="https://www.scichart.com/blog/the-best-javascript-chart-10-reasons/" rel="noopener noreferrer"&gt;The Best JavaScript Chart Library: 10 Compelling Reasons to Choose SciChart.js in 2024&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  Create React Charts easily with SciChart-React
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Earlier in the year, we published an article titled How to create a re-usable react component for SciChart.js. This demonstrated how to create charts in React by applying a few criteria for creation of a React Chart component:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The component should be reusable for different chart configurations&lt;/li&gt;
&lt;li&gt;It should be possible to safely create several instances of the component&lt;/li&gt;
&lt;li&gt;It should be easy to add custom functionality to the component&lt;/li&gt;
&lt;li&gt;When chart instantiation is an async function, this should be properly handled&lt;/li&gt;
&lt;li&gt;When the chart requires a root  element in the DOM it should exist before chart instantiation
&lt;/li&gt;
&lt;li&gt;Finally, the chart should be properly disposed and memory deleted after the component is unmounted.
As background reading it’s worth reading the article. Problems which occurred in the past when &lt;a href="https://www.scichart.com/react-charts/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;creating React Charts with SciChart.js&lt;/a&gt; included double re-render, and potential memory leaks if your code improperly disposed of a chart surface by failing to call .delete().&lt;/li&gt;


&lt;p&gt;We’ve created a new library called scichart-react which is open sourced and available on Github and npm. This solves the problems above and ensures that you have good quality code managing your react components and provides a clean, neat way to instantiate charts in react using simple props.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-Step Guide: Building Your First Chart in React with SciChart.js
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
SciChartReact provides an easy solution for using the SciChart core library for charts in React.&lt;/p&gt;

&lt;p&gt;In the next sections, we will demonstrate a basic usage of the component.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Basic React Chart Example
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Follow the prerequisites and installation sections from &lt;a href="https://www.npmjs.com/package/scichart-react" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/scichart-react&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And just with few lines of code, you can set up a chart in React.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Create a Chart with Config (Builder) API
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
The Builder API in SciChart allows you to create charts in JavaScript with JS objects or JSON. This can be translated into React using scichart-react as follows.&lt;/p&gt;

&lt;p&gt;The example uses the config property which accepts a configuration object of the chart. You can also pass a string with serialized chart configuration.&lt;br&gt;
import { SciChartReact } from "scichart-react";&lt;br&gt;
import { ESeriesType, EThemeProviderType } from "scichart";&lt;br&gt;
&lt;/p&gt;

&lt;/ul&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * The chart configuration object acceptable by the Builder API
 * @type {import("scichart").TSurfaceDefinition}
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chartConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EThemeProviderType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Basic Chart via Config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;titleStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ESeriesType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SplineMountainSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#216939&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fillLinearGradient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;startPoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;endPoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;gradientStops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#2d2169&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transparent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;xyData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BasicChart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SciChartReact&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;chartConfig&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Here’s the output&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%2Fkksavhsfn1j93bya4rs1.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%2Fkksavhsfn1j93bya4rs1.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt; SciChartReact extends properties of the HTMLDivElement and propagates them to the underlying div element.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Create a React Chart with Programmatic API
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Alternatively, SciChartReact accepts an initialization function. This allows the creation of a chart with the usual SciChart.js API. In this case the chartInitializationFunction below must be async and accepts the &lt;/p&gt; rootElement created by scichart-react as a parameter. This can be passed straight to SciChartSurface.create().&lt;br&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SciChartReact&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scichart-react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;EThemeProviderType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;SciChartSurface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;SplineMountainRenderableSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scichart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/**
 * A function executed within SciChartReact with provided chart root element,
 * creates a SciChartSurface instance and returns a reference to it.
 *
 * @param {string | HTMLDivElement} rootElement
 * @returns {Promise&amp;lt;{sciChartSurface: SciChartSurface}&amp;gt;}
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EThemeProviderType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Basic Chart via Init Function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;titleStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;xAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yAxes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderableSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SplineMountainRenderableSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;dataSeries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#216939&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fillLinearGradient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;startPoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;endPoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;gradientStops&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#2d2169&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transparent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BasicChartWithInitFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SciChartReact&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;initChart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Additionally, it is possible to easily add more customizations and functionality by providing arguments to other props:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fallback – a JSX element to render while the chart initialization is in progress&lt;/li&gt;
&lt;li&gt;onInit – a callback that is executed after the chart initialization has been completed&lt;/li&gt;
&lt;li&gt;onDelete – a callback executed when a fully initialized chart is unmounted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Advanced React Chart example – Selection and Synchronization with a DataGrid
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Let’s look at another more complex example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For this case, we will take a setup with a Scatter Chart that fetches data asynchronously.&lt;/li&gt;
&lt;li&gt;The points on the chart could be selected by click and drag action.&lt;/li&gt;
&lt;li&gt;Upon selection, the point info appears within a grid at the side of the chart&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1 – Fetching Data Asynchronously and loading the Chart
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Considering that the data fetching as well as a chart initialization potentially can take a noticeable amount of time, let’s make sure to set a custom loading UI with fallback property.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * @param {string | HTMLDivElement} rootElement
 * @returns {Promise&amp;lt;{sciChartSurface: SciChartSurface}&amp;gt;}
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createChart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// for demonstration purposes, here we have used Builder API explicitly&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chartBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build2DChart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;xAxes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EAxisType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;autoRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EAutoRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Once&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;growBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NumberRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;yAxes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EAxisType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NumericAxis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;autoRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EAutoRange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Never&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EThemeProviderType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Dark&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scatter Chart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;titleStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// a function that simulates an async data fetching&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({}),&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;xValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;yValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;createChart&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wasmContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webAssemblyContext2D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;renderableSeries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyScatterRenderableSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;dataSeries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XyDataSeries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasmContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;strokeThickness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#216939&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sciChartSurface&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="c1"&gt;// then in JSX&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SciChartReact&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fallback"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Data fetching &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; Chart Initialization in progress&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;initChart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 – Adding in Selection Behavior to the Chart
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
To achieve this behavior we can use DataPointSelectionModifier, which is a built-in behaviour in SciChart to allow selection, and multi-selection of data-points on a chart.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// ...&lt;/span&gt;

  &lt;span class="cm"&gt;/**  
   * @param {{sciChartSurface: SciChartSurface}} initResult 
   *    - a resolved object returned by the initialization function 
   */&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onChartInitializationComplete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataPointSelectionModifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DataPointSelectionModifier&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;allowClickSelect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;allowDragSelect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;selectionStroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;selectionFill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#ff879f33&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;onSelectionChanged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nf"&gt;setSelectedPoints&lt;/span&gt;&lt;span class="p"&gt;([...(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;selectedDataPoints&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[])]),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;initResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sciChartSurface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chartModifiers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataPointSelectionModifier&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onChartCleanup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setSelectedPoints&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

  &lt;span class="c1"&gt;// ...&lt;/span&gt;

  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SciChartReact&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fallback"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Data fetching &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; Chart Initialization in progress&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;initChart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onChartInitializationComplete&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onChartCleanup&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 – Synchronising Selection Data from a Chart to a DataGrid
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
Now to bind the point selection to a grid, we are adding an appropriate callback to the DataPointSelectionModifier – onSelectionChanged.&lt;br&gt;
It can be used to get the list of the selected points and then we should be able to easily put them into a grid.&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%2Fl4od6wp7dkpjlgua0uv6.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%2Fl4od6wp7dkpjlgua0uv6.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex-container"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SciChartReact&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;50%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fallback"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Data fetching &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; Chart Initialization in progress&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;initChart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;chartInitializationFunction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;onInit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onChartInitializationComplete&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onChartCleanup&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"data-grid"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid-cell grid-header"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Selected Points&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid-cell column-header"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;X Value&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid-cell column-header"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Y Value&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;selectedPoints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`x-val-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid-cell"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;xValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`y-val-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid-cell"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Further Examples of React Charts with scichart-react
&lt;/h2&gt;

&lt;p&gt; &lt;br&gt;
The full source-code for all three examples in this blog post, showing how to create a Basic React Chart with config, a Basic Chart with programmatic API, as well as the DataGrid sync example are included in the Codesandbox here.&lt;br&gt;
Additional resources can be found below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple Examples: SciChart-react code examples – Github Pages&lt;/li&gt;
&lt;li&gt;Source: SciChart-React source-code on Github&lt;/li&gt;
&lt;li&gt;npm: SciChart-React package on npm&lt;/li&gt;
&lt;li&gt;Advanced examples: we’re working through the SciChart.js Demo to update all our examples to use scichart-react.
 
## Conclusion
 
&lt;h3&gt;Integrating SciChart with React for Powerful Charting&lt;/h3&gt;
It has always been possible to use &lt;a href="https://www.scichart.com/javascript-chart-features/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=syndication" rel="noopener noreferrer"&gt;SciChart’s JavaScript Charts&lt;/a&gt; within React. We previously documented how to create a reusable react component talking about some of the issues such as correct component lifecycle and handling SciChart’s async initialisation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ve now wrapped this up into an open source library called scichart-react to make creating React Charts easy.&lt;/p&gt;



</description>
    </item>
  </channel>
</rss>
