Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.3/LineChartView.cs @ 3707

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

Added adjustment of cursor interval based on range of displayed values in the RunCollectionBubbleChartView ScatterPlotView and LineChartView. #893

File size: 6.3 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.Collections.Specialized;
24using System.ComponentModel;
25using System.Data;
26using System.Drawing;
27using System.Linq;
28using System.Text;
29using System.Windows.Forms;
30using HeuristicLab.Common;
31using HeuristicLab.MainForm;
32using HeuristicLab.Problems.DataAnalysis;
33using HeuristicLab.MainForm.WindowsForms;
34using System.Windows.Forms.DataVisualization.Charting;
35
36namespace HeuristicLab.Problems.DataAnalysis.Views {
37  [View("Line Chart View")]
38  [Content(typeof(DataAnalysisSolution))]
39  public partial class LineChartView : AsynchronousContentView {
40    private const string TARGETVARIABLE_SERIES_NAME = "TargetVariable";
41    private const string ESTIMATEDVALUES_SERIES_NAME = "EstimatedValues";
42
43    public new DataAnalysisSolution Content {
44      get { return (DataAnalysisSolution)base.Content; }
45      set {
46        base.Content = value;
47      }
48    }
49
50    public LineChartView()
51      : base() {
52      InitializeComponent();
53      this.Caption = "Line Chart View";
54      //configure axis
55      this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
56      this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
57      this.chart.ChartAreas[0].CursorX.Interval = 1;
58
59      this.chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
60      this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
61      this.chart.ChartAreas[0].CursorY.Interval = 0;
62    }
63
64    private void RedrawChart() {
65      this.chart.Series.Clear();
66      this.chart.Series.Add(TARGETVARIABLE_SERIES_NAME);
67      this.chart.Series[TARGETVARIABLE_SERIES_NAME].LegendText = Content.ProblemData.TargetVariable.Value;
68      this.chart.Series[TARGETVARIABLE_SERIES_NAME].ChartType = SeriesChartType.FastLine;
69      this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.DataBindY(Content.ProblemData.Dataset[Content.ProblemData.TargetVariable.Value]);
70      this.UpdateStripLines();
71
72      this.chart.Series.Add(ESTIMATEDVALUES_SERIES_NAME);
73      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].LegendText = Content.ItemName;
74      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].ChartType = SeriesChartType.FastLine;
75      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].Points.DataBindY(Content.EstimatedValues.ToArray());
76      this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].Tag = Content;
77      UpdateCursorInterval();
78    }
79
80    private void UpdateCursorInterval() {
81      var estimatedValues = this.chart.Series[ESTIMATEDVALUES_SERIES_NAME].Points.Select(x => x.YValues[0]).DefaultIfEmpty(1.0);
82      var targetValues = this.chart.Series[TARGETVARIABLE_SERIES_NAME].Points.Select(x => x.YValues[0]).DefaultIfEmpty(1.0);
83      double estimatedValuesRange = estimatedValues.Max() - estimatedValues.Min();
84      double targetValuesRange = targetValues.Max() - targetValues.Min();
85      double interestingValuesRange = Math.Min(Math.Max(targetValuesRange, 1.0), Math.Max(estimatedValuesRange, 1.0));
86      double digits = (int)Math.Log10(interestingValuesRange) - 3;
87      double yZoomInterval = Math.Max(Math.Pow(10, digits), 10E-5);
88      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
89    }
90
91    #region events
92    protected override void RegisterContentEvents() {
93      base.RegisterContentEvents();
94      Content.EstimatedValuesChanged += new EventHandler(Content_EstimatedValuesChanged);
95      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
96    }
97
98    protected override void DeregisterContentEvents() {
99      base.DeregisterContentEvents();
100      Content.EstimatedValuesChanged -= new EventHandler(Content_EstimatedValuesChanged);
101      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
102    }
103
104    void Content_ProblemDataChanged(object sender, EventArgs e) {
105      RedrawChart();
106    }
107
108    void Content_EstimatedValuesChanged(object sender, EventArgs e) {
109      UpdateEstimatedValuesLineChart();
110    }
111
112    protected override void OnContentChanged() {
113      base.OnContentChanged();
114      RedrawChart();
115    }
116
117    private void UpdateEstimatedValuesLineChart() {
118      if (InvokeRequired) Invoke((Action)UpdateEstimatedValuesLineChart);
119      else {
120        if (this.chart.Series.Count > 0) {
121          Series s = this.chart.Series.SingleOrDefault(x => x.Tag == Content);
122          if (s != null) {
123            s.Points.DataBindY(Content.EstimatedValues.ToArray());
124            s.LegendText = Content.ItemName;
125            this.UpdateStripLines();
126            UpdateCursorInterval();
127          }
128        }
129      }
130    }
131    #endregion
132
133    private void UpdateStripLines() {
134      this.chart.ChartAreas[0].AxisX.StripLines.Clear();
135      this.CreateAndAddStripLine("Training", Color.FromArgb(20, Color.Green),
136        Content.ProblemData.TrainingSamplesStart.Value,
137        Content.ProblemData.TrainingSamplesEnd.Value);
138      this.CreateAndAddStripLine("Test", Color.FromArgb(20, Color.Red),
139        Content.ProblemData.TestSamplesStart.Value,
140        Content.ProblemData.TestSamplesEnd.Value);
141    }
142
143    private void CreateAndAddStripLine(string title, Color c, int start, int end) {
144      StripLine stripLine = new StripLine();
145      stripLine.BackColor = c;
146      stripLine.Text = title;
147      stripLine.Font = new Font("Times New Roman", 12, FontStyle.Bold);
148      stripLine.StripWidth = end - start;
149      stripLine.IntervalOffset = start;
150      this.chart.ChartAreas[0].AxisX.StripLines.Add(stripLine);
151    }
152  }
153}
Note: See TracBrowser for help on using the repository browser.