private void CreateTradeRetsByDayAndHourChartModel() { var distinctDays = Data.tradeRetsByDayAndHour.Select(x => x.weekDay).Distinct(); var distinctHours = Data.tradeRetsByDayAndHour.Select(x => x.hour).OrderByDescending(x => x).Distinct(); var model = new PlotModel(); var xAxis = new OxyPlot.Axes.CategoryAxis { Key = "dayAxis", Position = OxyPlot.Axes.AxisPosition.Bottom, ItemsSource = distinctDays.Select(x => x.ToString()) }; var yAxis = new OxyPlot.Axes.CategoryAxis { Key = "hourAxis", Position = OxyPlot.Axes.AxisPosition.Left, ItemsSource = distinctHours.Select(x => x.ToString()) }; model.Axes.Add(xAxis); model.Axes.Add(yAxis); model.Axes.Add(new OxyPlot.Axes.LinearColorAxis { Palette = OxyPalettes.BlueWhiteRed31 }); //take avg trade ret by day/hour and turn it into an array int dayCount = distinctDays.Count(); int hourCount = distinctHours.Count(); var data = new double[dayCount, hourCount]; var weekDayTrans = distinctDays.Select((x, a) => new { x, a }).ToDictionary(x => x.x, x => x.a); var hourTrans = distinctHours.Select((x, a) => new { x, a }).OrderByDescending(x => x.x).ToDictionary(x => x.x, x => x.a); foreach (var ret in Data.tradeRetsByDayAndHour) { data[weekDayTrans[ret.weekDay], hourTrans[ret.hour]] = ret.avgRet; } var heatMapSeries = new OxyPlot.Series.HeatMapSeries { X0 = 0, X1 = dayCount - 1, Y0 = 0, Y1 = hourCount - 1, XAxisKey = "dayAxis", YAxisKey = "hourAxis", RenderMethod = HeatMapRenderMethod.Rectangles, LabelFontSize = 0.2, // neccessary to display the label LabelFormatString = "p2", Data = data }; model.Series.Add(heatMapSeries); TradeRetsByDayAndHourModel = model; }