Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/ScatterPlotView.cs @ 12695

Last change on this file since 12695 was 5275, checked in by gkronber, 14 years ago

Merged changes from trunk to data analysis exploration branch and added fractional distance metric evaluator. #1142

File size: 9.8 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21using System;
22using System.Collections.Generic;
23using System.Drawing;
24using System.Linq;
25using System.Windows.Forms;
26using System.Windows.Forms.DataVisualization.Charting;
27using HeuristicLab.MainForm;
28using HeuristicLab.MainForm.WindowsForms;
29
30namespace HeuristicLab.Problems.DataAnalysis.Views {
31  [View("Scatter Plot View")]
32  [Content(typeof(DataAnalysisSolution), true)]
33  public partial class ScatterPlotView : AsynchronousContentView {
34    private const string ALL_SERIES = "All Samples";
35    private const string TRAINING_SERIES = "Training Samples";
36    private const string TEST_SERIES = "Test Samples";
37
38    public new DataAnalysisSolution Content {
39      get { return (DataAnalysisSolution)base.Content; }
40      set { base.Content = value; }
41    }
42
43    public ScatterPlotView()
44      : base() {
45      InitializeComponent();
46
47      this.chart.Series.Add(ALL_SERIES);
48      this.chart.Series[ALL_SERIES].LegendText = ALL_SERIES;
49      this.chart.Series[ALL_SERIES].ChartType = SeriesChartType.FastPoint;
50
51      this.chart.Series.Add(TRAINING_SERIES);
52      this.chart.Series[TRAINING_SERIES].LegendText = TRAINING_SERIES;
53      this.chart.Series[TRAINING_SERIES].ChartType = SeriesChartType.FastPoint;
54      this.chart.Series[TRAINING_SERIES].Points.Add(1.0);
55
56      this.chart.Series.Add(TEST_SERIES);
57      this.chart.Series[TEST_SERIES].LegendText = TEST_SERIES;
58      this.chart.Series[TEST_SERIES].ChartType = SeriesChartType.FastPoint;
59
60      this.chart.TextAntiAliasingQuality = TextAntiAliasingQuality.High;
61      this.chart.AxisViewChanged += new EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(chart_AxisViewChanged);
62
63      //configure axis
64      this.chart.CustomizeAllChartAreas();
65      this.chart.ChartAreas[0].AxisX.Title = "Estimated Values";
66      this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
67      this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
68      this.chart.ChartAreas[0].CursorX.Interval = 1;
69      this.chart.ChartAreas[0].CursorY.Interval = 1;
70
71      this.chart.ChartAreas[0].AxisY.Title = "Target Values";
72      this.chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
73      this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
74      this.chart.ChartAreas[0].AxisY.IsStartedFromZero = true;
75    }
76
77    protected override void RegisterContentEvents() {
78      base.RegisterContentEvents();
79      Content.EstimatedValuesChanged += new EventHandler(Content_EstimatedValuesChanged);
80      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
81    }
82    protected override void DeregisterContentEvents() {
83      base.DeregisterContentEvents();
84      Content.EstimatedValuesChanged -= new EventHandler(Content_EstimatedValuesChanged);
85      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
86    }
87
88
89    private void Content_ProblemDataChanged(object sender, EventArgs e) {
90      UpdateChart();
91    }
92    private void Content_EstimatedValuesChanged(object sender, EventArgs e) {
93      UpdateSeries();
94    }
95
96    protected override void OnContentChanged() {
97      base.OnContentChanged();
98      UpdateChart();
99    }
100
101    private void UpdateChart() {
102      if (InvokeRequired) Invoke((Action)UpdateChart);
103      else {
104        if (Content != null) {
105          this.UpdateSeries();
106          if (!this.chart.Series.Any(s => s.Points.Count > 0))
107            this.ClearChart();
108        }
109      }
110    }
111
112    private void UpdateCursorInterval() {
113      var estimatedValues = this.chart.Series[ALL_SERIES].Points.Select(x => x.XValue).DefaultIfEmpty(1.0);
114      var targetValues = this.chart.Series[ALL_SERIES].Points.Select(x => x.YValues[0]).DefaultIfEmpty(1.0);
115      double estimatedValuesRange = estimatedValues.Max() - estimatedValues.Min();
116      double targetValuesRange = targetValues.Max() - targetValues.Min();
117      double interestingValuesRange = Math.Min(Math.Max(targetValuesRange, 1.0), Math.Max(estimatedValuesRange, 1.0));
118      double digits = (int)Math.Log10(interestingValuesRange) - 3;
119      double zoomInterval = Math.Max(Math.Pow(10, digits), 10E-5);
120      this.chart.ChartAreas[0].CursorX.Interval = zoomInterval;
121      this.chart.ChartAreas[0].CursorY.Interval = zoomInterval;
122    }
123
124
125    private void UpdateSeries() {
126      if (InvokeRequired) Invoke((Action)UpdateSeries);
127      else {
128        string targetVariableName = Content.ProblemData.TargetVariable.Value;
129        Dataset dataset = Content.ProblemData.Dataset;
130        if (this.chart.Series[ALL_SERIES].Points.Count > 0)
131          this.chart.Series[ALL_SERIES].Points.DataBindXY(Content.EstimatedValues.ToArray(), "",
132            dataset.GetVariableValues(targetVariableName), "");
133        if (this.chart.Series[TRAINING_SERIES].Points.Count > 0)
134          this.chart.Series[TRAINING_SERIES].Points.DataBindXY(Content.EstimatedTrainingValues.ToArray(), "",
135            dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TrainingIndizes).ToArray(), "");
136        if (this.chart.Series[TEST_SERIES].Points.Count > 0)
137          this.chart.Series[TEST_SERIES].Points.DataBindXY(Content.EstimatedTestValues.ToArray(), "",
138           dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TestIndizes).ToArray(), "");
139
140        double max = Math.Max(Content.EstimatedValues.Max(), dataset.GetVariableValues(targetVariableName).Max());
141        double min = Math.Min(Content.EstimatedValues.Min(), dataset.GetVariableValues(targetVariableName).Min());
142
143        max = max + 0.2 * Math.Abs(max);
144        min = min - 0.2 * Math.Abs(min);
145
146        double interestingValuesRange = max - min;
147        int digits = Math.Max(0, 3 - (int)Math.Log10(interestingValuesRange));
148
149        max = Math.Round(max, digits);
150        min = Math.Round(min, digits);
151
152        this.chart.ChartAreas[0].AxisX.Maximum = max;
153        this.chart.ChartAreas[0].AxisX.Minimum = min;
154        this.chart.ChartAreas[0].AxisY.Maximum = max;
155        this.chart.ChartAreas[0].AxisY.Minimum = min;
156        UpdateCursorInterval();
157      }
158    }
159
160    private void ClearChart() {
161      this.chart.Series[ALL_SERIES].Points.Clear();
162      this.chart.Series[TRAINING_SERIES].Points.Clear();
163      this.chart.Series[TEST_SERIES].Points.Clear();
164    }
165
166    private void ToggleSeriesData(Series series) {
167      if (series.Points.Count > 0) {  //checks if series is shown
168        if (this.chart.Series.Any(s => s != series && s.Points.Count > 0)) {
169          series.Points.Clear();
170        }
171      } else if (Content != null) {
172        string targetVariableName = Content.ProblemData.TargetVariable.Value;
173
174        IEnumerable<double> predictedValues = null;
175        IEnumerable<double> targetValues = null;
176        switch (series.Name) {
177          case ALL_SERIES:
178            predictedValues = Content.EstimatedValues.ToArray();
179            targetValues = Content.ProblemData.Dataset.GetVariableValues(targetVariableName);
180            break;
181          case TRAINING_SERIES:
182            predictedValues = Content.EstimatedTrainingValues.ToArray();
183            targetValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TrainingIndizes).ToArray();
184            break;
185          case TEST_SERIES:
186            predictedValues = Content.EstimatedTestValues.ToArray();
187            targetValues = Content.ProblemData.Dataset.GetEnumeratedVariableValues(targetVariableName, Content.ProblemData.TestIndizes).ToArray();
188            break;
189        }
190        series.Points.DataBindXY(predictedValues, "", targetValues, "");
191        this.chart.Legends[series.Legend].ForeColor = Color.Black;
192        UpdateCursorInterval();
193      }
194    }
195
196    private void chart_MouseDown(object sender, MouseEventArgs e) {
197      HitTestResult result = chart.HitTest(e.X, e.Y);
198      if (result.ChartElementType == ChartElementType.LegendItem) {
199        this.ToggleSeriesData(result.Series);
200      }
201    }
202
203    private void chart_MouseMove(object sender, MouseEventArgs e) {
204      HitTestResult result = chart.HitTest(e.X, e.Y);
205      if (result.ChartElementType == ChartElementType.LegendItem)
206        this.Cursor = Cursors.Hand;
207      else
208        this.Cursor = Cursors.Default;
209    }
210
211    private void chart_AxisViewChanged(object sender, System.Windows.Forms.DataVisualization.Charting.ViewEventArgs e) {
212      this.chart.ChartAreas[0].AxisX.ScaleView.Size = e.NewSize;
213      this.chart.ChartAreas[0].AxisY.ScaleView.Size = e.NewSize;
214    }
215
216    private void chart_CustomizeLegend(object sender, CustomizeLegendEventArgs e) {
217      e.LegendItems[0].Cells[1].ForeColor = this.chart.Series[ALL_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
218      e.LegendItems[1].Cells[1].ForeColor = this.chart.Series[TRAINING_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
219      e.LegendItems[2].Cells[1].ForeColor = this.chart.Series[TEST_SERIES].Points.Count == 0 ? Color.Gray : Color.Black;
220    }
221  }
222}
Note: See TracBrowser for help on using the repository browser.