AirScout/OxyPlot/Source/Examples/ExampleLibrary/Series/LineSeriesExamples.cs

462 wiersze
17 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="LineSeriesExamples.cs" company="OxyPlot">
// Copyright (c) 2014 OxyPlot contributors
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using System;
using OxyPlot;
using OxyPlot.Series;
namespace ExampleLibrary
{
using System;
using System.Collections.Generic;
using System.Linq;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
[Examples("LineSeries"), Tags("Series")]
public class LineSeriesExamples
{
private static readonly Random Randomizer = new Random(13);
[Example("Default style")]
public static PlotModel DefaultStyle()
{
var model = new PlotModel { Title = "LineSeries with default style" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var lineSeries1 = CreateExampleLineSeries();
lineSeries1.Title = "LineSeries 1";
model.Series.Add(lineSeries1);
return model;
}
[Example("Custom style")]
public static PlotModel CustomStyle()
{
var model = new PlotModel { Title = "LineSeries with custom style", LegendSymbolLength = 24 };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var lineSeries1 = CreateExampleLineSeries();
lineSeries1.Title = "LineSeries 1";
lineSeries1.ToolTip = "This is a tooltip for a LineSeries 1";
lineSeries1.Color = OxyColors.SkyBlue;
lineSeries1.StrokeThickness = 3;
lineSeries1.LineStyle = LineStyle.Dash;
lineSeries1.MarkerType = MarkerType.Circle;
lineSeries1.MarkerSize = 5;
lineSeries1.MarkerStroke = OxyColors.White;
lineSeries1.MarkerFill = OxyColors.SkyBlue;
lineSeries1.MarkerStrokeThickness = 1.5;
model.Series.Add(lineSeries1);
return model;
}
[Example("Two LineSeries")]
public static PlotModel TwoLineSeries()
{
var model = new PlotModel { Title = "Two LineSeries" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var lineSeries1 = CreateExampleLineSeries();
lineSeries1.Title = "LineSeries 1";
model.Series.Add(lineSeries1);
var lineSeries2 = CreateExampleLineSeries(41);
lineSeries2.Title = "LineSeries 2";
model.Series.Add(lineSeries2);
return model;
}
[Example("Visibility")]
public static PlotModel IsVisibleFalse()
{
var model = new PlotModel { Title = "LineSeries with IsVisible = false", Subtitle = "Click to change the IsVisible property for LineSeries 2" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0, Maximum = 50 });
var s1 = CreateExampleLineSeries(38);
s1.Title = "LineSeries 1";
model.Series.Add(s1);
var s2 = CreateExampleLineSeries(39);
s2.Title = "LineSeries 2";
s2.IsVisible = false;
model.Series.Add(s2);
// handle mouse clicks to change visibility
model.MouseDown += (s, e) => { s2.IsVisible = !s2.IsVisible; model.InvalidatePlot(true); };
return model;
}
[Example("Custom TrackerFormatString")]
public static PlotModel TrackerFormatString()
{
var model = new PlotModel { Title = "LineSeries with custom TrackerFormatString", Subtitle = "TrackerFormatString = \"X={2:0.0} Y={4:0.0}\"" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var lineSeries1 = CreateExampleLineSeries();
lineSeries1.TrackerFormatString = "X={2:0.0} Y={4:0.0}";
model.Series.Add(lineSeries1);
return model;
}
[Example("Custom markers")]
public static PlotModel CustomMarkers()
{
var model = new PlotModel { Title = "LineSeries with custom markers", LegendSymbolLength = 30 };
const int N = 6;
var customMarkerOutline = new ScreenPoint[N];
for (int i = 0; i < N; i++)
{
double th = Math.PI * ((4.0 * i / (N - 1)) - 0.5);
const double R = 1;
customMarkerOutline[i] = new ScreenPoint(Math.Cos(th) * R, Math.Sin(th) * R);
}
var s1 = CreateExampleLineSeries(39);
s1.Title = "LineSeries 1";
s1.MarkerType = MarkerType.Custom;
s1.MarkerSize = 8;
s1.MarkerOutline = customMarkerOutline;
model.Series.Add(s1);
return model;
}
[Example("Marker types")]
public static PlotModel MarkerTypes()
{
var pm = CreateModel("LineSeries with different MarkerType", (int)MarkerType.Custom);
pm.LegendBackground = OxyColor.FromAColor(220, OxyColors.White);
pm.LegendBorder = OxyColors.Black;
pm.LegendBorderThickness = 1.0;
int i = 0;
foreach (var ls in pm.Series.Cast<LineSeries>())
{
ls.Color = OxyColors.Red;
ls.MarkerStroke = OxyColors.Black;
ls.MarkerFill = OxyColors.Green;
ls.MarkerType = (MarkerType)i++;
ls.Title = ls.MarkerType.ToString();
}
return pm;
}
[Example("Labels")]
public static PlotModel Labels()
{
var model = new PlotModel { Title = "LineSeries with labels", Subtitle = "Use the 'LabelFormatString' property", LegendSymbolLength = 24 };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MaximumPadding = 0.1 }); // increase the top padding to make sure the labels are visible
var s1 = CreateExampleLineSeries();
s1.LabelFormatString = "{1}";
s1.MarkerType = MarkerType.Circle;
model.Series.Add(s1);
return model;
}
[Example("LineStyle")]
public static PlotModel LineStyles()
{
var pm = CreateModel("LineSeries with LineStyle", (int)LineStyle.None);
pm.LegendPlacement = LegendPlacement.Outside;
pm.LegendSymbolLength = 50;
int i = 0;
foreach (var lineSeries in pm.Series.Cast<LineSeries>())
{
lineSeries.Color = OxyColors.Red;
lineSeries.LineStyle = (LineStyle)i++;
lineSeries.Title = lineSeries.LineStyle.ToString();
}
return pm;
}
[Example("Interpolation")]
public static PlotModel Smooth()
{
var model = new PlotModel { Title = "LineSeries with interpolation", Subtitle = "InterpolationAlgorithm = CanonicalSpline", LegendSymbolLength = 24 };
var s1 = CreateExampleLineSeries();
s1.MarkerType = MarkerType.Circle;
s1.InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline;
model.Series.Add(s1);
return model;
}
[Example("LineLegendPosition")]
public static PlotModel CustomLineLegendPosition()
{
var model = new PlotModel { Title = "LineSeries with LineLegendPosition" };
model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, MinimumPadding = 0.1, MaximumPadding = 0.1 });
model.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var s1 = CreateExampleLineSeries();
s1.Title = "Start";
s1.MarkerType = MarkerType.Circle;
s1.LineLegendPosition = LineLegendPosition.Start;
model.Series.Add(s1);
var s2 = CreateExampleLineSeries(41);
s2.Title = "End";
s2.MarkerType = MarkerType.Circle;
s2.LineLegendPosition = LineLegendPosition.End;
model.Series.Add(s2);
return model;
}
[Example("Broken lines")]
public static PlotModel BrokenLine()
{
var model = new PlotModel { Title = "LineSeries with broken lines" };
var s1 = CreateExampleLineSeries();
s1.Points[3] = DataPoint.Undefined;
s1.Points[7] = DataPoint.Undefined;
s1.BrokenLineColor = OxyColors.Gray;
s1.BrokenLineThickness = 0.5;
s1.BrokenLineStyle = LineStyle.Solid;
model.Series.Add(s1);
var s2 = CreateExampleLineSeries(49);
s2.Points[3] = DataPoint.Undefined;
s2.Points[7] = DataPoint.Undefined;
s2.BrokenLineColor = OxyColors.Automatic;
s2.BrokenLineThickness = 1;
s2.BrokenLineStyle = LineStyle.Dot;
model.Series.Add(s2);
return model;
}
[Example("Without Decimator")]
public static PlotModel WithoutDecimator()
{
var model = new PlotModel { Title = "LineSeries without Decimator" };
var s1 = CreateSeriesSuitableForDecimation();
model.Series.Add(s1);
return model;
}
[Example("With X Decimator")]
public static PlotModel WithXDecimator()
{
var model = new PlotModel { Title = "LineSeries with X Decimator" };
var s1 = CreateSeriesSuitableForDecimation();
s1.Decimator = Decimator.Decimate;
model.Series.Add(s1);
return model;
}
[Example("Canonical spline interpolation")]
public static PlotModel CanonicalSplineInterpolation()
{
var result = CreateRandomPoints();
var plotModel = new PlotModel
{
Title = "Canonical spline interpolation",
Series =
{
new LineSeries
{
ItemsSource = result,
Title = "Default (0.5)",
InterpolationAlgorithm = InterpolationAlgorithms.CanonicalSpline,
MarkerType = MarkerType.Circle,
MarkerFill = OxyColors.Black
},
new LineSeries
{
ItemsSource = result,
Title = "0.1",
InterpolationAlgorithm = new CanonicalSpline(0.1)
},
new LineSeries
{
ItemsSource = result,
Title = "1.0",
InterpolationAlgorithm = new CanonicalSpline(1)
}
}
};
return plotModel;
}
[Example("Catmull-Rom interpolation")]
public static PlotModel CatmullRomInterpolation()
{
var result = CreateRandomPoints();
var plotModel = new PlotModel
{
Title = "Catmull-Rom interpolation",
Series =
{
new LineSeries
{
ItemsSource = result,
Title = "Standard",
InterpolationAlgorithm = InterpolationAlgorithms.CatmullRomSpline,
MarkerType = MarkerType.Circle,
MarkerFill = OxyColors.Black
},
new LineSeries
{
ItemsSource = result,
Title = "Chordal",
InterpolationAlgorithm = InterpolationAlgorithms.ChordalCatmullRomSpline
},
new LineSeries
{
ItemsSource = result,
Title = "Uniform",
InterpolationAlgorithm = InterpolationAlgorithms.UniformCatmullRomSpline
}
}
};
return plotModel;
}
[Example("Marker color options")]
public static PlotModel MarkerColorOptions()
{
var result = CreateRandomPoints();
var model = new PlotModel { Title = "Marker color options" };
// Dont specify line or marker color. Defaults will be used.
var s1 = CreateExampleLineSeries(1);
s1.MarkerType = MarkerType.Circle;
model.Series.Add(s1);
// Specify line color but not marker color. Marker color should be the same as line color.
var s2 = CreateExampleLineSeries(4);
s2.MarkerType = MarkerType.Square;
s2.Color = OxyColors.LightBlue;
model.Series.Add(s2);
// Specify marker color but not line color. Default color should be used for line.
var s3 = CreateExampleLineSeries(13);
s3.MarkerType = MarkerType.Square;
s3.MarkerFill = OxyColors.Black;
model.Series.Add(s3);
// Specify line and marker color. Specified colors should be used.
var s4 = CreateExampleLineSeries(5);
s4.MarkerType = MarkerType.Square;
s4.MarkerFill = OxyColors.OrangeRed;
s4.Color = OxyColors.Orange;
model.Series.Add(s4);
return model;
}
private static List<DataPoint> CreateRandomPoints(int numberOfPoints = 50)
{
var r = new Random(13);
var result = new List<DataPoint>(numberOfPoints);
for (int i = 0; i < numberOfPoints; i++)
{
if (i < 5)
{
result.Add(new DataPoint(i, 0.0));
}
else if (i < 10)
{
result.Add(new DataPoint(i, 1.0));
}
else if (i < 12)
{
result.Add(new DataPoint(i, 0.0));
}
else
{
result.Add(new DataPoint(i, r.NextDouble()));
}
}
return result;
}
/// <summary>
/// Creates an example line series.
/// </summary>
/// <returns>A line series containing random points.</returns>
private static LineSeries CreateExampleLineSeries(int seed = 13)
{
var lineSeries1 = new LineSeries();
var r = new Random(seed);
var y = r.Next(10, 30);
for (int x = 0; x <= 100; x += 10)
{
lineSeries1.Points.Add(new DataPoint(x, y));
y += r.Next(-5, 5);
}
return lineSeries1;
}
private static PlotModel CreateModel(string title, int n = 20)
{
var model = new PlotModel { Title = title };
for (int i = 1; i <= n; i++)
{
var s = new LineSeries { Title = "Series " + i };
model.Series.Add(s);
for (double x = 0; x < 2 * Math.PI; x += 0.1)
{
s.Points.Add(new DataPoint(x, (Math.Sin(x * i) / (i + 1)) + i));
}
}
return model;
}
private static LineSeries CreateSeriesSuitableForDecimation()
{
var s1 = new LineSeries();
int n = 20000;
for (int i = 0; i < n; i++)
{
s1.Points.Add(new DataPoint((double)i / n, Math.Sin(i)));
}
return s1;
}
private static OxyPlot.Series.Series CreateRandomLineSeries(int n, string title, MarkerType markerType)
{
var s1 = new LineSeries { Title = title, MarkerType = markerType, MarkerStroke = OxyColors.Black, MarkerStrokeThickness = 1.0 };
double x = 0;
double y = 0;
for (int i = 0; i < n; i++)
{
x += 2 + Randomizer.NextDouble() * 10;
y += 1 + Randomizer.NextDouble();
var p = new DataPoint(x, y);
s1.Points.Add(p);
}
return s1;
}
}
}