SignalXY Plot
SignalXY plots are a high performance plot type for X/Y data where the X values are always ascending.
ScottPlot.Plot myPlot = new();
// generate sample data with gaps
List<double> xList = new();
List<double> yList = new();
for (int i = 0; i < 5; i++)
{
xList.AddRange(Generate.Consecutive(1000, first: 2000 * i));
yList.AddRange(Generate.RandomSample(1000));
}
double[] xs = xList.ToArray();
double[] ys = yList.ToArray();
// add a SignalXY plot
myPlot.Add.SignalXY(xs, ys);
myPlot.SavePng("demo.png", 400, 300);
SignalXY plots support arrays with generic data types, although double is typically the most performant.
ScottPlot.Plot myPlot = new();
// generate sample data with gaps
List<int> xList = new();
List<float> yList = new();
for (int i = 0; i < 5; i++)
{
xList.AddRange(Generate.Consecutive(1000, first: 2000 * i).Select(x => (int)x));
yList.AddRange(Generate.RandomSample(1000).Select(x => (float)x));
}
// this example converts
int[] xs = xList.ToArray();
float[] ys = yList.ToArray();
// add a SignalXY plot
myPlot.Add.SignalXY(xs, ys);
myPlot.SavePng("demo.png", 400, 300);
SignalXY plots support generic lists.
ScottPlot.Plot myPlot = new();
// create X and Y list with initial data
List<double> xs = new(Generate.Consecutive(count: 10, first: 0));
List<double> ys = new(Generate.RandomSample(10));
// create a signal plot from our X and Y lists
myPlot.Add.SignalXY(xs, ys);
// data can be added to lists later
xs.AddRange(Generate.Consecutive(count: 10, first: 50));
ys.AddRange(Generate.RandomSample(10));
myPlot.SavePng("demo.png", 400, 300);
SignalXY plots can display unevenly spaced time series data using a DateTime horizontal axis.
ScottPlot.Plot myPlot = new();
DateTime start = new(2024, 01, 01);
DateTime[] xs = Generate.ConsecutiveDays(100, start);
double[] ys = Generate.RandomWalk(100);
myPlot.Add.SignalXY(xs, ys);
myPlot.Axes.DateTimeTicksBottom();
myPlot.SavePng("demo.png", 400, 300);
Even if a SignalXY plot references a large array of data, rendering can be limited to a range of values. If set,only the range of data between the minimum and maximum render indexes will be displayed.
ScottPlot.Plot myPlot = new();
double[] xs = Generate.Consecutive(1000);
double[] ys = Generate.RandomWalk(1000);
var sigAll = myPlot.Add.SignalXY(xs, ys);
sigAll.LegendText = "Full";
sigAll.Data.YOffset = 80;
var sigLeft = myPlot.Add.SignalXY(xs, ys);
sigLeft.LegendText = "Left";
sigLeft.Data.YOffset = 60;
sigLeft.Data.MaximumIndex = 700;
var sigRight = myPlot.Add.SignalXY(xs, ys);
sigRight.LegendText = "Right";
sigRight.Data.YOffset = 40;
sigRight.Data.MinimumIndex = 300;
var sigMid = myPlot.Add.SignalXY(xs, ys);
sigMid.LegendText = "Mid";
sigMid.Data.YOffset = 20;
sigMid.Data.MinimumIndex = 300;
sigMid.Data.MaximumIndex = 700;
myPlot.ShowLegend(Alignment.UpperRight);
myPlot.Axes.Margins(top: .5);
myPlot.SavePng("demo.png", 400, 300);
A fixed offset can be applied to SignalXY plots.
ScottPlot.Plot myPlot = new();
double[] xs = Generate.Consecutive(1000);
double[] ys = Generate.Sin(1000);
var sig1 = myPlot.Add.SignalXY(xs, ys);
var sig2 = myPlot.Add.SignalXY(xs, ys);
sig2.Data.XOffset = 250;
sig2.Data.YOffset = .5;
myPlot.SavePng("demo.png", 400, 300);
SignalXY plots can be scaled vertically according to a user-defined amount.
ScottPlot.Plot myPlot = new();
// plot values between -1 and 1
double[] values = ScottPlot.Generate.Sin(51);
double[] xs = ScottPlot.Generate.Consecutive(51);
var signalXY = myPlot.Add.SignalXY(xs, values);
// increase the vertical scaling
signalXY.Data.YScale = 500;
myPlot.SavePng("demo.png", 400, 300);
Although SignalXY plots typically display data left-to-right, it is possible to use this plot type to display data bottom-to-top.
ScottPlot.Plot myPlot = new();
double[] xs = Generate.Consecutive(1000);
double[] ys = Generate.RandomWalk(1000);
var sig1 = myPlot.Add.SignalXY(xs, ys);
sig1.Data.Rotated = true;
myPlot.SavePng("demo.png", 400, 300);
Demonstrates how to display a rotated SignalXY plot (so it goes from bottom to top) which is also displayed on an inverted horizontal axis (where positive values are on the left).
ScottPlot.Plot myPlot = new();
// add a signal plot
double[] xs = Generate.Consecutive(5_000);
double[] ys = Generate.Sin(count: xs.Length, oscillations: 4);
// rotate it so it is vertical
var signal = myPlot.Add.SignalXY(xs, ys);
signal.Data.Rotated = true;
// invert the horizontal axis
myPlot.Axes.SetLimitsX(1, -1);
myPlot.SavePng("demo.png", 400, 300);
Demonstrates how to display a rotated SignalXY plot on an inverted vertical axis so data goes from top to bottom.
ScottPlot.Plot myPlot = new();
// add a signal plot
double[] xs = Generate.Consecutive(5_000);
double[] ys = Generate.Sin(count: xs.Length, oscillations: 4);
// rotate it so it is vertical
var signal = myPlot.Add.SignalXY(xs, ys);
signal.Data.Rotated = true;
// invert the vertical axis
myPlot.Axes.SetLimitsY(5000, 0);
myPlot.SavePng("demo.png", 400, 300);
Users can enable a marker to be displayedat each data point. However, this can reduce performance for extremely large datasets.
ScottPlot.Plot myPlot = new();
double[] xs = Generate.Consecutive(51);
double[] ys = Generate.Sin(51);
var sig = myPlot.Add.SignalXY(xs, ys);
sig.MarkerStyle.Shape = MarkerShape.FilledCircle;
sig.MarkerStyle.Size = 5;
myPlot.SavePng("demo.png", 400, 300);










