Hello,
I am currently attempting to use the newly released version (4.0.828). However, I have encountered an issue where both the axisLabelFill and axisLabelStroke properties in the CursorModifier are not functioning as expected. The colors are not being applied.
In version 3, according to the documentation, these properties work correctly, but in version 4 they do not. Please find the attached screenshots for reference.
- rocket trade asked 8 months ago
- last active 8 months ago
Hi all
Has there been any consideration for supporting Flutter? Currently, the popularity of Flutter applications is quite high, and at the same time, the Flutter ecosystem lacks excellent graphics library support. This might become a growth point for the company.
- chen weihan asked 9 months ago
- last active 8 months ago
I would like to filter time series data based on specific date and time ranges, rather than skipping entire days or just specific times within a day.
Currently, the base calendar implementation seems to only support skipping entire days, but it doesn’t allow for partial days to be excluded.
It would be helpful to have a SkipDateRanges property, where we could define a list of start and end DateTime pairs. For example, this would allow specifying date ranges like:
From 2025-08-01 06:00 to 2025-08-05 11:00
From 2025-08-08 08:30 to 2025-08-09 01:00
This would give us the flexibility to skip specific date and time ranges rather than just entire days.
- Nathan Landrum asked 9 months ago
- last active 9 months ago
We need to make heatmaps of our data and don’t know the type of data variables until runtime. Because of this I am switching the axes like so in XAML:
…
The key is that I’m a custom LabelProvider class to convert any categorical values into the appropriate label for the axes. I would have liked to use a CategoryNumericAxis for both axes, but for some reason it seems you can’t so I’m using a NumericAxis.
All data values are coming in as 0, 1, 2,… for the categorical variables.
I am running into two issues with the axes. First is that the last category is cutoff prematurely and I’d like to align the labels with the center of the category not the left edge. These issues appear with the CategoryNumericAxis.
The second issue is that I’m having issues aligning both the values and controlling the number of what I guess are the tickmarks for the Y axis since it doesn’t know it is categorical data. Is there any (easy) way to handle the Y axis for categorical data?
Attached is an image of what the plots are looking like:
- Robert Rommel asked 9 months ago
- last active 4 months ago
How do I draw a waterfall 3D chart with the Z-axis as the height instead of the Y-axis, similar to the waterfall chart in MATLAB?
![]()
- anders chen asked 9 months ago
- last active 7 months ago
I’m plotting the binding series using scatter points. When I mouse left-button down on a point, I want to get the X and Y values for that point. However, because my data is so large, it doesn’t show the correct result without zooming in. That’s my code.
private void sciChart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Mouse pozisyonunu al
var mousePoint = e.GetPosition(sciChartSurface);
// SciChart eksenlerinden gelen double veri değerlerini al
double xValueDouble = xAxis.GetDataValue(mousePoint.X);
double yValueDouble = yAxis.GetDataValue(mousePoint.Y);
// Double veri değerlerini int'ye çevir
int xValueInt = (int)Math.Round(xValueDouble);
int yValueInt = (int)Math.Round(yValueDouble);
// Bilgiyi göster veya işleyin
Console.WriteLine($" X = {xValueInt}, Y = {yValueInt}");
}
- merve akçakaya asked 9 months ago
- last active 7 months ago
Hi SciChart Team,
I’m trying to replicate a grouped stacked column chart similar to Highcharts, where each stack belongs to a group (e.g., by year), and each group contains multiple categories (e.g., Q1, Q2). I also want to customize the x-axis labels to show both the group name and category name, like the below attachment.
I understand SciChart uses CategoryAxis or NumericAxis on the X-axis, and we can use StackedColumnRenderableSeries.
My questions are:
1. How can I group stacked columns visually within each main group (e.g., group by year)?
2. Is it possible to customize the x-axis labels to include both group and sub-category names, or render them in two rows?
If there’s a recommended approach or sample code for this kind of grouped stacking, I’d really appreciate some guidance.
Thanks in advance!
- xanthemc asked 9 months ago
- last active 9 months ago
Drag the area in the 3D point chart to select a point.
The current occurrences are as follows.
The point in the camera view direction is selected. However, if there is an overlapping point, the first point is selected, but the hidden point is not.
Is there any way to solve this?
- MIN JAE KIM asked 9 months ago
- last active 9 months ago
Hello,
when data count exceeds the amount of pixels of the control normally the ResamplingMode should take care of displaying the expected results. Setting the Resampling mode to either of the following modes doesnt always show the green / yellow heatmapdata.
- MinMaxWithUnevenSpacing
- Max
- MinMax
Depending on resizing the window (and availability of pixels for the control either green, yellow, none or both lines are shown. Orange block is always shown, as it spans enough pixels not to require ResamplingMode to work.
I have not found any mode to be able to make sure that heatmapdata is shown.
Am i missing something?
- sschueler asked 10 months ago
- last active 6 months ago
I created a boxplot chart using a FastCandleStickRenderableSeries together with a FastErrorBarsRenderableSeries, both using the same OhlcDataSeries. The error bars use the high and low values to draw the whiskers, and the HlcDataSeries is used for the mean point.
However, I’m currently facing an issue where the boxplot chart is not displaying tooltips. How can I achieve tooltip behavior similar to Highcharts, using a CursorModifier?
- xanthemc asked 10 months ago
- last active 10 months ago
Hi SciChart Team / Community,
I’m working with heatmaps in JavaScript and trying to reproduce a chart similar to Highcharts’ heatmap using SciChart.js.
I’d like to know how to achieve the same (or similar) result using SciChart.js. Specifically:
How to display category labels on X and Y axes similar to highchart ?
Thanks in advance for your help!
- xanthemc asked 10 months ago
- last active 10 months ago
I am looking to add several new features to our tool that uses SciChartJS – one was addressed yesterday with marker positioning. Today I have two more requests:
1. How to grow/shrink a marker based on the datapoint on the Y-axis (my X-axis is time). Example, say a trader wants to show orders placed by an algo over the time duration. The order has a price and quantity associated with it – like:
8:30:31 – Buy ESM5 – 10 lots
8:30:40 – Sell ESM5 – 1 lot
8:30:45 – Buy ESM5 – 100 lots
8:30:50 – Sell ESM5 – 50 lots
etc.
The trader wants to see these orders plotted on the chart – Y-axis being the Price, Size of Marker = dynamic based on order size (10 lots, 1 lot, 100 lots, 50 lots, etc).
The color of the marker would be based on Buy = Blue, Sell = Red.
- Another requirement is to show/hide marker based on some condition. Examples:
– Show the marker when OrderSize > 25
– Hide the marker when OrdeSize < 10 and Price < 1% of inside market
I have attached a screenshot showing what my timeseries looks like for an instrument.
Looking forward to a yet another awesome solution!
Best Regards,
Sachin.
- sachin patel asked 10 months ago
- last active 10 months ago
I have a feature request from my users to allow markers to be positioned in one of the following locations with respect to the datapoint:
- center
- top
- bottom
- left
- right
In the image below, the SciChart’s default marker position is “center”. On the right, I have drawn different positions that my users are requesting.
I am looking for any help/tips/etc.
- sachin patel asked 10 months ago
- last active 10 months ago
Hi,
We’re investigating some bug reports that we’ve been getting on Sentry where graph drawing is halting (this is for a system with real time chart updates). We often see both a WebGL context lost and a WebGL context restored event.
The next step we took was to simulate a lost/restored event via:
var ext = $(‘#SciChartMasterCanvas’).getContext(“webgl2”).getExtension(“WEBGL_lose_context”);
ext.loseContext()
//Chart will stop drawing here as expected
//Wait some period of time
ext.restoreContext()
//Chart still doesn’t draw
This bug suggests that it should already be handing webglcontextlost/restored https://sabai-scichart.local/questions/js/webgl-context-lost-and-memory-issue-critical-bug
At first we thought it might be related to our code (i.e maybe Sentry was breaking the event.preventDefault on the lostcontext handler), but you can see the same behaviour here:
https://demo.scichart.com/react/chart-hit-test-on-click
After the restore context is called, hit tests no longer render to the screen. Is this expected or a regression from the previous fix?
PS we’ve previously asked about a similar issue, unsure if they are related: https://sabai-scichart.local/questions/js/webgl-context-lost
Thanks
Edwin
- Edwin Liu asked 10 months ago
- last active 10 months ago
Hi,
My WPF software uses XyDataSeries<DateTime, double> to plot real time data from our device. I ran the program days and days and always got this crush. It happened randomly. Sometimes it happened in a couple of hours after ran the program. Sometimes it happened after several days. The SciChart library that we use is v 8.0.****. The following is the message from Event viewer. I understand the error message is general, but hoping if anyone has any idea or direction.
Application: My Software.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
at def.whd(IntPtr, IntPtr, IntPtr, System.Runtime.InteropServices.HandleRef)
at SciChart.Charting2D.Interop.SCRTXyColorVertexProcessor.ProcessXyColorVertex(Double[], Double[], IntPtr, SciChart.Charting2D.Interop.SCRTXyColorVertexProcessorArgs)
at SciChart.Charting.Visuals.RenderableSeries.DrawingProviders.LineSeriesDrawingProvider1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].jgh(SciChart.Drawing.Common.IVxRenderContext, SciChart.Charting.Numerics.CoordinateCalculators.ICoordinateCalculator1, SciChart.Charting.Numerics.CoordinateCalculators.ICoordinateCalculator1<Double>, SciChart.Data.Model.IPointSeries)1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnDraw(SciChart.Drawing.Common.IRenderContext2D, SciChart.Charting.Visuals.RenderableSeries.IRenderPassData)
at SciChart.Charting.Visuals.RenderableSeries.DrawingProviders.LineSeriesDrawingProvider
at SciChart.Charting.Visuals.RenderableSeries.BaseRenderableSeries+yiz.fkm(SciChart.Charting.Visuals.RenderableSeries.DrawingProviders.ISeriesDrawingProvider)
at SciChart.Core.Extensions.EnumerableExtensions.ForEachDo<a href="System.Collections.Generic.IEnumerable1<System.__Canon>, System.Action1<System.__Canon>”>[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
at SciChart.Charting.Visuals.RenderableSeries.BaseRenderableSeries.InternalDraw(SciChart.Drawing.Common.IRenderContext2D, SciChart.Charting.Visuals.RenderableSeries.IRenderPassData)
at SciChart.Charting.Visuals.RenderableSeries.BaseRenderableSeries.SciChart.Charting.Visuals.IDrawable.OnDraw(SciChart.Drawing.Common.IRenderContext2D, SciChart.Charting.Visuals.RenderableSeries.IRenderPassData)
at edb.sdy(SciChart.Charting.Services.RenderPassInfo, SciChart.Drawing.Common.IRenderContext2D, Int32)
at edb.sdx(SciChart.Charting.Visuals.ISciChartSurface, SciChart.Charting.Services.RenderPassInfo, SciChart.Drawing.Common.IRenderContext2D)
at edb.RenderLoop(SciChart.Drawing.Common.IRenderContext2D)
at SciChart.Charting.Visuals.SciChartSurface.DoDrawingLoop()
at SciChart.Charting.Visuals.SciChartSurface.ilx()
at SciChart.Core.Utility.CompositionSyncedDelegate.cmq(System.Object, System.Object)
at System.EventHandler.Invoke(System.Object, System.EventArgs)
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(System.Object)
at System.Windows.Media.MediaContext.RenderMessageHandler(System.Object)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
at System.Windows.Application.RunDispatcher(System.Object)
at System.Windows.Application.RunInternal(System.Windows.Window)
at System.Windows.Application.Run(System.Windows.Window)
at My Software.App.Main()
Thanks a lot
- Rosalind Chen asked 10 months ago
- last active 10 months ago
Hi,
Can you provide any example code to integrate the customTextureOptionsProperty in Mountain Series, I am looking to fill the area chart with some image pattern. It will be good if you provide the sample code to integrate the pattern image in the chart.
- Arun Surendran asked 10 months ago
- last active 10 months ago
Hi,
I am trying to export a chart. For that I created a ClonableChart component dereved from SciChartSurface and apply some formatting to part of the chart to correctly clone the chart.
If the chart is not currently visible the export is not correct.
Please see the attached project to reproduce the issue:
- Run application and press “Export chart” -> image copied to clipboard
- Past the image somewhere, e.g. a Word document
- Switch to tab “No chart” and export again
- Paste the image to compare
The attached image shows the output. For some reason the chart style is not correctly applied if the chart is not currently visible.
Please suggest a fix to this issue.
- Robert Martin asked 10 months ago
- last active 10 months ago
sciChartSurface.yAxes.remove(yAxis);
const newYAxis = newNumericAxis(wasmContext, {
useNativeText: true,
growBy: new NumberRange(0.1, 0.1),
labelFormat: ENumericFormat.Decimal,
labelPrecision: scale
})
sciChartSurface.yAxes.add(newYAxis);
How can I update axis label precision without recreating the axis? I’m asking because recreating the axis breaks the layout of my HorizontalLineAnnotation, causing its label to appear within the chart instead of on the axis. Any help is appreciated.
- Jeff Tran asked 11 months ago
- last active 10 months ago
I have a project targeting framework 4.6.2 which contains a heatmap (FastUniformHeatmapRenderableSeries) and a HeatmapColorMap object arranged in a two column grid. It is basically the same as the “Heatmap Chart” in the examples app.
I need to export the graph and the colormap legend into two bitmaps. This works flawlessly with the heatmap itself using the SciChartSurface.ExportToBitmapSource() function.
However there is no such a function for the HeatMapColormap as it is not the child of the SciChartSurface.
I tried the workaround mentioned in an old question here in the forums. export Colormap However the suggested solution does not work. If use WPF RenderTargetBitmap() function to make a bitmap from the visual element, the result is in an empty image with the size of the HeatMapColorMap.
How can I grab the HeatMapColormap object and export it using RenderTargetBitmap?
Here is the code which exports the image:
public void exportColorMap()
{
HeatmapColorMap cmap = (HeatmapColorMap)FindName(“colorMap”);
cmap.UpdateLayout();
RenderTargetBitmap rtb = new RenderTargetBitmap((int)cmap.RenderSize.Width, (int)cmap.RenderSize.Height, 96, 96, PixelFormats.Pbgra32);
using(FileStream stream = new FileStream(“image.png”, FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
encoder.Save(stream);
}
}
- Peter Posfay asked 11 months ago
- last active 10 months ago
Hi,
We are using pie chart which is not very high, only 200 px. If the outside labels are shown the chart is very small. I have already set the SegmentOuterSpacing=0. Is there any way to adjust the distance between the labels and the chart so that the labels would be closer to the chart?
- Boštjan Arzenšek asked 11 months ago
- last active 10 months ago
I isolated the source of the memory leak I was debugging on iOS to whether or not the labels are enabled in version 4.6.0.5945. The leak is only present in the latest version. Reverting back to 4.5.0.5903 with re-enabled the axis labels, I do not experience the memory leak. I am plotting real time data points about as quickly as they can be received over BLE on iOS to exercise this leak. Screenshots are attached of same code running against 4.6.0.5945 and 4.5.0.5903.
“`
private func setupChart() {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
SCIUpdateSuspender.usingWith(self.surface) {
// Clear everything first
self.surface.xAxes.clear()
self.surface.yAxes.clear()
self.surface.renderableSeries.clear()
self.lineDataSeries.removeAll()
// Apply theme based on dark mode setting
self.updateTheme()
// Setup axes
let xAxis = SCIDateAxis()
if let label = self.xAxisLabel {
xAxis.axisTitle = label
}
xAxis.autoRange = .always
// EXPERIMENT: Disable axis labels to test for memory leak
let xExperiment = true
xAxis.drawLabels = xExperiment
xAxis.drawMajorTicks = xExperiment
xAxis.drawMinorTicks = xExperiment
let yAxis = SCINumericAxis()
yAxis.autoRange = .always
yAxis.scientificNotation = .normalized
if let label = self.yAxisLabel {
yAxis.axisTitle = label
}
// EXPERIMENT: Disable axis labels to test for memory leak
let yExperiment = true
yAxis.drawLabels = yExperiment
yAxis.drawMajorTicks = yExperiment
yAxis.drawMinorTicks = yExperiment
self.surface.xAxes.add(items: xAxis)
self.surface.yAxes.add(items: yAxis)
// Create renderable series for each column (if we know how many)
if self.actualColumns > 0 {
for i in 0..<(self.actualColumns-1) { // -1 because first column is timestamps
let series = SCIXyDataSeries(xType: .date, yType: .double)
series.fifoCapacity = self.fifoCapacity // Use the class property
// Use provided config if available, otherwise generate default
let config: LineSeriesConfig
if let configs = self.providedLineConfigs, i < configs.count {
config = configs[i]
series.seriesName = config.name
} else {
config = LineSeriesConfig(
name: “Channel (i+1)”,
color: self.defaultColor(for: i),
thickness: 2.0
)
series.seriesName = config.name
}
let lineSeries = SCIFastLineRenderableSeries()
lineSeries.dataSeries = series
lineSeries.strokeStyle = SCISolidPenStyle(color: config.color, thickness: config.thickness)
self.lineDataSeries.append(series)
self.surface.renderableSeries.add(lineSeries)
}
// Initialize modifiers
self.updateModifiers(showLegend: self.showLegend, showInspect: self.showInspect)
}
}
}
}
“`
Instruments showed leaked memory coming from SciChart:
_malloc_type_calloc_outlined
class_createInstance
+[_CTNativeGlyphStorage newWithCount:capacity:]
TTypesetterAttrString::Initialize(__CFAttributedString const*, bool)
TTypesetterAttrString::TTypesetterAttrString(__CFAttributedString const*, __CFDictionary const*, bool)
CTFramesetterCreateWithAttributedString
DrawAttributedString /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Core/Utility/NativeCategories/CoreGraphicsExtensions.h:56
-[SCIDrawableText p_SCI_drawToCGContext:attributedString:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Drawing/Common/SCIDrawableText.m:140
-[SCIDrawableText tryDrawToCGContext:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Drawing/Common/SCIDrawableText.m:134
-[SCIAxisTickLabelsRendererComponent p_SCI_drawTickLabelsOnCGContext:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Axes/AxisRenderers/AxisTickLabelsRenderers/SCIAxisTickLabelsRendererComponent.mm:133
-[SCIAxisTickLabelsRendererComponent onDrawWithContext:andAssetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Axes/AxisRenderers/AxisTickLabelsRenderers/SCIAxisTickLabelsRendererComponent.mm:103
-[SCIDefaultAxisRenderer onDrawWithContext:andAssetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Axes/AxisRenderers/SCIDefaultAxisRenderer.m:0
-[SCIAxisBase onDrawAxisWithContext:andAssetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Axes/SCIAxisBase.mm:552
-[SCIAxisBase onDrawWithContext:andAssetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Axes/SCIAxisBase.mm:546
-[SCIRenderSurfaceRenderer p_SCI_drawAxes:assetManager:axes:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Rendering/SCIRenderSurfaceRenderer.m:467
-[SCIRenderSurfaceRenderer p_SCI_drawAxesWithContext:assetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Rendering/SCIRenderSurfaceRenderer.m:0
-[SCIRenderSurfaceRenderer p_SCI_drawWithContext:assetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Rendering/SCIRenderSurfaceRenderer.m:305
-[SCIRenderSurfaceRenderer p_SCI_renderLoop:assetManager:renderPassState:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Rendering/SCIRenderSurfaceRenderer.m:97
-[SCIRenderSurfaceRenderer onDrawWithContext:andAssetManager:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Charting/Visuals/Rendering/SCIRenderSurfaceRenderer.m:87
-[SCIRenderSurfaceDrawable2D drawFrameIn:withDrawableSize:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Drawing/Twister/SCIRenderSurfaceDrawable2D.mm:54
-[SCITwisterRendererBase drawFrameIn:withDrawableSize:] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Drawing/Twister/SCITwisterRendererBase.mm:92
-[SCIMetalRenderSurfaceBase draw] /Users/andrewburnett-thompson/Documents/buildAgent/work/f9370f90a7c5ff8f/dev_root/iOS/src/SciChartFramework/SciChart/Drawing/Metal/SCIMetalRenderSurfaceBase.m:131
-[CALayer display]
- Jacob Trueb asked 11 months ago
- last active 4 months ago
I have created a default axis style for 2d chart(below), I find if I want to binding the “Stroke” property in MajorTickLineStyle, it will report
“Cannot find source for binding with reference ‘RelativeSource FindAncestor, AncestorType=’scichartWrapper.TwoDSciChart’, AncestorLevel=’1”. BindingExpression:Path=MajorTickColor; DataItem=null; target element is ‘Line’ (Name=”); target property is ‘Stroke’ (type ‘Brush’)”. But the “AxisBandsFill” binding can work.Does MajorTickLineStyle support binding Line’s Stroke property?
- ling yang asked 11 months ago
- last active 6 months ago
Hello!
I am working on a project that renders three different RenderableSeries on one plot.
I have ColumnRenderableSeries, to display bars (each bar is data average), HlcDataSeries to display error bars, and XyScatterRenderableSeries to display individual data points (see attached image).
ColumnRenderableSeries and XyScatterRenderableSeries have associated tooltips. I create tooltips by using a custom IPointMetadata implementation that I assign to each datapoint in my viewmodel. I then use TooltipModifier.TooltipTemplate in XAML to set DataTemplate for the tooltip.
The issue I am having is that when I hover my mouse over a XyScatterRenderableSeries item that is stand-alone it shows the tooltip for this point from XyScatterRenderableSeries. However, when I hover my mouse over XyScatterRenderableSeries item that is rendered on top of a bar from ColumnRenderableSeries it shows the tooltip for the bar.
In my viewmodel XyScatterRenderableSeriesViewModel is added last. Hence, the scatter plot should be rendered on top of everything else. From the view it appears to be the case.
However, I am still not sure why z-order for tooltips is different.
I will try to create a small sample project if it is helpful.
- Alexander Gdalevich asked 11 months ago
- last active 5 months ago
When SciChart with numeric axes is placed in a window, which size is defined by its content, then the axis ticks are drawn completely wrong.
Is there a work around other than defining a fix size (which I don’t want in my scenario)?
Example code (simple WPF .net 8.0 application):
- Henning Dampel asked 11 months ago
- last active 6 months ago
Hello!
Can someone suggest a workaround for zoom with two fingers on touchscreen device so that ratio kept fixed (uniform zoom)?
Current init snippet:
sciChartSurface.chartModifiers.add(new ZoomPanModifier({
enableZoom: true
}));
Many thanks
- Manfred Wieser asked 11 months ago
- last active 11 months ago
This is the chart that is normally displayed
![]()
This is the chart that displayed after I set the VisibleRange of the Z-axis
![]()
VisibleRange works fine for 2D charts, but it doesn’t seem to work for 3D.
- anders chen asked 11 months ago
- last active 9 months ago
Hello support team,
We encountered some minor issues during the trial.
I put together a PDF to explain it and attached relevant examples.
examples:https://drive.google.com/file/d/1GPysTclcbWEbJrF4fcSKbP17tZYd5Xel/view?usp=sharing
- 昱文 邹 asked 11 months ago
- last active 11 months ago
Does SciChart support AvaloniaUI?
Is it also possible to use it in flutter?
- Jin Taeic asked 11 months ago
- last active 2 months ago
Hello,
I added a ZoomExtentsModifier3D to the chart via code, but it didn’t work as expected.
Here is the code I used. Attached is the sample code.
var modifierGroup = new ModifierGroup3D();
var zoomExtentsModifier = new ZoomExtentsModifier3D
{
ExecuteOn = ExecuteOn.MouseDoubleClick
};
modifierGroup.ChildModifiers.Add(zoomExtentsModifier);
var mouseWheelZoomModifier = new MouseWheelZoomModifier3D();
modifierGroup.ChildModifiers.Add(mouseWheelZoomModifier);
var orbitModifier = new OrbitModifier3D();
modifierGroup.ChildModifiers.Add(orbitModifier);
SciChart.ChartModifier = modifierGroup;
- anders chen asked 11 months ago
- last active 11 months ago
Hello,
I used sciChart.ExportToFile(Path.Combine(“D:\\1.png”), ExportType.Png, false, new System.Windows.Size(600, 300)); this way to export a PNG, but after exporting the image found that The legend is not correct, please tell me how to solve this problem, the zip file is the test code I use
- li xiaohang asked 11 months ago
- last active 9 months ago
I write a sci chart demo, and I want to hide pointmarker. But when I set pointmarker visibility to false in xaml or source codes, the pointmarker always show.
Xaml:
- ling yang asked 11 months ago
- last active 11 months ago
I’m utilizing the MVVM pattern for creating a heatmap that is used to update data in real time. One thing that I need to do however is dynamically adjust the size of the matrix that is being updated. For examples I can start with a matrix that is [500,600] but then part way through I want to adjust the size so that it is [300, 400]. Currently it seems the only way I am able to do this is if I completely reinitialize the series again instead of resizing the data array that I pass to the series. Is there another way to do this? Or am I doing something incorrectly? I’ve attached a screenshot for how I am setting up the series and assigning it to the
ObservableCollection.
- Anthony Eshleman asked 11 months ago
- last active 11 months ago
Hi,
our application craches with high CPU usage and endless memory consumption after panning and zooming in a heatmap chart. I paused the application in debug mode and see an infinite loop in the SciChart AxisBase class:

How to reproduce:
– Pan slightly outside the data range on the X and Y axes.
– Zoom into a valid area.
With version 8.7 it hung in an infinite loop in the SciChart NumericTickProvider class in the method CalculateTicks…
- Tobias asked 11 months ago
- last active 11 months ago
Hello,
We are trying to create a heatmap where no colors are interpolated, however there is no option to fully disable interpolation as in WPF library.
Below we provide a codepen example to illustrate that it always interpolates between colors:
https://codepen.io/acl-private/pen/YPPdvvM
For us the precision is really important and we cannot manipulate the gradient offsets in gradientStops array. If we do this, it will still interpolate between red and blue since we already have values between 0.49 and 0.5.
gradientStops: [
{ offset: 0, color: "red" },
{ offset: 0.50 - 0.01, color: "red" },
{ offset: 0.50, color: "blue" },
{ offset: 1.00, color: "blue" }
]
- Zino As asked 11 months ago
- last active 3 months ago
Hi,
I am looking fora functionality in which I can draw an SVG based on certain x,y poistion in the heatmap.
I have a list of pixel locations and would like to generate annotation based on the pixel location for which I need a reverse calculator which will give me the location of the pixel e.g. x:21 y:43 in a 2D heatmap.
I know that there is a Axiscore calculator (calc.getCoordinate(1.23)) which can give co-ordiantes, but it seems that is based on datavalue and not the location.
As seen on image, I have location on the pixels but i need to draw a line around the pixels in SVG format for which I need the pixel valie at each location.
- pramod butte asked 12 months ago
- last active 12 months ago
Hello,
I am using autoRange always for a yAxis and when changing the xAxis visibleRange it will sometimes change the yAxis visibleRange to {min: 0, max: 10}. I know this is the default visible range so there may be something wrong with the data where the auto range is throwing some sort of error but I am unable to check and see what exactly is wrong. Attached is a video demonstration.
Is there way for me to see how autoRange.Always works? If its a data issue then we can try and sort that out but since the docs don’t show how autoRange.Always works I have no idea what is being checked and how it is determining the min and max.
Thank you,
Preston Truong
- preston truong asked 12 months ago
- last active 12 months ago
Incorrect Rendering of FastErrorBarsRenderableSeries with NaN values
Hello, I’ve encountered the following issue!
Description: When adding a FastErrorBarsRenderableSeries to a chart that already has rendered candles, and then trying to render dynamic data with empty values (NaN) by calling the method this.hlcDataSeries.append(point.time, NaN, NaN, NaN), the main line behaves incorrectly. It becomes flattened, and the minimum range on the Y-axis increases unexpectedly.
Here is a screenshot of how it looks in our application.
https://imgur.com/ztNk9zr
And how canldes looks after FastErrorBarsRenderableSeries was added
https://i.imgur.com/1RPiKbY.png
I checked your example on CodeSandbox, where FastErrorBarsRenderableSeries is used, and it seems that the bug repeats when NaN values are dynamically added to the data series. I’m attaching a link to my fork on CodeSandbox. Please check how the line renders on the chart when there’s no data(NaN) for FastErrorBarsRenderableSeries, then uncomment the code and check how the line behaves ater data were appended.
My fork of your example: https://codesandbox.io/p/sandbox/error-bars-chart-forked-jchtcx?file=%2Fsrc%2FdrawExample.ts
Live example from documentation: https://demo.scichart.com/javascript/error-bars-chart
- Sergey Chernyakov asked 12 months ago
Hello,
We are using combination of Y stacked axes and heatmap chart. As you can see in image attachment tnts series number. As workaround we tried to limit VisibleRange. That worked only when we have small amount of series, 5-30 and in this case we have 29 and you can see it is not working.
Anyone have idea what could be roto cause of this issue?
I will send you code snippet here.
XAML:
<!--<s:RolloverModifier ShowTooltipOn="Always" IsEnabled="False"
ShowAxisLabels="False" DrawVerticalLine="False"/>-->
C#
Function we use for creating dataserie:
private IDataSeries CreateDataSeries(Guid measurementId, string measurementName,
double[] yValues, double[] xValues, int width,
int height, double cpMax, int step) {
var data = new double[height, width];
var metaData = _measurementsService.GetMetaData(measurementId);
var metaDatas = new IPointMetadata[step + 1, width];
var startPosition = double.Round(xValues.Min(), 2);
var endPosition = xValues.Max();
var stepSize = endPosition / width;
Debug.WriteLine(
$
"CreateDataSeries: step: {step}, startPosition:{startPosition}, "
"endPosition:{endPosition}, stepsize:{stepSize}");
for (var x = 0; x & lt; width; x++) {
var zValue = yValues[x];
data[0, x] = (zValue & gt; cpMax) ? cpMax : zValue;
if (double.IsNaN(zValue)) {
data[0, x] = double.NaN;
}
metaDatas[step, x] =
new HeatmapDataSeriesMetadata(measurementName, measurementId);
}
return new UniformHeatmapDataSeries& lt;
double, double, double& gt;
(data, startPosition, stepSize, step, 1, metaDatas){Tag = measurementId};
}
public
HeatmapColorPalette CreateHeatmapColorPalette(double minZValue,
double maxZValue,
ColorPalette colorPalette) {
var colors = _colorPaletteHandler.GetColorList(colorPalette);
var gradientStops =
colors.Index()
.Select(x = > new GradientStop{
Color = x.Value, Offset = (double)x.Key / (colors.Count - 1)})
.ToArray();
return new HeatmapColorPalette(){
Minimum = minZValue,
Maximum = maxZValue,
GradientStops = new System.Collections.ObjectModel.ObservableCollection(
gradientStops),
};
}
public List CreateSeries(IList measurementList, HeatmapColorPalette palette) {
var height = measurementList.Count;
var length = measurementList.FirstOrDefault() ?.XValues.Length ? ? 0;
//--- this means that our x values are not of same length which automatically
// disallows operations
if (measurementList.Any(x = > x.XValues.Length != length)) {
return [];
}
// Calculate the minimum and maximum Z values from the measurementList
var minZValue = measurementList.SelectMany(m = > m.YValues).Min();
var maxZValue = measurementList.SelectMany(m = > m.YValues).Max();
var seriesList = new List();
var counter = 0;
foreach (var measurementDto in measurementList) {
seriesList.Add(new UniformHeatmapRenderableSeriesViewModel(){
DataSeries = CreateDataSeries(
measurementDto.Id, measurementDto.Name, measurementDto.YValues,
measurementDto.XValues, length, 1, maxZValue, counter),
ColorMap = palette, DrawNaNAs = LineDrawMode.Gaps,
DrawTextInCell = true, Tag = measurementDto.Id,
YAxisId = measurementDto.Id.ToString(),
UseLinearTextureFiltering = true,
IsVisible = measurementDto.IsVisible});
counter += 1;
}
Debug.WriteLine($ "Create serie: maxZValue:{maxZValue}");
Debug.WriteLine($ "Create serie: length:{length}");
return seriesList;
}
Finally this is how we initialize axes.
public void InitializeAxes(HeatmapChartViewModel vm, GroupViewOptions groupViewOptions,
List measurements, double rangeoffset = 0) {
vm.XAxisTitle = groupViewOptions.XAxisText;
vm.YAxisTitle = groupViewOptions.YAxisText;
// vm.XAxes.Clear();
vm.YAxes.Clear();
if (vm.XAxes.Count == 0) {
vm.XAxes.Add(new NumericAxisViewModel{
Id = XNumericAxis,
StyleKey = XAxisStyleKey,
AxisTitle = vm.XAxisTitle,
FontSize = groupViewOptions.AxisLabelFontSize,
TitleFontSize = groupViewOptions.AxisTitleFontSize,
DrawMinorGridLines = false,
DrawLabels = true,
CursorTextFormatting = "0.###",
TextFormatting = "0.########",
MajorGridLinesBrush = new SolidColorBrush(Colors.Fuchsia),
BorderBrush = new SolidColorBrush(Colors.Fuchsia),
VisibleRangeLimitMode = SciChart.Data.Model.RangeClipMode.MinMax,
});
}
var counter = 0;
foreach (var measurement in measurements) {
var axis = new NumericAxisViewModel{
Id = measurement.Id.ToString(),
StyleKey = YAxisStyleKey,
AxisTitle = $ "{counter + 1}",
FontSize = 8,
DrawMajorTicks = false,
DrawMinorGridLines = false,
DrawMinorTicks = false,
DrawLabels = false,
TextFormatting = "0.###",
MajorGridLinesBrush = new SolidColorBrush(Colors.Fuchsia),
AxisAlignment = AxisAlignment.Left,
BorderBrush = new SolidColorBrush(Colors.Red),
VisibleRangeLimitMode = SciChart.Data.Model.RangeClipMode.MinMax,
VisibleRange =
new DoubleRange(counter, (counter + 1) - (0.02 + rangeoffset)),
VisibleRangeLimit =
new DoubleRange(counter, (counter + 1) - (0.02 + rangeoffset)),
};
vm.YAxes.Add(axis);
counter++;
}
}
- Filip Kristo asked 12 months ago
- last active 11 months ago
As title.
I am using SciChart3DSurface and added a FreeLookModifier3D into SciChart3DSurface.ChartModifier. My customer asked to control camera view by using arrow keys, not AWSD keys. I tried to set value to “Up”/”Down”/”Left”/”Right” but not working. Also tried "{x:Static Key.Left}" etc. but didn’t work either. How to set it correctly?
- Derek Lin asked 1 year ago
- last active 12 months ago
Hello
I am using RolloverModifier to show annotations for FastLineRenderableSeries.
This is working fine for limited number of series, but my chart renders thousands of series at the time.
When RolloverModifier is enable performance and FPS drastically drop.
What I really need is to show tooltip only for one iteration (selected by user), because of that I’ve made custom class that extends RolloverModifier
class CustomRolloverModifier extends RolloverModifier {
getIncludedRenderableSeries() {
const series = super.getIncludedRenderableSeries();
return series.filter((rs) => rs.dataSeries.id === mySelectedID);
}
It works in a way, because only one tooltip is shown, but the performance is still bad and the chart becomes very laggy.
Is there anything else I can do with this? Maybe something else in RolloverModifier that should be customized to achieve better performance for single tooltip?
- Cezary Szymanski asked 1 year ago
- last active 12 months ago
If I am working with a chart (JS), and I create two annotations on the same chart, it appears that the second one created later is on a “layer” above the first one created, for purposes of selection.
This causes some confounds:
-
If I create an “isEditable” BoxAnnotation with, for example, x1=4, y1=4, x2=7, y2=7, then create a second “isEditable” BoxAnnotation with x1=0, y1=0, x2=10, y2=10, the second annotation completely “covers” the first one, and the first annotation becomes un-selectable and un-editable.
-
If I were to configure a chart so I can click and drag to draw a box, and try to draw a SMALLER BoxAnnotation on top of a LARGER BoxAnnotation (starting by clicking inside the larger box’s range), the larger box, if isEdited=true, becomes selected, and drags with the cursor as I try to drawn the smaller box.
Is it possible to control which annotations are “layered” above which other annotations, aside from by the order you add them to the charts? I.e. some kind of “bring to front/send to back” method?
How would you recommend handling a situation where multiple edit-able annotations (BoxAnnotations, for example) occupy the same space and “block” each other from being selected?
- Mark Wieczorkowski asked 1 year ago
- last active 12 months ago
Greetings,
I would like to better understand how to measure render time when painting data SciChart.
We’re benchmarking our apps and one of the apps displays charts with live data (data are being received via websocket). I’m trying to measure render time for each received message, so how long does it take for a message (a single message typically includes a range of datapoints) to be displayed on the screen.
Following is roughly how I currently measure it:
let scheduledMessages = [];
function measureRenderTime(start) {
if (scheduledMessages.length > 0) {
scheduledMessages.push(start);
return;
}
scheduledMessages.push(start);
// wait for the next frame to be drawn
requestAnimationFrame(() => {
// wait for the style and layout calculations to be done
setTimeout(() => {
const end = performance.now();
scheduledMessages.forEach((start) => {
const renderTime = end - start;
// ...do something with the measurement
});
scheduledMessages = [];
});
});
}
function onWsMessage(message) {
const start = performance.now();
xyDataSeries.appendRange(message.x, message.y);
measureRenderTime(start);
}
This code assumes, that once xyDataSeries.appendRange is done, the next frame will include (i.e. paint) the appended range. Is that correct or is there a better way to measure render time?
Thank you,
Timo
- Timo Betina asked 1 year ago
- last active 12 months ago
Hi,
If I have two “SurfaceMeshRenderableSeries3D”, one as “WireFrame” and the other one as “SolidMesh”, the antialiasing of the “WireFrame” as good as expected.
I have one screenshot and a demo project.
Within the screenshot you can see in the left red box that the wire frame part, which should not be visible, shines through. In the other red box the blue lines are filled with many white lines.
- Nick Müller asked 1 year ago
- last active 12 months ago
I was confused by the model’s pramaters When I try to use Cylindroid Chart.
In the demo, only Params of A/B/H are required, and set the A=B=150, H=200, and I plot some typical case as below to understand this type of cylindroid dataseries, especially the meaning of point’s value, I assume that it means the offset from the right circle.
case 1:
meshDataSeries[v, u] = 0;
I set all points’ value as zero, that means (I guess) it should plot a right cylinder, the result(case1.png) seems right.
case 2:
meshDataSeries[v, u] = delta;//delta=50
I set all points’ value with an offset of 50, I expect it should plot a right cylinder with radius=200. the chart result(case2.png) is very odd, the edge of side view I expected should be a vertical line (blue one), but it seems a curve (purple one), however the heatmap seems correct as all points with a same value
case 3:
meshDataSeries[v, u] = -meshDataSeries.A;
I set all points’ value with an offset of -meshDataSeries.A, I expect it should plot a vertical line (blue one in case3.png), but it plots an odd chart.
please try the demo and input the number and load the case.
- Zhan Wang asked 1 year ago
- last active 1 year ago
I have X axis time data that is in UTC time. I already looked at The DateTimeNumericAxis documentation.
Is there any property to transform the times to local? Or should I just present the bound data in Local Time (convert in code).
Thanks!
- Lenny H asked 1 year ago
- last active 1 year ago
Hi,
I use Mvvm to draw series ,the code like :
ChartModel1.Series.Clear();
ChartModel1.DrawSeries(GetDataX(), GetData(),"TestDataSeriesLoadingAutoFitDataSeriesNull");
ChartModel1.AutoFitModifier.FitRange();
ChartModel1 had a SeriesBinding ICollection Series And a Modifier named AutoFitModifier use to fit the xy range, and the DrawSeries will add a IRenderableSeriesViewModel to the collection .
When I clear and add the series and invoke the FitRange:
FitRange Code
using (ParentSurface.SuspendUpdates())
{
var allSeries = ParentSurface.RenderableSeries.Where(x => x.IsVisible).ToList();
Trace.Assert(allSeries.Count > 0);
Trace.Assert(allSeries.All(x => x.DataSeries != null));
}
allSeries has one series is FastLineRenderableSeriesForMvvm, but it DataSeries is null ,and it datacontext is right.
So, I want to know when the DataSeries setted and can be used in Modifier, or is there any method to set DataSeries automatic?
- wei zhao asked 1 year ago
- last active 1 year ago
I want to create a 3d point cloud with 3 views (top,front,side), but I want each view to always show the highest ‘value’ datapoint in that location in front from that viewpoint. For instance for the ‘top view’ projection, I would like for all datapoints at a certain X,Y coordinate to see the one with the largest value. Also if I limit the Z range, it may be updated to be another datapoint of the complete set. Currently I calculate this on the graphics card and create a heatmap for each view, but I was wondering if Scichart has a builtin feature for this (for instance in the 3D charts?). This would have to work with large datasets (+10m points).
- Bart Arts asked 1 year ago
- last active 1 year ago
I am having an issue with the ticks and the labels in the log axis ticks. Currently the tick looks like the photo attached below . I tried a custom tick provider as well but it doesn’t seem to work. How ever the labels are spaced nicely when the visible range is 1 to 100_000_000 , my current data has a range of 1 to 10000 which isn’t that low for the axis labels to be like they are now .
- Shivansh Adhikari asked 1 year ago
- last active 12 months ago
I am engaged in the task of displaying ECG data.
The amount of data to display is more than 1000 values added to the graph per second.
The graph works according to the fifo (cyclical) model.
The number of points displayed on the graph strictly depends on the number of seconds that fit into the graph.
For example:
The frequency of ECG recording is 1000 values per second.
1 second of time takes 30 pixels, respectively, but with a graph width of 600 (minus the labels of the Y and X axes), 20 seconds or 20,000 values will be displayed.
The data is added in batches, with a certain interval, for example 100ms.
When passing the first circle, everything is correct, however, at 2, 4, 6, 8, and so on, I get a flickering graph.
A point on the graph starts jumping to the beginning of the graph, and the erased circle begins to overlap with a new circle.
How to solve a similar problem?
- Aleks R asked 1 year ago
- last active 1 year ago

