Пример #1
0
        private void MixedCharts_OnLoaded(object sender, RoutedEventArgs e)
        {
            var leftDataSeries0 = new XyDataSeries <double, double>();
            var leftDataSeries1 = new XyDataSeries <double, double>();

            var rightDataSeries0 = new XyDataSeries <DateTime, double>();
            var rightDataSeries1 = new XyDataSeries <DateTime, double>();

            var random = new FasterRandom();

            for (int i = 0; i < 20; i++)
            {
                leftDataSeries0.Append(i, random.Next(10));
                leftDataSeries1.Append(i, random.Next(10));

                rightDataSeries0.Append(DateTime.Now.AddHours(i), random.Next(10));
                rightDataSeries1.Append(DateTime.Now.AddHours(i), random.Next(10));
            }

            sciChart.RenderableSeries[0].DataSeries = leftDataSeries0;
            sciChart.RenderableSeries[1].DataSeries = leftDataSeries1;

            sciChart.RenderableSeries[2].DataSeries = rightDataSeries0;
            sciChart.RenderableSeries[3].DataSeries = rightDataSeries1;

            sciChart.ZoomExtents();
        }
Пример #2
0
        //time\tprice\tvolume\tbidorask
        public HistogramBarDemoProjectViewModel()
        {
            _random = new FasterRandom();

            _timerNewDataUpdate           = new Timer(1);
            _timerNewDataUpdate.AutoReset = true;
            _timerNewDataUpdate.Elapsed  += OnNewData;

            _viewportManager = new HistogramBarViewportManager();

            _dataSeries0 = new OhlcDataSeries <DateTime, double>();
            _dataSeries1 = new OhlcDataSeries <DateTime, double>();

            _filterDataSeries = new XyDataSeries <DateTime, double>();
            _movingAverage    = new MovingAverage(5);

            YAutoRange = true;
            AlowToChangeVisibleRangeToMax = true;

            HorizontalBarSpacing = 5;
            HistogramBarMode     = HistogramMode.MarketProfile;
            MaxHistoBarCandles   = 40;
            TickSize             = 0.5;

            LoadRandomData(30, 250);
            _viewportManager.ZoomExtents();
        }
Пример #3
0
        private void VerticalXAxis_OnLoaded(object sender, RoutedEventArgs e)
        {
            var leftDataSeries0 = new XyDataSeries <double, double>();
            var leftDataSeries1 = new XyDataSeries <double, double>();

            var rightDataSeries0 = new XyDataSeries <double, double>();
            var rightDataSeries1 = new XyDataSeries <double, double>();

            var random = new FasterRandom();

            for (int i = 0; i < 20; i++)
            {
                leftDataSeries0.Append(i, random.Next(10));
                leftDataSeries1.Append(i, random.Next(10));

                rightDataSeries0.Append(i, random.Next(10));
                rightDataSeries1.Append(i, random.Next(10));
            }

            sciChartLeft.RenderableSeries[0].DataSeries = leftDataSeries0;
            sciChartLeft.RenderableSeries[1].DataSeries = leftDataSeries1;

            sciChartRight.RenderableSeries[0].DataSeries = rightDataSeries0;
            sciChartRight.RenderableSeries[1].DataSeries = rightDataSeries1;
        }
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            // Create our data in another thread to stop the UI from being stalled.
            // It's not appending to SciChart Dataseries that is the problem, its Calling Rand.Next() two million times which is pretty slow :)
            TimedMethod.Invoke(() =>
            {
                var dataSeries = new XyDataSeries <double, double>()
                {
                    AcceptsUnsortedData = true
                };
                var rand = new FasterRandom();

                // Allow 1M points in WPF/DirectX. In Silverlight or software rendering, 100k points is enough to stress the renderer
                int count = FeaturesHelper.Instance.SupportsHardwareAcceleration ? (int)1E6 : (int)1E5;

                // Append some data
                for (int i = 0; i < count; i++)
                {
                    dataSeries.Append(rand.NextDouble(), rand.NextDouble());
                }

                // Bind to scichart
                Action bindData = () => { BindData(dataSeries); };
                Dispatcher.BeginInvoke(bindData);
            }).After(200).OnThread(TimedMethodThread.Background).Go();
        }
        public CreateAWaterfall3DChart()
        {
            InitializeComponent();

            _random    = new FasterRandom();
            _transform = new FFT2();

            Loaded += OnLoaded;
        }
        public IList <double> GenerateYData(int pointCount)
        {
            var retval = new List <double>();
            var random = new FasterRandom();

            for (var index = 0; index < pointCount; index++)
            {
                retval.Add(random.Next(10));
            }

            return(retval);
        }
        private IDataSeries CreateSeries()
        {
            var rnd = new FasterRandom();
            int w = 24, h = 7;
            var data = new double[h, w];

            for (int x = 0; x < w; x++)
            {
                for (int y = 0; y < h; y++)
                {
                    data[y, x] = Math.Pow(rnd.NextDouble(), 0.15) * x / (w - 1) * y / (h - 1) * 100;
                }
            }
            return(new UniformHeatmapDataSeries <int, int, double>(data, 0, 1, 0, 1));
        }
        public ManipulateSeries3DMvvmViewModel()
        {
            _random    = new FasterRandom();
            _transform = new FFT2();

            _columnSeries = new ColumnRenderableSeries3DViewModel {
                ColumnShape = typeof(CylinderPointMarker3D), DataPointWidthX = 0.5, Opacity = 1.0, DataSeries = GetColumnDataSeries()
            };
            _impulseSeries = new ImpulseRenderableSeries3DViewModel {
                PointMarker = new EllipsePointMarker3D {
                    Fill = Colors.White, Size = 4, Opacity = 1
                }, Opacity = 1.0, DataSeries = GetImpulseDataSeries()
            };
            _pointLineSeries = new PointLineRenderableSeries3DViewModel {
                IsAntialiased = true, PointMarker = new EllipsePointMarker3D {
                    Fill = Colors.LimeGreen, Size = 2.0f, Opacity = 1
                }, DataSeries = GetPointLineDataSeries()
            };
            _surfaceMeshSeries = new SurfaceMeshRenderableSeries3DViewModel {
                StyleKey = "SurfaceMeshStyle", DrawMeshAs = DrawMeshAs.SolidWireFrame, StrokeThickness = 2, DrawSkirt = false, Opacity = 1, DataSeries = GetSurfaceMeshDataSeries()
            };
            _waterfallSeries = new WaterfallRenderableSeries3DViewModel {
                StyleKey = "WaterfallStyle", Stroke = Colors.Blue, Opacity = 0.8, StrokeThickness = 1, SliceThickness = 0, DataSeries = GetWaterfallDataSeries()
            };
            _scatterSeries = new ScatterRenderableSeries3DViewModel {
                PointMarker = new EllipsePointMarker3D {
                    Fill = Colors.LimeGreen, Size = 2.0f, Opacity = 1
                }, DataSeries = GetScatterDataSeries()
            };
            _mountainSeries = new MountainRenderableSeries3DViewModel {
                DataSeries = GetColumnDataSeries()
            };

            RenderableSeries = new ObservableCollection <IRenderableSeries3DViewModel>();

            SeriesTypes = new ObservableCollection <string>
            {
                "Column Series",
                "Impulse Series",
                "Mountain Series",
                "PointLine Series",
                "SurfaceMesh Series",
                //  "Waterfall Series",
                "Scatter Series"
            };

            RenderableSeries.Add(_waterfallSeries);
        }
        public ScatterSeriesTernaryChartExampleView()
        {
            InitializeComponent();

            _random = new FasterRandom();

            // scatters series
            var scatterDataSeries1 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Substance A"
            };
            var scatterDataSeries2 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Substance B"
            };
            var scatterDataSeries3 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Substance C"
            };

            // Air series
            for (int i = 0; i < 75; i++)
            {
                var x = _random.Next(0, 50);
                var z = _random.Next(20, 40);
                var y = 100 - (x + z);
                scatterDataSeries1.Append(x, y, z);
            }

            // Earth series
            for (int i = 0; i < 75; i++)
            {
                var x = _random.Next(0, 40);
                var z = _random.Next(0, 20);
                var y = 100 - (x + z);
                scatterDataSeries2.Append(x, y, z);
            }

            // Fire series
            for (int i = 0; i < 75; i++)
            {
                var x = _random.Next(20, 40);
                var y = _random.Next(0, 25);
                var z = 100 - (x + y);
                scatterDataSeries3.Append(x, y, z);
            }

            scatterSeries1.DataSeries = scatterDataSeries1;
            scatterSeries2.DataSeries = scatterDataSeries2;
            scatterSeries3.DataSeries = scatterDataSeries3;
        }
        private void FillSeries(HlcDataSeries <double, double> hlcDataSeries, DoubleSeries sourceData, double scale)
        {
            var xData = sourceData.XData;
            var yData = sourceData.YData.Select(x => x * scale).ToArray();

            // Generate some random error data. Errors must be absolute values,
            // e.g. if a series has a Y-value of 5.0, and YError of =/-10% then you must enter YErrorHigh=5.5, YErrorLow=4.5 into the HlcDataSeries
            var random     = new FasterRandom();
            var yErrorHigh = yData.Select(y => y + random.NextDouble() * 0.2);
            var yErrorLow  = yData.Select(y => y - random.NextDouble() * 0.2);

            // HlcDataSeries requires X, Y, High, Low.
            // For Error bars the High, Low becomes the High Low error,
            // while X,Y is the location of the error
            hlcDataSeries.Append(xData, yData, yErrorHigh, yErrorLow);
        }
        private IEnumerable <BoxPoint> GetBoxPlotData()
        {
            var dates        = Enumerable.Range(0, PointsCount).Select(i => i).ToArray();
            var medianValues = new RandomWalkGenerator().GetRandomWalkSeries(PointsCount).YData;
            var random       = new FasterRandom();

            for (int i = 0; i < PointsCount; i++)
            {
                double med   = medianValues[i];
                double min   = med - random.NextDouble();
                double max   = med + random.NextDouble();
                double lower = (med - min) * random.NextDouble() + min;
                double upper = (max - med) * random.NextDouble() + med;

                yield return(new BoxPoint(dates[i], min, lower, med, upper, max));
            }
        }
        private static void OnDataSeriesDependencyPropertyChanged(DependencyObject d,
                                                                  DependencyPropertyChangedEventArgs e)
        {
            var sciChartSurface = d as SciChartSurface;

            if (sciChartSurface == null)
            {
                return;
            }

            if (e.NewValue == null)
            {
                sciChartSurface.RenderableSeries.Clear();
                return;
            }

            using (sciChartSurface.SuspendUpdates())
            {
                sciChartSurface.RenderableSeries.Clear();

                var random       = new FasterRandom();
                var itr          = (IEnumerable <IDataSeries>)e.NewValue;
                var renderSeries = new List <IRenderableSeries>();
                foreach (var dataSeries in itr)
                {
                    if (dataSeries == null)
                    {
                        continue;
                    }

                    var rgb = new byte[3];
                    random.NextBytes(rgb);
                    var renderableSeries = new FastLineRenderableSeries()
                    {
                        AntiAliasing = false,
                        Stroke       = Color.FromArgb(255, rgb[0], rgb[1], rgb[2]),
                        DataSeries   = dataSeries,
                    };

                    renderSeries.Add(renderableSeries);
                }

                sciChartSurface.RenderableSeries = new ObservableCollection <IRenderableSeries>(renderSeries);
            }
        }
        private void Initialize()
        {
            RenderableSeriesViewModels = new ObservableCollection <IRenderableSeriesViewModel>();
            var random    = new FasterRandom();
            var generator = new RandomWalkGenerator();

            for (int i = 0; i < SeriesCount; i++)
            {
                var dataSeries = new XyDataSeries <double, double>();
                var someData   = generator.GetRandomWalkSeries(PointCount);
                generator.Reset();
                dataSeries.Append(someData.XData, someData.YData);

                var rgb = new byte[3];
                random.NextBytes(rgb);

                RenderableSeriesViewModels.Add(new LineRenderableSeriesViewModel
                {
                    DataSeries   = dataSeries,
                    AntiAliasing = false,
                    Stroke       = Color.FromArgb(255, rgb[0], rgb[1], rgb[2]),
                });
            }
        }
 public RandomWalkGenerator(double bias = 0.01)
 {
     _bias   = bias;
     _random = new FasterRandom();
 }
        public TenorCurves3DChart()
        {
            InitializeComponent();

            _random = new FasterRandom();
            int xSize              = 25;
            int zSize              = 25;
            var meshDataSeries     = new UniformGridDataSeries3D <double, double, DateTime>(xSize, zSize);
            var lineDataSeries     = new XyDataSeries <double>();
            var mountainDataSeries = new XyDataSeries <double, double>();

            meshDataSeries.StartZ = new DateTime(2010, 1, 1);
            meshDataSeries.StepZ  = new TimeSpan(1, 0, 0, 0).ToDateTime();

            double step;

            for (int x = 0; x < xSize; x++)
            {
                switch (x)
                {
                case 5:
                case 10:
                    step = 0.309;
                    break;

                case 4:
                case 9:
                    step = 0.303;
                    break;

                case 6:
                case 11:
                    step = 0.303;
                    break;

                case 23:
                    step = 0.291;
                    break;

                case 22:
                    step = 0.294;
                    break;

                case 24:
                    step = 0.295;
                    break;

                default:
                    step = 0.3;
                    break;
                }

                for (int z = 0; z < zSize; z++)
                {
                    var y = (z != 0) ? Math.Pow((double)z + _random.NextDouble(), step) : Math.Pow((double)z + 1, 0.3);

                    meshDataSeries[z, x] = y;
                }
            }

            double average;

            for (int x = 0; x < xSize; x++)
            {
                average = 0;
                for (int z = 0; z < zSize; z++)
                {
                    average += meshDataSeries[x, z];
                }
                var y = average / 25;
                lineDataSeries.Append(x, y);
                mountainDataSeries.Append(x, meshDataSeries[12, x]);
            }

            mountainRenderSeries.DataSeries        = mountainDataSeries;
            LineRenderableSeries.DataSeries        = lineDataSeries;
            surfaceMeshRenderableSeries.Maximum    = (double)meshDataSeries.YRange.Max;
            surfaceMeshRenderableSeries.Minimum    = (double)meshDataSeries.YRange.Min;
            surfaceMeshRenderableSeries.DataSeries = meshDataSeries;
        }
        private void AddSeriesButton_OnClick(object sender, RoutedEventArgs e)
        {
            if (sciChart.RenderableSeries.Count >= MaxSeriesAmount)
            {
                return;
            }

            var renderSerias    = new ScatterRenderableSeries3D();
            var xyzDataSeries3D = new XyzDataSeries3D <double>()
            {
                SeriesName = "Series " + ++_currentSeries
            };

            int dataPointsCount = 15;
            var random          = new Random(0);

            for (int i = 0; i < dataPointsCount; i++)
            {
                double x = DataManager.Instance.GetGaussianRandomNumber(5, 1.5);
                double y = DataManager.Instance.GetGaussianRandomNumber(5, 1.5);
                double z = DataManager.Instance.GetGaussianRandomNumber(5, 1.5);

                // Scale is a multiplier used to increase/decrease ScatterRenderableSeries3D.ScatterPointSize
                float scale = (float)((random.NextDouble() + 0.5) * 3.0);

                // Color is applied to PointMetadata3D and overrides the default ScatterRenderableSeries.Stroke property
                Color?randomColor = Color.FromArgb(0xFF, (byte)random.Next(50, 255), (byte)random.Next(50, 255), (byte)random.Next(50, 255));

                // To declare scale and colour, add a VertextData class as the w (fourth) parameter.
                // The PointMetadata3D class also has other properties defining the behaviour of the XYZ point
                xyzDataSeries3D.Append(x, y, z, new PointMetadata3D(randomColor, scale));
            }

            var randomPicker = new FasterRandom();
            int randValue    = randomPicker.Next(0, 6);

            switch (randValue)
            {
            case 0:
                renderSerias.PointMarker = new CubePointMarker3D();
                break;

            case 1:
                renderSerias.PointMarker = new EllipsePointMarker3D();
                break;

            case 2:
                renderSerias.PointMarker = new PyramidPointMarker3D();
                break;

            case 3:
                renderSerias.PointMarker = new QuadPointMarker3D();
                break;

            case 4:
                renderSerias.PointMarker = new SpherePointMarker3D();
                break;

            case 5:
                renderSerias.PointMarker = new TrianglePointMarker3D();
                break;
            }

            renderSerias.DataSeries = xyzDataSeries3D;
            sciChart.RenderableSeries.Add(renderSerias);

            var index = sciChart.RenderableSeries.IndexOf(renderSerias);

            xyzDataSeries3D.SeriesName = String.Format("Series #{0}", index);

            OnPropertyChanged("CanAddSeries");
            OnPropertyChanged("CanRemoveSeries");

            sciChart.ZoomExtents();
        }
Пример #17
0
        private void UsePointMarkers_OnLoaded(object sender, RoutedEventArgs e)
        {
            var dataSeries1 = new XyDataSeries <double, double>()
            {
                SeriesName = "Ellipse Marker"
            };
            var dataSeries2 = new XyDataSeries <double, double>()
            {
                SeriesName = "Square Marker"
            };
            var dataSeries3 = new XyDataSeries <double, double>()
            {
                SeriesName = "Triangle Marker"
            };
            var dataSeries4 = new XyDataSeries <double, double>()
            {
                SeriesName = "Cross Marker"
            };
            var dataSeries5 = new XyDataSeries <double, double>()
            {
                SeriesName = "Sprite Marker"
            };

            const int dataSize = 30;
            var       rnd      = new FasterRandom();

            for (int i = 0; i < dataSize; i++)
            {
                dataSeries1.Append(i, rnd.NextDouble());
            }
            for (int i = 0; i < dataSize; i++)
            {
                dataSeries2.Append(i, 1 + rnd.NextDouble());
            }
            for (int i = 0; i < dataSize; i++)
            {
                dataSeries3.Append(i, 1.8 + rnd.NextDouble());
            }
            for (int i = 0; i < dataSize; i++)
            {
                dataSeries4.Append(i, 2.5 + rnd.NextDouble());
            }
            for (int i = 0; i < dataSize; i++)
            {
                dataSeries5.Append(i, 3.5 + rnd.NextDouble());
            }

            // insert a break into the line - we do this to test double.NaN for the point marker types
            dataSeries1.Update(dataSeries1.XValues[15], double.NaN);
            dataSeries2.Update(dataSeries1.XValues[15], double.NaN);
            dataSeries3.Update(dataSeries1.XValues[15], double.NaN);
            dataSeries4.Update(dataSeries1.XValues[15], double.NaN);
            dataSeries5.Update(dataSeries1.XValues[15], double.NaN);

            using (this.sciChart.SuspendUpdates())
            {
                this.lineSeries1.DataSeries = dataSeries1;
                this.lineSeries2.DataSeries = dataSeries2;
                this.lineSeries3.DataSeries = dataSeries3;
                this.lineSeries4.DataSeries = dataSeries4;
                this.lineSeries5.DataSeries = dataSeries5;
            }

            this.sciChart.ZoomExtents();
        }
        public ErrorBarSeriesTernaryChartExampleView()
        {
            InitializeComponent();

            _random = new FasterRandom();

            cursorModButton.IsChecked  = false;
            tooltipModButton.IsChecked = false;

            // scatters series
            var scatterDataSeries1 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Residue"
            };
            var scatterDataSeries2 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Dolomite"
            };
            var scatterDataSeries3 = new XyzDataSeries <double> {
                AcceptsUnsortedData = true, SeriesName = "Calcite"
            };


            // Residue series
            for (int i = 0; i < 25; i++)
            {
                var x = _random.Next(0, 40);
                var z = _random.Next(40, 60);
                var y = 100 - (x + z);
                scatterDataSeries1.Append(x, y, z);
            }

            // Dolomite series
            for (int i = 0; i < 25; i++)
            {
                var x = _random.Next(0, 40);
                var z = _random.Next(10, 30);
                var y = 100 - (x + z);
                scatterDataSeries2.Append(x, y, z);
            }

            // Calcite series
            for (int i = 0; i < 25; i++)
            {
                var z = _random.Next(70, 90);
                var x = _random.Next(0, 100 - z);
                var y = 100 - (x + z);
                scatterDataSeries3.Append(x, y, z);
            }

            scatterSeries1.DataSeries = scatterDataSeries1;
            scatterSeries2.DataSeries = scatterDataSeries2;
            scatterSeries3.DataSeries = scatterDataSeries3;

            // errorbars series
            var errorBarDataSeries1 = (XyzDataSeries <double, double, double>)scatterDataSeries1.Clone();
            var errorBarDataSeries2 = (XyzDataSeries <double, double, double>)scatterDataSeries2.Clone();
            var errorBarDataSeries3 = (XyzDataSeries <double, double, double>)scatterDataSeries3.Clone();

            errorBarDataSeries1.SeriesName = "ResidueError";
            errorBarDataSeries2.SeriesName = "DolomiteError";
            errorBarDataSeries3.SeriesName = "CalciteError";

            // EllipseError series
            errorBarsSeries1.DataSeries = errorBarDataSeries1;

            // TriangleError series
            errorBarsSeries2.DataSeries = errorBarDataSeries2;

            // SquareError series
            errorBarsSeries3.DataSeries = errorBarDataSeries3;
        }
 public RandomWalkGenerator(int seed)
 {
     _random = new FasterRandom(seed);
 }