#region License Information
/* HeuristicLab
* Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using HeuristicLab.Analysis;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HEAL.Attic;
using HeuristicLab.Visualization.ChartControlsExtensions;
namespace HeuristicLab.DataPreprocessing {
[Item("ScatterPlotContent", "")]
[StorableType("CF1014CB-9B19-4653-AEC2-630C231D89B2")]
public abstract class ScatterPlotContent : PreprocessingChartContent {
[Storable]
public string GroupingVariable { get; set; }
#region Constructor, Cloning & Persistence
protected ScatterPlotContent(IFilteredPreprocessingData preprocessingData)
: base(preprocessingData) {
}
protected ScatterPlotContent(ScatterPlotContent original, Cloner cloner)
: base(original, cloner) {
GroupingVariable = original.GroupingVariable;
}
[StorableConstructor]
protected ScatterPlotContent(StorableConstructorFlag _) : base(_) { }
#endregion
public static ScatterPlot CreateScatterPlot(IFilteredPreprocessingData preprocessingData, string variableNameX, string variableNameY, string variableNameGroup = "-", LegendOrder legendOrder = LegendOrder.Alphabetically) {
ScatterPlot scatterPlot = new ScatterPlot();
IList xValues = preprocessingData.GetValues(preprocessingData.GetColumnIndex(variableNameX));
IList yValues = preprocessingData.GetValues(preprocessingData.GetColumnIndex(variableNameY));
var points = xValues.Zip(yValues, (x, y) => new Point2D(x, y)).ToList();
var validPoints = points.Where(p => !double.IsNaN(p.X) && !double.IsNaN(p.Y) && !double.IsInfinity(p.X) && !double.IsInfinity(p.Y)).ToList();
if (validPoints.Any()) {
try {
double axisMin, axisMax, axisInterval;
ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.X), validPoints.Max(p => p.X), out axisMin, out axisMax, out axisInterval);
scatterPlot.VisualProperties.XAxisMinimumAuto = false;
scatterPlot.VisualProperties.XAxisMaximumAuto = false;
scatterPlot.VisualProperties.XAxisMinimumFixedValue = axisMin;
scatterPlot.VisualProperties.XAxisMaximumFixedValue = axisMax;
} catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval
try {
double axisMin, axisMax, axisInterval;
ChartUtil.CalculateOptimalAxisInterval(validPoints.Min(p => p.Y), validPoints.Max(p => p.Y), out axisMin, out axisMax, out axisInterval);
scatterPlot.VisualProperties.YAxisMinimumAuto = false;
scatterPlot.VisualProperties.YAxisMaximumAuto = false;
scatterPlot.VisualProperties.YAxisMinimumFixedValue = axisMin;
scatterPlot.VisualProperties.YAxisMaximumFixedValue = axisMax;
} catch (ArgumentOutOfRangeException) { } // error during CalculateOptimalAxisInterval
}
//No Grouping
if (string.IsNullOrEmpty(variableNameGroup) || variableNameGroup == "-") {
ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY, "", validPoints);
scdr.VisualProperties.IsVisibleInLegend = false;
scatterPlot.Rows.Add(scdr);
return scatterPlot;
}
//Grouping
int groupVariableIndex = preprocessingData.GetColumnIndex(variableNameGroup);
var groupingValues = Enumerable.Empty();
if (preprocessingData.VariableHasType(groupVariableIndex)) {
groupingValues = preprocessingData.GetValues(groupVariableIndex).Select(x => x.ToString());
} else if (preprocessingData.VariableHasType(groupVariableIndex)) {
groupingValues = preprocessingData.GetValues(groupVariableIndex);
} else if (preprocessingData.VariableHasType(groupVariableIndex)) {
groupingValues = preprocessingData.GetValues(groupVariableIndex).Select(x => x.ToString());
}
var groups = groupingValues.Zip(validPoints, Tuple.Create).GroupBy(t => t.Item1, t => t.Item2);
if (legendOrder == LegendOrder.Alphabetically)
groups = groups.OrderBy(x => x.Key, new NaturalStringComparer());
foreach (var group in groups) {
var scdr = new ScatterPlotDataRow {
Name = group.Key,
VisualProperties = {
IsVisibleInLegend = true,
PointSize = 6
}
};
scdr.Points.AddRange(group);
scatterPlot.Rows.Add(scdr);
}
return scatterPlot;
}
}
}