AirScout/OxyPlot/Source/Examples/ExampleLibrary/Axes/DateTimeAxisExamples.cs

248 wiersze
9.3 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="DateTimeAxisExamples.cs" company="OxyPlot">
// Copyright (c) 2014 OxyPlot contributors
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
namespace ExampleLibrary
{
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
[Examples("DateTimeAxis"), Tags("Axes")]
public static class DateTimeAxisExamples
{
public class DateValue
{
public DateTime Date { get; set; }
public double Value { get; set; }
}
[Example("Default StringFormat")]
public static PlotModel DefaultValues()
{
return CreateExample(7, null);
}
[Example("StringFormat 'MMM dd\\nyyyy'")]
public static PlotModel StringFormat()
{
return CreateExample(7, "MMM dd\nyyyy");
}
private static PlotModel CreateExample(int days, string stringFormat)
{
var m = new PlotModel();
var startTime = new DateTime(2000, 1, 1);
var min = DateTimeAxis.ToDouble(startTime);
var max = min + days;
m.Axes.Add(new DateTimeAxis { Position = AxisPosition.Bottom, Minimum = min, Maximum = max, StringFormat = stringFormat });
m.Axes.Add(new DateTimeAxis { Position = AxisPosition.Left, Minimum = min, Maximum = max, StringFormat = stringFormat });
return m;
}
// [Example("DateTime Minimum bug")]
public static PlotModel Example1()
{
var tmp = new PlotModel { Title = "Test" };
tmp.Axes.Add(new LinearAxis { Position = AxisPosition.Left, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, TickStyle = TickStyle.Outside });
var dt = new DateTime(2010, 1, 1);
tmp.Axes.Add(new DateTimeAxis
{
Position = AxisPosition.Bottom,
Minimum = DateTimeAxis.ToDouble(dt),
Maximum = DateTimeAxis.ToDouble(dt.AddDays(1)),
IntervalType = DateTimeIntervalType.Hours,
MajorGridlineStyle = LineStyle.Solid,
Angle = 90,
StringFormat = "HH:mm",
MajorStep = 1.0 / 24 / 2, // 1/24 = 1 hour, 1/24/2 = 30 minutes
IsZoomEnabled = true,
MaximumPadding = 0,
MinimumPadding = 0,
TickStyle = TickStyle.None
});
var ls = new LineSeries { Title = "Line1", DataFieldX = "X", DataFieldY = "Y" };
var ii = new List<Item>();
for (int i = 0; i < 24; i++)
ii.Add(new Item { X = dt.AddHours(i), Y = i * i });
ls.ItemsSource = ii;
tmp.Series.Add(ls);
return tmp;
}
[Example("TimeZone adjustments")]
public static PlotModel DaylightSavingsBreak()
{
var m = new PlotModel();
var xa = new DateTimeAxis { Position = AxisPosition.Bottom };
// TimeZone not available in PCL...
m.Axes.Add(xa);
m.Axes.Add(new LinearAxis { Position = AxisPosition.Left });
var ls = new LineSeries { MarkerType = MarkerType.Circle };
m.Series.Add(ls);
// set the origin of the curve to 2013-03-31 00:00:00 (UTC)
var o = new DateTime(2013, 3, 31, 0, 0, 0, DateTimeKind.Utc);
// add points at 10min intervals
// at 2am the clocks are turned forward 1 hour (W. Europe Standard Time)
for (int i = 0; i < 400; i += 10)
{
var time = o.AddMinutes(i);
ls.Points.Add(DateTimeAxis.CreateDataPoint(time, i));
}
return m;
}
public class Item
{
public DateTime X { get; set; }
public double Y { get; set; }
}
[Example("DateTime axis")]
public static PlotModel DateTimeaxisPlotModel()
{
var start = new DateTime(2010, 01, 01);
var end = new DateTime(2015, 01, 01);
double increment = 3600 * 24 * 14;
// Create a random data collection
var r = new Random(13);
var data = new Collection<DateValue>();
var date = start;
while (date <= end)
{
data.Add(new DateValue { Date = date, Value = r.NextDouble() });
date = date.AddSeconds(increment);
}
var plotModel1 = new PlotModel { Title = "DateTime axis" };
var dateTimeAxis1 = new DateTimeAxis
{
CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek,
FirstDayOfWeek = DayOfWeek.Monday,
Position = AxisPosition.Bottom
};
plotModel1.Axes.Add(dateTimeAxis1);
var linearAxis1 = new LinearAxis();
plotModel1.Axes.Add(linearAxis1);
var lineSeries1 = new LineSeries
{
Color = OxyColor.FromArgb(255, 78, 154, 6),
MarkerFill = OxyColor.FromArgb(255, 78, 154, 6),
MarkerStroke = OxyColors.ForestGreen,
MarkerType = MarkerType.Plus,
StrokeThickness = 1,
DataFieldX = "Date",
DataFieldY = "Value",
ItemsSource = data
};
plotModel1.Series.Add(lineSeries1);
return plotModel1;
}
public class SunItem
{
public DateTime Day { get; set; }
public TimeSpan Sunrise { get; set; }
public TimeSpan Sunset { get; set; }
}
private static Collection<SunItem> CreateSunData(int year, double lat, double lon, Func<DateTime, DateTime> utcToLocalTime)
{
var data = new Collection<SunItem>();
var day = new DateTime(year, 1, 1);
while (day.Year == year)
{
var sunrise = Sun.Calculate(day, lat, lon, true, utcToLocalTime);
var sunset = Sun.Calculate(day, lat, lon, false, utcToLocalTime);
data.Add(new SunItem { Day = day, Sunrise = sunrise - day, Sunset = sunset - day });
day = day.AddDays(1);
}
return data;
}
public static bool IsDaylightSaving(DateTime time)
{
// Daylight saving starts last sunday in March and ends last sunday in October
// http://en.wikipedia.org/wiki/Daylight_saving_time
var start = new DateTime(time.Year, 3, 31, 2, 0, 0);
start = start.AddDays(-(int)start.DayOfWeek);
var end = new DateTime(time.Year, 10, 31, 3, 0, 0);
end = end.AddDays(-(int)end.DayOfWeek);
return time >= start && time <= end;
}
[Example("Sunrise and sunset in Oslo")]
public static PlotModel SunriseandsunsetinOslo()
{
int year = DateTime.Now.Year;
// Convert UTC time to Western European Time (WET)
Func<DateTime, DateTime> utcToLocalTime = utc => utc.AddHours(IsDaylightSaving(utc) ? 2 : 1);
var sunData = CreateSunData(year, 59.91, 10.75, utcToLocalTime);
var plotModel1 = new PlotModel { Title = "Sunrise and sunset in Oslo", Subtitle = "UTC time" };
var dateTimeAxis1 = new DateTimeAxis
{
CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek,
FirstDayOfWeek = DayOfWeek.Monday,
IntervalType = DateTimeIntervalType.Months,
MajorGridlineStyle = LineStyle.Solid,
Position = AxisPosition.Bottom,
StringFormat = "MMM"
};
plotModel1.Axes.Add(dateTimeAxis1);
var timeSpanAxis1 = new TimeSpanAxis { MajorGridlineStyle = LineStyle.Solid, Maximum = 86400, Minimum = 0, StringFormat = "h:mm" };
plotModel1.Axes.Add(timeSpanAxis1);
var areaSeries1 = new AreaSeries
{
ItemsSource = sunData,
DataFieldX = "Day",
DataFieldY = "Sunrise",
DataFieldX2 = "Day",
DataFieldY2 = "Sunset",
Fill = OxyColor.FromArgb(128, 255, 255, 0),
Color = OxyColors.Black
};
plotModel1.Series.Add(areaSeries1);
return plotModel1;
}
[Example("LabelFormatter")]
public static PlotModel LabelFormatter()
{
var model = new PlotModel { Title = "Using LabelFormatter to format labels by day of week" };
model.Axes.Add(new DateTimeAxis { LabelFormatter = x => DateTimeAxis.ToDateTime(x).DayOfWeek.ToString().Substring(0, 3) });
var series = new LineSeries();
model.Series.Add(series);
for (int i = 0; i < 7; i++)
{
var time = new DateTime(2014, 9, 10).AddDays(i);
double x = DateTimeAxis.ToDouble(time);
double y = Math.Sin(i * i);
series.Points.Add(new DataPoint(x, y));
}
return model;
}
}
}