I’m experimenting with creating a CustomRenderableSeries.
I was expecting VisualXcceleratorRenderSurface to perform the fastest. But what I am finding is that it is noticeably slower than XamlRenderSurface. By slower, I mean interaction with zoom/pan becomes choppy and resizing the window is choppy. Which is surprising because I’m really not rendering much at all.
We plan on rendering a lot more than this, but it already appears to struggling. Can you shed some light?
public class MyDataSeries : XyDataSeries<double>
{
public MyDataSeries()
{
}
}
public class MyRenderableSeries : CustomRenderableSeries
{
public MyRenderableSeries()
{
}
protected override void Draw(IRenderContext2D renderContext, IRenderPassData renderPassData)
{
base.Draw(renderContext, renderPassData);
if (DataSeries is not MyDataSeries series)
return;
using (var brush = renderContext.CreateBrush(Brushes.Red))
using (var pen = renderContext.CreatePen(Colors.Black, true, 1))
{
for (int i = 0; i < series.Count; ++i)
{
double pos = (double)series.XValues[i];
var x = renderPassData.XCoordinateCalculator.GetCoordinate(pos);
var y = renderPassData.YCoordinateCalculator.GetCoordinate(pos);
var s = renderPassData.XCoordinateCalculator.GetCoordinate(0) - renderPassData.XCoordinateCalculator.GetCoordinate(1);
var points = CreateCircle(new Point(x, y), s);
renderContext.FillPolygon(brush, points);
}
}
}
private List<Point> CreateCircle(Point pos, double radius)
{
var points = new List<Point>();
int count = 1000;
for (int i = 0; i < count; ++i)
{
double angle = (360.0 / count * i) * (Math.PI / 180);
double x = Math.Cos(angle) * radius;
double y = Math.Sin(angle) * radius;
points.Add(new Point(pos.X + x, pos.Y + y));
}
points.Add(points[0]);
return points;
}
}
public class MyRenderableSeriesViewModel : BaseRenderableSeriesViewModel
{
public override Type ViewType => typeof(MyRenderableSeries);
}
public class MyViewModel : BaseViewModel
{
public List<IRenderableSeriesViewModel> RenderableSeriesViewModels { get; }
public MyViewModel()
{
RenderableSeriesViewModels = new List<IRenderableSeriesViewModel>
{
Generate(Enumerable.Range(0, 25).Select(x => (double)x).ToArray()),
};
}
private IRenderableSeriesViewModel Generate(double[] data)
{
var dataSeries = new MyDataSeries();
dataSeries.Append(data, data);
return new MyRenderableSeriesViewModel
{
DataSeries = dataSeries,
StyleKey = "mySeriesStyle"
};
}
}
<UserControl x:Class="SciChart.Examples.Examples.SeeFeaturedApplication.Histogram.ViolinView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:s="http://schemas.abtsoftware.co.uk/scichart"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SciChart.Examples.Examples.SeeFeaturedApplication.Histogram"
mc:Ignorable="d">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/SciChart.Charting;component/Themes/Default.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type local:MyRenderableSeries}"
BasedOn="{StaticResource MvvmDefaultRenderableSeriesStyle}"
x:Key="mySeriesStyle">
</Style>
</ResourceDictionary>
</UserControl.Resources>
<s:SciChartSurface x:Name="SciChart"
RenderableSeries="{s:SeriesBinding RenderableSeriesViewModels}">
<s:SciChartSurface.RenderSurface>
<s:VisualXcceleratorRenderSurface />
</s:SciChartSurface.RenderSurface>
<s:SciChartSurface.XAxis>
<s:NumericAxis />
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis />
</s:SciChartSurface.YAxis>
<s:SciChartSurface.ChartModifier>
<s:ModifierGroup>
<s:ZoomPanModifier />
<s:RubberBandXyZoomModifier ExecuteOn="MouseRightButton" />
<s:ZoomExtentsModifier ReceiveHandledEvents="False" />
<s:MouseWheelZoomModifier />
</s:ModifierGroup>
</s:SciChartSurface.ChartModifier>
</s:SciChartSurface>
I have tested this on 3 machines, and all show the same behaviour.
**VisualXcceleratorEngine: Creating VisualXcceleratorRenderSurface Visual Xccelerator Engine v7.0.1.27055
GPU Capability Test ### Is BGRA feature required: TRUE
Examining Graphics Adapter: Intel(R) Iris(R) Xe Graphics VRAM:
128Mb DeviceId: 39497Visual Xccelerator Engine Direct3D9 Compatibility
Determines whether the adapter is blacklisted due to its unstable work… FALSE
Trying to create Direct3D9 Device… SUCCESSVisual Xccelerator Engine Direct3D11 Compatibility
Trying to create Direct3D9Ex Device (WPF Compatibility)… SUCCESS
Trying to create Direct3D11 Device… SUCCESSRank: 3000128 Points
Examining Graphics Adapter: NVIDIA T500 VRAM: 1928Mb DeviceId:
8123Visual Xccelerator Engine Direct3D9 Compatibility
Determines whether the adapter is blacklisted due to its unstable work… FALSE
Trying to create Direct3D9 Device… FAILEDVisual Xccelerator Engine Direct3D11 Compatibility
Trying to create Direct3D9Ex Device (WPF Compatibility)… FAILED
Trying to create Direct3D11 Device… SUCCESSRank: 3001928 Points
Examining Graphics Adapter: Microsoft Basic Render Driver VRAM: 0Mb
DeviceId: 140Visual Xccelerator Engine Direct3D9 Compatibility
Determines whether the adapter is blacklisted due to its unstable work… FALSE
Trying to create Direct3D9 Device… FAILEDVisual Xccelerator Engine Direct3D11 Compatibility
Trying to create Direct3D9Ex Device (WPF Compatibility)… FAILED
Trying to create Direct3D11 Device… SUCCESSRank: 2000000 Points
Selected Graphics Adapter, where DeviceId is: 8123 Is Direct3D9
Supported: FALSE Is Direct3D11 Supported: TRUE Is Blacklisted:
FALSEPlease find the log file here:
C:\dev\TestApps\SciChart_Violin\bin\Debug\net6.0-windows\GpuCapability.log**VisualXcceleratorEngine: SUCCESS! VisualXcceleratorRenderSurface: attempt to initialize the engine with parameters: Use Direct3D9 –
False
- Ben Green asked 2 months ago
- last active 2 weeks ago
Hi Scichart Team.
I am working on the MouseWheelZoomModifier (EActionType.Pan).
But my users are using a trackpad (apple magic trackpad).
Currently, they are using 2 fingers and move up or down (vertically) to pan the chart. But they are asked to pan the chart by using 2 fingers and move left or right (horizontally) instead.
Do we have any setting for MouseWheelZoomModifier that help me pan the chart by that way?
- TRUONG LE asked 2 months ago
- last active 2 months ago
By following this example to create reusable SciChart component in React:
https://www.scichart.com/documentation/js/current/TutorialReusableReactComponent.html
The chart cannot be created when run in dev mode. But it works well under production mode. I think it’s because React renders components twice in strict mode. It seems that SciChart got problems to create chart with the following logic when running the application in dev mode. Is this true? Or I missed anything?
useEffect(() => {
const chartInitializationPromise = props.initChart(rootElementId).then((initResult) => {
sciChartSurfaceRef.current = initResult.sciChartSurface;
return initResult.sciChartSurface;
});
const performCleanup = () => {
sciChartSurfaceRef.current.delete();
sciChartSurfaceRef.current = undefined;
};
return () => {
// check if chart is already initialized or wait init to finish before deleting it
sciChartSurfaceRef.current ? performCleanup() : chartInitializationPromise.then(performCleanup);
};
}, []);
- Quyen Sy asked 2 months ago
- last active 1 month ago
I have a chart with stacked xAxes, and I am trying to calculate the stackedLength of each xAxis base on the total length or width available for the xAxes.
The issue come when I am changing the size of the screen or changing the width of the chart using flex-basis. When I do that, I get the error message in the picture below.
My question is, is there a way for me to listen/subscribe to the width change or get the latest width?
- Nung Khual asked 2 months ago
- last active 2 months ago
Greetings,
i have three Series in a SciChart.js (Community-Version) Surface.
The Legend i added shows me all three of them and their names and checkboxes do hide or show the series.
Here is my problem: Is there a way to hide one Series (a FastCandlestickRenderableSeries) from the Legend? I only want to show the other two Series (FastLinerenderableSeries).
Somethin like a Parameter “showInLegend: false,”? I did not find something like this in the documentation(https://www.scichart.com/documentation/js/current/typedoc/classes/legendmodifier.html).
Thank you
- Sebastian Affeld asked 2 months ago
- last active 1 month ago
I am considering applying server-side licensing for my javerScript application.
In the document below, there is a phrase “Our server-side licensing component is written in C++.”
(https://support.scichart.com/index.php?/Knowledgebase/Article/View/17275/7/scichartjs-domain-licensing-faq)
However, there is only asp.net sample code on the provided github.
(https://github.com/ABTSoftware/SciChart.JS.Examples/tree/master/Sandbox/demo-dotnet-server-licensing)
I wonder if there is a sample code implemented in C++ for server-side licensing.
Can you provide c++ sample code?
Also, are there any examples to run on Ubuntu?
- Donghwan Kim asked 2 months ago
- last active 1 month ago
I am working on a multithreaded application where the acquisition and chart display run on different threads. I am attempting to collect samples and plot only when I have 100 samples available to have less resource consumption and keep the application responsive. However, when I change the number of samples in the block, my FIFO capacity seems to change, allowing significantly less amount of samples than the ones I need. The current FIFO capacity should allow for at least 16 mins worth of data, but it only shows less than a second
If I set the block size to 1 (single sample appending) I obtain the results I need, but I am seeing performance issues in other areas of the program, hence the need of appending in blocks.
See the attachments for more clarity. Any suggestions?
EDIT: Adding code
private void DisplayNPD()
{
XyDataSeries<float, float> npdRawDataSeries = new XyDataSeries<float, float>();
int fifoSize = 1000000;
npdRawDataSeries.FifoCapacity = fifoSize;
npdRawData_RS.DataSeries = npdRawDataSeries;
double npdRaw = 0;
bool successfulDequeue = false;
int samplesQueued = 0;
int samplesInBlock = 100;
float[] rawSamples = new float[samplesInBlock];
float[] time = new float[samplesInBlock];
while (!ImagingSession.terminateThreads)
{
if (ImagingSession.laserOnOff && !graphRestarted)
{
int npdElementsInQueue = npdDisplayQueue.Count;
if (npdElementsInQueue > 0)
successfulDequeue = npdDisplayQueue.TryDequeue(out npdRaw);
if (successfulDequeue)
{
currentTime = graphStopwatch.ElapsedMilliseconds * 0.001;
time[samplesQueued] = (float) currentTime;
rawSamples[samplesQueued] = (float) (npdRaw * 1000);
samplesQueued++;
if (samplesQueued == samplesInBlock)
{
using (npdRawDataSeries.SuspendUpdates())
npdRawDataSeries.Append(time, rawSamples);
samplesQueued = 0;
if (currentTime > upperLimit)
{
lowerLimit = upperLimit;
upperLimit += xAxisWidth;
AdjustXAxis(currentHorizontalScale);
}
}
}
}
}
}
- Matthew Beatty asked 2 months ago
- last active 2 months ago
Hello,
I want to render a base64 image in ScichartJS without actually rendering it in DOM. I saw that you have these guides in WPF:
https://support.scichart.com/index.php?/Knowledgebase/Article/View/17213/34/
https://www.scichart.com/documentation/win/current/webframe.html#Screenshots,_Printing_and_Export_to_XPS.html
However it is difficult to achieve it in Typescript. Is there a guide or any ideas on how to do it? I would appreciate any answer.
- Zino As asked 2 months ago
- last active 2 months ago
Hello, I am using SciChartJS and have a new requirement from our users as follows that I need help with the implementation. Any pointers from anyone would be a great help.
**Requirements: **
- Assume that x-axis is Time and y-axis is prices.
- There are multiple series in the chart (e.g., Bid Price, Ask Price)
- Allow user to select a time on xAxis using
CTRL + CLICK
- When the user selects the time, show the rollover line and the tooltip for all series at the selected time
- This rollover line and tooltip should remain visible until the user selects a new time on the x-axis at which point the rollover tooltip should display the tooltip for the new point.
I started inheriting the RolloverModifier
but couldn’t find an appropriate method to show the tooltip.
So, I started implementing the above feature using CustomModifierBase2d
and adding a VerticalLineAnnotation
for the rollover line. But again, struggling with the tooltip.
If someone could help me out or give me pointers, that would be highly appreciated.
Best Regards,
Sachin Patel.
- sachin patel asked 2 months ago
- last active 1 month ago
I want to create two xAxis, the first one will be a normal xAxis and the second one will be an array of date ranges, but the issue then is that since all the xAxis are inside one array together, they all are stacked on top of each other.
I tried sciChartSurface.layoutManager.bottomOuterAxesLayoutStrategy = new BottomAlignedOuterHorizontallyStackedAxisLayoutStrategy(); but that only create all xAxis into one line of xAxis.
I want two line of xAxis, where the first one is normal, but second xAxis should be Horizontally Stacked Axis Layout.
The first image is before horizontal stacked is applied and the second after.
The third image show the xAxes array from sciChartSurface.xAxes, the index(0) of the array is the first xAxis, which should be normal, and the rest (index 1 – 8) should be horizontally stacked.
The horizontal stacked xAxis should be right below the first xAxis.
- Nung Khual asked 2 months ago
- last active 2 months ago
I used an IPointMarkerPaletteProvider to change the color of the bubble chart to a solid color. However, the circles are not smooth around the perimeter, and they look very stepped. The same thing happens when I set the AntiAliasing property of the FastBubbleRenderableSeries to True. How can I make it a smooth circle?
- sungchul park asked 2 months ago
- last active 2 months ago
I want the bubbles in my bubble chart to be one color with no gradient, and I also want to color the border line. How can I do this?
- sungchul park asked 2 months ago
- last active 2 months ago
Hi,
All MyGet systems which host the SciChart nuget feeds are down: https://status.myget.org/
Does someone know where to report this issue and how to get any more information on this downtime? E.g. is it planned and is there an estimate how long this is going to take?
Thanks!
- Christian Liebhardt asked 2 months ago
- last active 2 months ago
My application is written in .net 7 wpf using scichart will the application work on linux with scichart?
- Бектемир v asked 2 months ago
- last active 2 months ago
Hi there,
I am experiencing a problem with a license key error when I deployed the project to the staging environment.
Here are the steps I followed:
- I registered the domain and test domain on scichart.com/profile.
- I generated a runtime key.
- I included that key in the code base and then deployed it.
I have attached a screenshot below that shows the errors.
- Umer Nawaz asked 2 months ago
- last active 2 months ago
It seems to me that DateTimeNumericAxis has edge cases where it can’t calculate deltas for some ranges.
This results in a console error, and the chart not loading:
Error from chart in div date-axis-bug RangeError: Maximum call stack size exceeded
at get minTicks [as minTicks] (index.min.js:1:577149)
at a (index.min.js:1:577393)
at a (index.min.js:1:577567)
at a (index.min.js:1:577483)
at a (index.min.js:1:577567)
at a (index.min.js:1:577483)
at a (index.min.js:1:577567)
at a (index.min.js:1:577483)
at a (index.min.js:1:577567)
at a (index.min.js:1:577483)
Provided codepen: https://codepen.io/jrfv/pen/xxQawom
Any suggestions?
Thanks!
- João Velasques asked 2 months ago
- last active 2 months ago
Is it possible to draw a graph without passing values to other charts just by doing RenderableSeries.Add?
in WPF C#
- SEONG JEONGWOO asked 2 months ago
- last active 2 months ago
Hi, I’m looking for a way to programmatically dismiss a RolloverModifier from a chart. I’ve been tasked with creating a user experience that does two things: 1. when a user stops scrubbing on the chart, the rollover modifier should persist, and 2. when the user taps outside of the chart the rollover modifier should disappear.
I’ve accomplished the first part of the problem by implementing a subclass of SCIRolloverModifier and overriding the onEvent(args:)
function, but I cannot figure out how to dismiss the rollover modifier when the user taps outside the chart surface.
Is there a way to accomplish this?
- Tyler Williamson asked 2 months ago
- last active 2 months ago
I have a big problem with memory, i try many things but it’s doesn’t effect.
It’s my code for testing memory :
const { wasmContext, sciChartSurface } = await SciChartSurface.create("bandTest", { theme: new SciChartJSLightTheme() });
sciChartSurface.title = "Axis 1";
sciChartSurface.xAxes.add(new NumericAxis(wasmContext, { axisTitle: "Column number", axisTitleStyle: {fontSize: 12} }));
sciChartSurface.yAxes.add(new NumericAxis(wasmContext, { axisAlignment: EAxisAlignment.Left, axisTitleStyle: {fontSize: 12} }));
setTimeout(sciChartSurface.delete(),2000);
sciChartSurface.delete() have no effect for memory
I run snapshot without this code and another snapshot with this code. (snap 14 is before call SciChart and snap 15 is after call the code bellow)
What can I do?
Regards
- Marjorie lesage asked 2 months ago
- last active 1 month ago
I have a use case for a chart, that is a heatmap, which may also contain multiple series drawn on top, with multiple internal axis as well.
I can’t transform the data I receive, because that would be too slow, and it needs to maintain a speedy feeling, even when appending more data.
For this reason, when building the chart, I just flip the axis. The bottom axis is the Y axis, and the left axis it the X axis.
The multiple series that can be added (XyDataSeries), provide one extra axis each, and use one of the main axis.
We can think of them as horizontal or vertical series, depending if they use the main X axis, or the main Y axis.
When hovering over the chart, I want to show a tooltip, that shows for each series, their own axis value.
The issue — The normal CursorModifier, can’t correctly present a tooltip, for this case of mixed horizontal/vertical series. I’m not sure if there are configurations I’m missing, or if it is an actual uncovered edge case, hoping to get an answer on this.
To show what the issue is, and how I’m currently fixing it, please have a look at the codepen I made -> https://codepen.io/jrfv/full/zYMjEzP
Any tips on this, is it something scichart will fix eventually?
- João Velasques asked 2 months ago
- last active 1 week ago
How can i modify candlestick item so it will have rounded corners? Like in linked image
- daniil Pak asked 2 months ago
- last active 2 months ago
Greetings! I see you have support Xamarin.iOS and Xamarin.Android, however, I’m not sure about support status: do you support .NET 7 iOS and Android?
- Chihirov Chihirov asked 3 months ago
- last active 2 months ago
Hello,
tell me please, how can I add such indicators on yAxis. Maybe you have some example on sandbox for JS.
Thank you!
- Yevhenii Krasovskyi asked 3 months ago
- last active 1 month ago
Hello, help me please.
I have situations when all panels with different graphs are updated and after that all graphs are not displayed. The containers are not equivalent to the previous ones and I need to set up new divs. How can i do this?
- Yevhenii Krasovskyi asked 3 months ago
- last active 2 months ago
I created a simple .NET6 WPF application and added the SciChart assembly references. I call SciChartSurface.SetRuntimeLicenseKey(…) in App constructor and run the application. I get the following exception:
*System.TypeInitializationException: The type initializer for ‘njm’ threw an exception. Source=SciChart.Core
Inner Exception 1:
InvalidOperationException: babel m0 7238858: Method not found: ‘System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)’.
Inner Exception 2:
MissingMethodException: Method not found: ‘System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)’.*
Everything works well if I use SciChart in a .NET4.8 WPF application. How can I fix this? Thanks.
- Marius Cabas asked 3 months ago
- last active 3 months ago
Hello, i want to customize tooltip in graph (SplineBandRenderableSeries), i can change the tooltip content but if i return svg like your example ( return <svg width="${width}" height="${height}">
))
<circle cx="50%" cy="50%" r="50%" fill="${tooltipColor}"/>
<svg width="100%">
<text y="40" font-size="13" font-family="Verdana" dy="0" fill="${tooltipTextColor}">
<tspan x="15" dy="1.2em">${tooltipTitle}</tspan>
<tspan x="15" dy="1.2em">x: ${seriesInfo.formattedXValue} y: ${seriesInfo.formattedYValue}</tspan>
</text>
</svg>
</svg>
It doesn’t work. I have this error in console: Error from chart in div band0 TypeError: valuesWithLabels.reduce is not a function
and
Error from chart in div band0 DOMException: Failed to execute ‘removeChild’ on ‘Node’: The node to be removed is not a child of this node.
at RolloverTooltipSvgAnnotation.delete …
My graph has 3 renderableSeries (1 XyDataSeries and 2 XyyDataSeries)
Please can you send me an example in (javascript) for modify tooltip styling ?
Thanks.
- Marjorie lesage asked 3 months ago
- last active 1 month ago
We’re working on a Nyquist plot using the latest SciChart SDK for WPF.
We have quite a MVVM dependent structure already in place.
We are working with 3D frequency based Complex data. The Nyquist plot would have 2 axes – Y for Imaginary values and X axis for Real values. We apply some averaging and post-processing of the 3D data to put in 2D form and show it in the Nyquist plot.
However, we’d like to be able to scroll the data at certain frequency ranges without showing the actual frequency graph in the plot. Is there a possibility to implement an independent scrollbar containing a averaged magnitude graph (similar idea to the processing of the Nyquist data) over a frequency range? We’d like to scroll this frequency range and on selected range changed to recalculate data in the Nyquist plot.
We have quite an extensive graphing structure implemented already. The main issue I’m currently facing is that the scrollbar is bound to the SciChartSurface and I cannot seem to figure out how to build it more like a “sexy” frequency range selector while staying within the SciChart library? Is there any possibility to not be bound to the SciChartSurface? And of course, the axes are quite different – in the Nyquist we have linear real and imaginary values (-2 to +2, for example) whereas the frequency range would extend much further data-wise (0 – 3000 Hz, for example).
Any help would be appreciated. Feel free to ask for more details.
- Kaloyan Krastev asked 3 months ago
- last active 1 month ago
Hello,
Python with Matplotlib allows us to draw a line series that has multiple color depending on something else as shown below (https://matplotlib.org/3.3.0/gallery/lines_bars_and_markers/multicolored_line.html):
Is it possible with SciChart (WPF version)?
- Tetsu Shimizu asked 3 months ago
- last active 3 months ago
Is there any way to write data labels in Android? I know it exists in JavaScript, but I can’t find a way to do it in Android.
- yeana jun asked 3 months ago
- last active 3 months ago
Hello.
In my project, I am trying to display four SciChartSurfaces with a single legend. Furthermore, I want the Visibility changes of each series in the legend checkbox to be reflected in all SciChartSurfaces.
The following code achieves this, but I am not confident that it is the best solution. Is there a more Smart way to accomplish this?
MainWindow.xaml
<Window x:Class="SurveyFleetVisionChartLegend.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SurveyFleetVisionChartLegend"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:s="http://schemas.abtsoftware.co.uk/scichart"
Title="MainWindow"
Width="800"
Height="550"
d:DataContext="{d:DesignInstance {x:Type local:MainWindowViewModel}}"
mc:Ignorable="d">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<s:SciChartSurface Grid.Row="0"
Margin="5"
VerticalAlignment="Stretch"
Background="WhiteSmoke"
CacheMode="{x:Null}"
ChartTitle="SciChartSurface1"
RenderableSeries="{s:SeriesBinding GraphSeriess1.Value,
Mode=OneWay,
UpdateSourceTrigger=PropertyChanged}">
<s:SciChartSurface.XAxis>
<s:NumericAxis DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis HorizontalContentAlignment="Left"
DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.YAxis>
<s:SciChartSurface.ChartModifier>
<s:ModifierGroup>
<s:LegendModifier x:Name="TrendChartLegendModifier"
ShowLegend="False"
Visibility="Visible" />
</s:ModifierGroup>
</s:SciChartSurface.ChartModifier>
</s:SciChartSurface>
<s:SciChartSurface Grid.Row="1"
Margin="5"
VerticalAlignment="Stretch"
Background="WhiteSmoke"
ChartTitle="SciChartSurface2"
RenderableSeries="{s:SeriesBinding GraphSeriess2.Value,
UpdateSourceTrigger=PropertyChanged}">
<s:SciChartSurface.XAxis>
<s:NumericAxis DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis HorizontalContentAlignment="Left"
DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.YAxis>
</s:SciChartSurface>
<s:SciChartSurface Grid.Row="2"
Margin="5"
VerticalAlignment="Stretch"
Background="WhiteSmoke"
ChartTitle="SciChartSurface3"
RenderableSeries="{s:SeriesBinding GraphSeriess3.Value}">
<s:SciChartSurface.XAxis>
<s:NumericAxis DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis HorizontalContentAlignment="Left"
DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.YAxis>
</s:SciChartSurface>
<s:SciChartSurface Grid.Row="3"
Margin="5"
VerticalAlignment="Stretch"
Background="WhiteSmoke"
ChartTitle="SciChartSurface4"
RenderableSeries="{s:SeriesBinding GraphSeriess4.Value}">
<s:SciChartSurface.XAxis>
<s:NumericAxis DrawLabels="False"
GrowBy="0.1, 0.1"
VisibleRangeLimitMode="MinMax" />
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis HorizontalContentAlignment="Left"
DrawLabels="False"
GrowBy="0.1, 0.1" />
</s:SciChartSurface.YAxis>
</s:SciChartSurface>
<!-- Display the legend for Chart1. -->
<!-- Synchronization of Visiblity of each series of each SciChartSurface is performed on the ViwModel side. -->
<s:SciChartLegend Grid.Row="4"
Grid.Column="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Center"
LegendData="{Binding LegendData,
ElementName=TrendChartLegendModifier}"
Orientation="Vertical"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ShowVisibilityCheckboxes="True" />
</Grid>
</Window>
MainWindowViewModel.cs
using Reactive.Bindings;
using Reactive.Bindings.Extensions;
using SciChart.Charting.Common.Extensions;
using SciChart.Charting.Model.ChartData;
using SciChart.Charting.Model.ChartSeries;
using SciChart.Charting.Model.DataSeries;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using System.Xml.Linq;
namespace SurveyFleetVisionChartLegend
{
public class MainWindowViewModel
{
public ReactivePropertySlim<List<IRenderableSeriesViewModel>> GraphSeriess1 { get; set; } = new ReactivePropertySlim<List<IRenderableSeriesViewModel>>();
public ReactivePropertySlim<List<IRenderableSeriesViewModel>> GraphSeriess2 { get; set; } = new ReactivePropertySlim<List<IRenderableSeriesViewModel>>();
public ReactivePropertySlim<List<IRenderableSeriesViewModel>> GraphSeriess3 { get; set; } = new ReactivePropertySlim<List<IRenderableSeriesViewModel>>();
public ReactivePropertySlim<List<IRenderableSeriesViewModel>> GraphSeriess4 { get; set; } = new ReactivePropertySlim<List<IRenderableSeriesViewModel>>();
public ReactiveCommand RecreateCommand { get; set; }
private List<string> chartNames;
private Dictionary<string, bool> seriesVisibles { get; set; }
private Random random = new Random();
public MainWindowViewModel()
{
chartNames = new List<string>() { "Chart1", "Chart2", "Chart3" };
seriesVisibles = new Dictionary<string, bool>();
chartNames.ForEach(a => seriesVisibles.Add(a, true));
GraphSeriess1.Value = createGraphSeriess("Chart");
GraphSeriess2.Value = createGraphSeriess("Chart");
GraphSeriess3.Value = createGraphSeriess("Chart");
GraphSeriess4.Value = createGraphSeriess("Chart");
// If the legend changes the Visibility of each series in GraphSeriess1,
// Vary the Visibility of each series in other GraphSeriess.
GraphSeriess1.Subscribe(s=> {
if(s != null)
s.ForEach(a =>
{
a.ObserveProperty(b => b.IsVisible).Subscribe(_ =>
{
if (GraphSeriess2.Value != null)
GraphSeriess2.Value.First(c => c.DataSeries.SeriesName == a.DataSeries.SeriesName).IsVisible = a.IsVisible;
if (GraphSeriess3.Value != null)
GraphSeriess3.Value.First(c => c.DataSeries.SeriesName == a.DataSeries.SeriesName).IsVisible = a.IsVisible;
if (GraphSeriess4.Value != null)
GraphSeriess4.Value.First(c => c.DataSeries.SeriesName == a.DataSeries.SeriesName).IsVisible = a.IsVisible;
seriesVisibles[a.DataSeries.SeriesName] = a.IsVisible;
});
});
});
}
private List<IRenderableSeriesViewModel> createGraphSeriess(string name)
{
return chartNames.Select((x,a) => createGraphSeries(x, a)).ToList();
}
private IRenderableSeriesViewModel createGraphSeries(string name, int index)
{
var dataSeries = new XyDataSeries<double>() { SeriesName = name};
for (var i = 0; i < 5; i++)
{
dataSeries.Append(i, random.Next(100));
}
return new LineRenderableSeriesViewModel()
{
DataSeries = dataSeries,
IsVisible = seriesVisibles[dataSeries.SeriesName],
Stroke = Color.FromRgb((byte)(index * 200), (byte)(index * 100), (byte)(index * 100))
};
}
}
}
That is all. Best regards.
- Kouki Takeda asked 3 months ago
- last active 3 months ago
I must be missing something here.
I’ve followed the tooltips and hit test 3d chart examples.
All I need is the X, Y, Z coordinates that you get with the tooltip.
The only example I’ve found is for scatter points using VertexSelectionModifier3D and OnScatterDataChanged event.
But I cant figure out how to do something similar with GridDataSeries (Uniform or non-uniform).
I’ve tried the “ToolTipOpening” event but it doesn’t trigger when the tooltip opens.
This is the last thing I need before I commit to a licence.
The chart is working fine for my use case otherwise.
Thanks!
- Blaz Majcen asked 3 months ago
- last active 2 months ago
I build a .net6.0 project, and add an scichart, when I set the min of visible range of Axis to a bit less than 0, for example -1, the first tick will be zero ,but will show as -0, which is very weird.
And the situation occurs on demo of Scichart, too.
- Hugo Chu asked 3 months ago
- last active 3 months ago
Please tell me, is it possible to make sure that there is no empty space between records on those days when there is no trading on the stock exchange? It appears that the X-axis is linear and not transactional. How can I make it transactional?
- Yevhenii Krasovskyi asked 3 months ago
- last active 3 months ago
Hello.
Referring to the link above, we have modified the ViewModel side to maintain the selection state of chart points.
It works fine for a single chart, but when I have multiple charts, the selection points are interlocked between charts. I would like them to be independent of each other.
I wasn’t sure if there was a problem with my code or with the DataPointSelectionModifier, so does anyone know?
I have attached a code sample and a GIF of a working image.
※To reproduce this, click the three points in order from the top while holding down the control key on “Chart1” to make the three points selected. The color of the points will change from blue to red.
Next, while holding down the control key in “Chart2,” click on the bottom point. Then, in “Chart2,” four points are selected, even though only one point is pressed in total.
That is all. Best regards.
- Naoya Yokoyama asked 3 months ago
- last active 3 months ago
Tell me, please, how best to organize the graph in the case when on the time axis we can have more than 100-1000 records within 1 second. The problem seems to be that the X value must be accurate to at least 1 second? How to make records with even greater accuracy. and at the same time the time on the axis was shown correctly for this kind of data?
- Yevhenii Krasovskyi asked 3 months ago
- last active 3 months ago
I work on a SwiftUI project that has integrated SciCharts.
What I’ve noticed is that while there are SwiftUI examples available, they are rather basic and when I replicate the example code over in my project, it does not run as we expect and in some cases does not run at all.
Currently there seems to be issues with the SwiftUI run loop, SwiftUI’s use of structs, and SciCharts use of pointers that make building complex charts within complex user interfaces rather challenging.
I needed to do a lot of work to get the SwiftUI example code to work in my project, and we’re still facing some challenges. Can we expect better SwiftUI support in the future, such as SwiftUI views included in the SDK or if this work has been done can the documentation be linked?
- Tyler Williamson asked 3 months ago
- last active 3 months ago
I need to set range for stock chart from some records(first today’s record, first record of day before yesterday, etc for week, month, start of current year and the first record of chart) to last record.
To set the range i need to get indexes of this rows. Tell me please how can i do this for stock xValues. May be i can mark some records to find if faster or i need to check every records from 0 to MAX and then select the range?
Thank you!
- Yevhenii Krasovskyi asked 3 months ago
- last active 3 months ago
We have a sciChart surface in a fragment that has a scrollable view. We enabled tooltips using custom cursor modifier on the sci chart to show the values as the selection (touching a point in the chart object).
When we are moving the selection on x-axis tooltip sometimes it works fine and disappears when the selection is taken out. But sometimes it get freezed. At the same time, if we touch and move the selection in a vertical axis, tooltip box gets stuck and does not disappear even when the selection is taken out.
Tried so far:
We tried to replicate the issue in landscape mode and it works fine.
If we make the chart object to the whole page view, tool tips appears and disappears as expected.
But when the same used in portrait mode as a part of fragment (50% of screen) , problem arises
Steps to reproduce:
Have a chart object in a scrollable view.
Make sure the chart object doesnot appear on the fully screen without scrolling.
Now scroll to see the chart object.
Try to see the tooltip and move the selection in vertical axis.
- Krish J asked 3 months ago
- last active 3 months ago
When we move the cursor fast in Sci Chart surface, Sometimes its making customized tooltip (cursor Modifier) to freeze. We are not having this issue in landscape mode. we have this issue only when we use it in half of fragment.
View hierarchy:
swipe refresh>
nested Scrollview>
constraint layout>
view> –50% of screen
Sci Graphview> –50% of screen
/ constraint layout>
/nested Scrollview>
/swipe refresh>
- Krish J asked 3 months ago
Hi,
I’m trying to add Data Point Selection in 3D Surface. I followed this example (https://www.scichart.com/example/wpf-chart/wpf-3d-chart-example-simple-select-scatter-point-3d-chart/) but it didn’t work.
Point MetaData is added for each point:
_model = new ScatterRenderableSeries3DViewModel()
{
DataSeries = _dataSeries,
StyleKey = "ScatterSeries",
PaletteProvider = new PointCloudPaletteProvider(),
PointMarker = marker
};
RenderableSeries = new ObservableCollection<IRenderableSeries3DViewModel>()
{
_model
};
public void AppendPositionData(double x, double y, double z)
{
var vertex = new PointMetadata3D(Colors.Coral, 10);
_dataSeries.Append(x, y, z, vertex);
}
Vertex Selection Modifier is added to group
<s3D:SciChart3DSurface.ChartModifier>
<s3D:ModifierGroup3D>
<s3D:FreeLookModifier3D ExecuteOn="MouseLeftButton" ExecuteWhen="Shift" />
<s3D:OrbitModifier3D ExecuteOn="MouseLeftButton" />
<s3D:VertexSelectionModifier3D ExecuteOn="MouseLeftButton" ExecuteWhen="None" />
<s3D:MouseWheelZoomModifier3D />
<s3D:ZoomExtentsModifier3D AnimateDurationMs="500"
ResetPosition="300,300,200"
ResetTarget="0,0,0" />
</s3D:ModifierGroup3D>
</s3D:SciChart3DSurface.ChartModifier>
</s3D:SciChart3DSurface>
Now, when click to a point on the surface, IsSelected property seems not be set.
Please suggest a way to fix this issue! Thanks.
- Nguyen Bao Trung asked 3 months ago
- last active 2 months ago
I am using ImpulseSeries3Dgraph in some positions labels are overlapping on the graph, is there any way to increase the space between axis labels and the graph? please look into the attached image.
- Ammar Khan asked 3 months ago
- last active 3 months ago
Hello,
I’m Using the FastMountainRenderableSeries to fill the area under/over the Data points with a color gradient.
However, the gradient always seems to adapt to the currently shown data values and uses the maximal and minimal value of the displayed data as the “poles” for the coloring.
In the attached image, Data is displayed with a maximal value of 2 and a minimal value of -2. The gradient (from white to black) uses these values to map the color. -2 corresponds to white and 2 corresponds to black, and the room between is interpolated.
If I were to change the displayed data to have a different max/min value, the gradient would adapt accordingly.
Here is the relevant code I’m using:
FastMountainRenderableSeries m_graph = new FastMountainRenderableSeries();
m_graph.ZeroLineY = 0;
m_graph.AntiAliasing = true;
m_graph.Fill = new LinearGradientBrush(Colors.Black, Colors.White, 90);…adding datapoints…
My question is, is there is a way to gain more control over the way the colors of the gradient are mapped onto the area under/over the data points?
For example, maybe I want the black->white gradient only to go from 2->1 and everything above 2 is black and everything below 1 is white, no matter what range the displayed values currently have.
Ideally it would be possible to create/overwrite a “color-mapping”-function that accepts double values and returns colors to fill the are under/over the data points.
Thank you.
- Marc Vahldieck asked 3 months ago
- last active 3 months ago
Hello support team,
I’m using a SciChartSurface Chart with a CategoryDateTimeAxis (xAxis).
The chart should contain three stacked bar columns and Annotations between the columns.
How can I place the Annotations exactly between the columns with consideration of the dynamic width of chart surface? I haven’t found the exactly property or solution for this particular case.
Thanks for your support in advanced!
- Miriam Moser asked 3 months ago
- last active 3 months ago
Hello there,
I am new to SciChart and trying to implement custom SCICursorModifiers tooltip,
It’s almost done, except one issue, i.e I am not able to hide the X axis (or) Horizontal line which is in green colour, it is showing up in the background whenever I am trying to use the tooltip.
The line which needs to be hidden
I tried with following below code but it is not working
extension SCIChartTheme {
static let berryBlue: SCIChartTheme = SCIChartTheme(rawValue: "SciChart_SciChartv4DarkStyle")
}
SCIThemeManager.addTheme(.berryBlue, from: Bundle.main)
Is there any way to achieve this
Thanks in Advance
- Steven Deshazer asked 3 months ago
- last active 3 months ago
I uploaded a test code that dynamically loads multiple charts when selecting different items in the ListBox, and if you toggle options in the ListBox, the previously created charts won’t be released, resulting in a memory leak
- hundun wds asked 3 months ago
- last active 3 months ago
I have a scatterplot with different series of points and I need to figure out a way to draw each point separately in a different Z order. This will acheive “layering” of the points based on some metadata criteria.
The main issue to solve here is as follows. Each series can have “highlighted” points (outlined in blue on the chart, uses SciChart point selection) and “selected” points (denoted by a star point marker) which are tied to a selection in a grid. Any point in any of the series can be Highlighted and/or Selected. I need the the non-selected and non-highlighted points to be drawn first, then the selected points, then the highlighted points. This would guarantee that the highlighted points are always drawn on top of all others, and the selected points drawn on top of all but the highlighted.
My attempt has been to create a custom chart modifier and override OnParentSurfaceRendered. In that method I build dictionaries of points based on the metadata grouping criteria, then start with the lowest Z index group (the non-highlighted and non-selected points) draw those points, and continue up to the highest Z order group (the highlighted points).
Is there a simpler way to achieve this point layering functionality across data series?
Thanks.
- Cale Bryceson asked 4 months ago
- last active 3 months ago
Hi Support Team.
I’m working on SciChart with React 16.9 . Licensed by EOG Resouces.
Can you guys please let me know how to custom tooltip/legend on SciChart (JS)?
My custom function is below. Thank all
export async function initSciChart(
chartDiv: string,
chartData: Array<{ x: Array<number>; y: Array<number> }>,
handleMouseMove?: (args: ModifierMouseArgs) => void,
) {
// Create the SciChartSurface in the div 'scichart-root'
const theme = {
...new SciChartJSDarkv2Theme(),
sciChartBackground: '#191F26',
};
const { sciChartSurface, wasmContext } = await SciChartSurface.create(
chartDiv,
{ theme },
);
const legend = new LegendModifier({
orientation: ELegendOrientation.Horizontal,
// placementDivId: 'legend-div-id',
showSeriesMarkers: true,
showLegend: false,
showCheckboxes: false,
isCheckedChangedCallback: (series, isChecked) => {
// isChecked callback only works if showCheckboxes=true
console.log(
`Option 1: Legend item ${series.type} isChecked=${isChecked}`,
);
},
});
sciChartSurface.chartModifiers.add(
// new ZoomPanModifier(),
new RolloverModifier({ placementDivId: 'legend-div-id' }), // enable tooltip
new RubberBandXyZoomModifier(),
new MouseWheelZoomModifier(),
new ZoomExtentsModifier(),
new XAxisDragModifier(),
new YAxisDragModifier(),
legend,
new CursorModifier({
//placementDivId: 'legend-div-id',
//tooltipDataTemplate: customTemplate,
//tooltipLegendTemplate: getTooltipLegendTemplate,
// tooltipSvgTemplate: tooltipSvgTemplate,
}), // enable cursor - yValue and xValue
);
sciChartSurface.xAxes.add(
new NumericAxis(wasmContext, {
drawMajorGridLines: false,
drawMinorGridLines: false,
drawMajorBands: false,
visibleRangeLimit: new NumberRange(
Math.min(...chartData[0].x),
Math.max(...chartData[0].x),
),
}),
);
sciChartSurface.yAxes.add(
new NumericAxis(wasmContext, {
drawMajorGridLines: false,
drawMinorGridLines: false,
drawMajorBands: false,
zoomExtentsToInitialRange: false,
autoRange: EAutoRange.Always,
}),
);
chartData.forEach((seriesData, index) => {
const lineSeries = new FastLineRenderableSeries(wasmContext, {
stroke: AUTO_COLOR,
strokeThickness: index % 2 === 0 ? 3 : 1,
dataSeries: new XyDataSeries(wasmContext, {
xValues: seriesData.x,
yValues: seriesData.y,
dataSeriesName: `series-${index}`,
}),
});
lineSeries.rolloverModifierProps.tooltipLegendTemplate = (
tooltipProps: RolloverModifierRenderableSeriesProps,
seriesInfo: SeriesInfo,
) => {
return `<svg width="340" height="25">
<rect width="100%" height="100%" fill="#000000DD" stroke="grey" stroke-width="2" />
<svg width="100%">
<text x="8" y="16" font-size="13" font-family="Verdana" fill="red">Custom Legend Tooltip</text>
<text x="180" y="16" font-size="13" font-family="Verdana" fill="lightblue">X: ${seriesInfo.formattedXValue}</text>
<text x="260" y="16" font-size="13" font-family="Verdana" fill="green">Y: ${seriesInfo.formattedYValue}</text>
</svg>
</svg>`;
};
sciChartSurface.renderableSeries.add(lineSeries);
//Custom event on chart
if (sciChartSurface && handleMouseMove) {
const customModifider = new FacilityBalanceChartModifier();
sciChartSurface.chartModifiers.add(customModifider);
customModifider.modifierMouseMove = handleMouseMove;
}
});
return { sciChartSurface, wasmContext };
}
- TRUONG LE asked 4 months ago
- last active 3 months ago
Hello,
I have a WPF .Net 6 application running on Window 11 that monitors data coming from the network.
The app has five tab controls, each tab has four FIFO line charts.
I have another app (the “sender”) that sends simulated data to feed and test the “main” app.
Everything works beautifully when:
– The sender app is not running
– then, first navigate through all tabs, seeing an empty chart (expected)
– Launch the sender app.
– Navigate through tabs, watching them updating in near real time…
But…
If I do not initially navigate through all tabs, only the visible tab gets updated.
I suspect/speculate that SciChart code is doing some “critical” initializations on the OnLoaded event that are missed if tabs do not get loaded before setup.
We want the charts to get populated even if they are hidden at startup.
Any suggestions to fix the issue? Or am I doing anything wrong ?
Thank you
- Laurent Testud asked 4 months ago
- last active 3 months ago
I’m using the ZoomHistoryManager in my application which works great!
But how can I add my own entry to the undo/redo stack?
On my viewmodel I have
/// <summary>
/// XAxisRange
/// </summary>
public DoubleRange? XAxisRange
{
get => _xAxisRange;
set => SetProperty(ref _xAxisRange, value);
}
private DoubleRange? _xAxisRange = null;
/// <summary>
/// YAxisRange
/// </summary>
public DoubleRange? YAxisRange
{
get => _yAxisRange;
set => SetProperty(ref _yAxisRange, value);
}
private DoubleRange? _yAxisRange = null;
and I want to implement something like :
public void CustomRangeUpdate()
{
if (RenderableSeries.Count > 0)
{
XAxisRange = new DoubleRange(x1, x2);
YAxisRange = new DoubleRange(y1, y2);
ZoomHistoryManager.SaveLatestRange(new AxisKey("DefaultAxisId", true), XAxisRange);
ZoomHistoryManager.SaveLatestRange(new AxisKey("YAxis", false), YAxisRange);
ZoomHistoryManager.PushAll();
}
}
But it looks like I am using it incorrectly as it doesn’t add any entries. I’ve also tried Push() with no luck
- forl forl asked 4 months ago
- last active 4 months ago
We have been testing different limits of data types we are aiming to draw to the chart, and have found that if all of the values in a series are the same, very near 0, float value, then the line isn’t drawn. We do, however, get the value showing up on the vertical line annotation.
Though we are not using the latest version of SciChart in our production app (Net 4.6.1 requirement, but upgrading that soon), I have managed to reproduce the same in a very simplified .Net7 app using the latest version (7.0.2.27161). I have attached both the test app (with my runtime key removed) and a screenshot of the app.
Here is the code we are using to generate the sample series in the code behind of MainWindow.xaml:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
var floatData = new XyDataSeries<double, float>();
for (var i = 0; i < 1000; i++)
{
floatData.Append(i, float.Parse(Math.Pow(2, -126).ToString("E")));
}
this.FloatSeries.DataSeries = floatData;
}
}
MainWindow.xaml contains just a SciChart Surface, as follows:
<s:SciChartSurface x:Name="Surface">
<s:SciChartSurface.RenderableSeries>
<s:FastLineRenderableSeries x:Name="FloatSeries"
Stroke="#FF4083B7"/>
</s:SciChartSurface.RenderableSeries>
<s:SciChartSurface.XAxis>
<s:NumericAxis AutoRange="Always"/>
</s:SciChartSurface.XAxis>
<s:SciChartSurface.YAxis>
<s:NumericAxis AutoRange="Always"/>
</s:SciChartSurface.YAxis>
<s:SciChartSurface.ChartModifier>
<s:ModifierGroup>
<s:RubberBandXyZoomModifier />
<s:ZoomExtentsModifier />
<s:VerticalSliceModifier>
<s:VerticalSliceModifier.VerticalLines>
<s:VerticalLineAnnotation X1="500"
IsEditable="True"
LabelTextFormatting="E"
Stroke="White" />
</s:VerticalSliceModifier.VerticalLines>
</s:VerticalSliceModifier>
</s:ModifierGroup>
</s:SciChartSurface.ChartModifier>
<s:SciChartSurface.Annotations>
<s:TextAnnotation Text="Test app highlighting problem when all x values are floats with the same scientific value"
CoordinateMode="Relative"
X1="0"
Y1="0"
Margin="2"/>
</s:SciChartSurface.Annotations>
</s:SciChartSurface>
Adding another value to the series with result in the line being drawn, as long as it is sufficiently different to the others.
What would be the best way to get this data showing to the users? Whilst highly unlikely the user is going to use such values, we cannot discount this. Would extending the ViewportManager to provide our own range be the best approach? If it impacts on the suggestions, due to our implementation requirements our production app will only show up to two series per surface (with the same data type), but we could be showing upwards of 256 charts (with one of 12 data types as their y-axis type). All of our charts are linked to a common TimeSpanAxis for the x axis.
- Carl Alsford asked 4 months ago
- last active 4 months ago