Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/14/17 10:29:51 (7 years ago)
Author:
pfleck
Message:

#2709 merged to stable

Location:
stable
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.DataPreprocessing.Views

  • stable/HeuristicLab.DataPreprocessing.Views/3.4/ScatterPlotSingleView.cs

    r14186 r15242  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Drawing;
    2425using System.Linq;
    2526using HeuristicLab.Analysis;
     27using HeuristicLab.Common;
    2628using HeuristicLab.Core.Views;
    2729using HeuristicLab.MainForm;
     30using RegressionType = HeuristicLab.Analysis.ScatterPlotDataRowVisualProperties.ScatterPlotDataRowRegressionType;
    2831
    2932namespace HeuristicLab.DataPreprocessing.Views {
    3033
    3134  [View("Scatter Plot Single View")]
    32   [Content(typeof(ScatterPlotContent), true)]
    33   public partial class ScatterPlotSingleView : ItemView {
    34 
    35     public new ScatterPlotContent Content {
    36       get { return (ScatterPlotContent)base.Content; }
     35  [Content(typeof(SingleScatterPlotContent), true)]
     36  public sealed partial class ScatterPlotSingleView : ItemView {
     37    private readonly string NoGroupItem = "";
     38
     39    public new SingleScatterPlotContent Content {
     40      get { return (SingleScatterPlotContent)base.Content; }
    3741      set { base.Content = value; }
    3842    }
     
    4044    public ScatterPlotSingleView() {
    4145      InitializeComponent();
    42     }
    43 
    44     public void InitData() {
     46
     47      regressionTypeComboBox.DataSource = Enum.GetValues(typeof(RegressionType));
     48      regressionTypeComboBox.SelectedItem = RegressionType.None;
     49      orderComboBox.DataSource = Enum.GetValues(typeof(PreprocessingChartContent.LegendOrder));
     50      orderComboBox.SelectedItem = PreprocessingChartContent.LegendOrder.Alphabetically;
     51    }
     52
     53    protected override void SetEnabledStateOfControls() {
     54      base.SetEnabledStateOfControls();
     55      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem;
     56      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked; ;
     57    }
     58
     59    protected override void OnContentChanged() {
     60      base.OnContentChanged();
     61      if (Content != null) {
     62        InitData();
     63      }
     64    }
     65
     66    private void InitData() {
    4567      IEnumerable<string> variables = Content.PreprocessingData.GetDoubleVariableNames();
    4668
    47       // add variables to combo boxes
    4869      comboBoxXVariable.Items.Clear();
    4970      comboBoxYVariable.Items.Clear();
    50       comboBoxColor.Items.Clear();
     71      comboBoxGroup.Items.Clear();
     72
    5173      comboBoxXVariable.Items.AddRange(variables.ToArray());
    5274      comboBoxYVariable.Items.AddRange(variables.ToArray());
    53       comboBoxColor.Items.Add("-");
    54       for (int i = 0; i < Content.PreprocessingData.Columns; ++i) {
    55         if (Content.PreprocessingData.VariableHasType<double>(i)) {
    56           double distinctValueCount = Content.PreprocessingData.GetValues<double>(i).GroupBy(x => x).Count();
    57           if (distinctValueCount <= 20)
    58             comboBoxColor.Items.Add(Content.PreprocessingData.GetVariableName(i));
    59         }
    60       }
     75      comboBoxGroup.Items.Add(NoGroupItem);
     76      foreach (string var in PreprocessingChartContent.GetVariableNamesForGrouping(Content.PreprocessingData, 50)) {
     77        comboBoxGroup.Items.Add(var);
     78      }
     79      comboBoxGroup.SelectedItem = Content.GroupingVariable ?? NoGroupItem;
    6180
    6281      // use x and y variable from content
    63       if (Content.SelectedXVariable != null && Content.SelectedYVariable != null && Content.SelectedColorVariable != null) {
     82      if (Content.SelectedXVariable != null && Content.SelectedYVariable != null && Content.GroupingVariable != null) {
    6483        comboBoxXVariable.SelectedItem = Content.SelectedXVariable;
    6584        comboBoxYVariable.SelectedItem = Content.SelectedYVariable;
    66         comboBoxColor.SelectedItem = Content.SelectedColorVariable;
     85        comboBoxGroup.SelectedItem = Content.GroupingVariable;
    6786      } else {
    6887        if (variables.Count() >= 2) {
    6988          comboBoxXVariable.SelectedIndex = 0;
    7089          comboBoxYVariable.SelectedIndex = 1;
    71           comboBoxColor.SelectedIndex = 0;
     90          comboBoxGroup.SelectedIndex = 0;
    7291          UpdateScatterPlot();
    7392        }
     
    7594    }
    7695
    77     protected override void OnContentChanged() {
    78       base.OnContentChanged();
    79       if (Content != null) {
    80         InitData();
    81       }
    82     }
    83 
    84     private void comboBox_SelectedIndexChanged(object sender, EventArgs e) {
    85       UpdateScatterPlot();
    86     }
    87 
    8896    private void UpdateScatterPlot() {
    89       if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxColor.SelectedItem != null) {
    90         //get scatter plot with selected x and y variable
    91         ScatterPlot scatterPlot = Content.CreateScatterPlot(
    92           (string)comboBoxXVariable.SelectedItem,
    93           (string)comboBoxYVariable.SelectedItem,
    94           (string)comboBoxColor.SelectedItem);
     97      if (comboBoxXVariable.SelectedItem != null && comboBoxYVariable.SelectedItem != null && comboBoxGroup.SelectedItem != null) {
     98        var xVariable = (string)comboBoxXVariable.SelectedItem;
     99        var yVariable = (string)comboBoxYVariable.SelectedItem;
     100        var groupVariable = (string)comboBoxGroup.SelectedItem;
     101        var legendOrder = (PreprocessingChartContent.LegendOrder)orderComboBox.SelectedItem;
     102
     103        ScatterPlot scatterPlot = ScatterPlotContent.CreateScatterPlot(Content.PreprocessingData, xVariable, yVariable, groupVariable, legendOrder);
     104        //rows are saved and removed to avoid firing of visual property changed events
     105        var rows = scatterPlot.Rows.ToList();
     106        scatterPlot.Rows.Clear();
     107        var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
     108        int order = (int)polynomialRegressionOrderNumericUpDown.Value;
     109        foreach (var row in rows) {
     110          row.VisualProperties.PointSize = 6;
     111          row.VisualProperties.IsRegressionVisibleInLegend = false;
     112          row.VisualProperties.RegressionType = regressionType;
     113          row.VisualProperties.PolynomialRegressionOrder = order;
     114          row.VisualProperties.IsVisibleInLegend = !useGradientCheckBox.Checked;
     115        }
     116        scatterPlot.Rows.AddRange(rows);
     117        var vp = scatterPlot.VisualProperties;
     118        vp.Title = string.Empty;
     119        vp.XAxisTitle = xVariable;
     120        vp.YAxisTitle = yVariable;
     121
    95122        scatterPlotView.Content = scatterPlot;
    96123
     
    98125        this.Content.SelectedXVariable = (string)comboBoxXVariable.SelectedItem;
    99126        this.Content.SelectedYVariable = (string)comboBoxYVariable.SelectedItem;
    100         this.Content.SelectedColorVariable = (string)comboBoxColor.SelectedItem;
    101       }
     127        this.Content.GroupingVariable = (string)comboBoxGroup.SelectedItem;
     128      }
     129    }
     130
     131    private void comboBoxXVariable_SelectedIndexChanged(object sender, EventArgs e) {
     132      var oldPlot = scatterPlotView.Content;
     133      UpdateScatterPlot();
     134      var newPlot = scatterPlotView.Content;
     135
     136      if (oldPlot == null || newPlot == null) return;
     137      newPlot.VisualProperties.YAxisMinimumAuto = oldPlot.VisualProperties.YAxisMinimumAuto;
     138      newPlot.VisualProperties.YAxisMaximumAuto = oldPlot.VisualProperties.YAxisMaximumAuto;
     139      newPlot.VisualProperties.YAxisMinimumFixedValue = oldPlot.VisualProperties.YAxisMinimumFixedValue;
     140      newPlot.VisualProperties.YAxisMaximumFixedValue = oldPlot.VisualProperties.YAxisMaximumFixedValue;
     141
     142      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
     143        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
     144        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
     145        x.nr.VisualProperties = newVisuapProperties;
     146      }
     147    }
     148
     149    private void comboBoxYVariable_SelectedIndexChanged(object sender, EventArgs e) {
     150      SuspendRepaint();
     151      var oldPlot = scatterPlotView.Content;
     152      UpdateScatterPlot();
     153      var newPlot = scatterPlotView.Content;
     154
     155      if (oldPlot == null || newPlot == null) return;
     156      newPlot.VisualProperties.XAxisMinimumAuto = oldPlot.VisualProperties.XAxisMinimumAuto;
     157      newPlot.VisualProperties.XAxisMaximumAuto = oldPlot.VisualProperties.XAxisMaximumAuto;
     158      newPlot.VisualProperties.XAxisMinimumFixedValue = oldPlot.VisualProperties.XAxisMinimumFixedValue;
     159      newPlot.VisualProperties.XAxisMaximumFixedValue = oldPlot.VisualProperties.XAxisMaximumFixedValue;
     160
     161      foreach (var x in newPlot.Rows.Zip(oldPlot.Rows, (nr, or) => new { nr, or })) {
     162        var newVisuapProperties = (ScatterPlotDataRowVisualProperties)x.or.VisualProperties.Clone();
     163        newVisuapProperties.DisplayName = x.nr.VisualProperties.DisplayName;
     164        x.nr.VisualProperties = newVisuapProperties;
     165      }
     166      ResumeRepaint(true);
     167    }
     168
     169    private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e) {
     170      useGradientCheckBox.Enabled = (string)comboBoxGroup.SelectedItem != NoGroupItem && Content.PreprocessingData.GetDoubleVariableNames().Contains((string)comboBoxGroup.SelectedItem);
     171      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
     172      UpdateScatterPlot();
     173    }
     174
     175    #region Regression Line
     176    private void regressionTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
     177      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
     178      polynomialRegressionOrderNumericUpDown.Enabled = regressionType == RegressionType.Polynomial;
     179
     180      UpdateRegressionLine();
     181    }
     182
     183    private void polynomialRegressionOrderNumericUpDown_ValueChanged(object sender, EventArgs e) {
     184      UpdateRegressionLine();
     185    }
     186
     187    private void UpdateRegressionLine() {
     188      if (Content == null) return;
     189
     190      var regressionType = (RegressionType)regressionTypeComboBox.SelectedValue;
     191      int order = (int)polynomialRegressionOrderNumericUpDown.Value;
     192
     193      foreach (var row in scatterPlotView.Content.Rows) {
     194        row.VisualProperties.IsRegressionVisibleInLegend = false;
     195        row.VisualProperties.RegressionType = regressionType;
     196        row.VisualProperties.PolynomialRegressionOrder = order;
     197      }
     198    }
     199    #endregion
     200
     201    private void useGradientCheckBox_CheckedChanged(object sender, EventArgs e) {
     202      gradientPanel.Visible = useGradientCheckBox.Enabled && useGradientCheckBox.Checked;
     203
     204      // remove rows and re-add them later to avoid firing visual property changd events
     205      var rows = scatterPlotView.Content.Rows.ToDictionary(r => r.Name, r => r);
     206      scatterPlotView.Content.Rows.Clear();
     207
     208      if (useGradientCheckBox.Checked) {
     209        var groupVariable = (string)comboBoxGroup.SelectedItem;
     210        if (groupVariable == NoGroupItem) return;
     211
     212        var groupValues = Content.PreprocessingData.GetValues<double>(Content.PreprocessingData.GetColumnIndex(groupVariable))
     213          .Distinct().OrderBy(x => x).ToList();
     214        double min = groupValues.FirstOrDefault(x => !double.IsNaN(x)), max = groupValues.LastOrDefault(x => !double.IsNaN(x));
     215        foreach (var group in groupValues) {
     216          ScatterPlotDataRow row;
     217          if (rows.TryGetValue(group.ToString("R"), out row)) {
     218            row.VisualProperties.Color = GetColor(group, min, max);
     219            row.VisualProperties.IsVisibleInLegend = false;
     220          }
     221        }
     222        gradientMinimumLabel.Text = min.ToString("G5");
     223        gradientMaximumLabel.Text = max.ToString("G5");
     224      } else {
     225        foreach (var row in rows.Values) {
     226          row.VisualProperties.Color = Color.Empty;
     227          row.VisualProperties.IsVisibleInLegend = true;
     228        }
     229      }
     230      scatterPlotView.Content.Rows.AddRange(rows.Values);
     231    }
     232
     233    private static Color GetColor(double value, double min, double max) {
     234      if (double.IsNaN(value)) {
     235        return Color.Black;
     236      }
     237      var colors = ColorGradient.Colors;
     238      int index = (int)((colors.Count - 1) * (value - min) / (max - min));
     239      if (index >= colors.Count) index = colors.Count - 1;
     240      if (index < 0) index = 0;
     241      return colors[index];
     242    }
     243
     244    private void orderComboBox_SelectedIndexChanged(object sender, EventArgs e) {
     245      UpdateScatterPlot();
    102246    }
    103247  }
    104248}
     249
Note: See TracChangeset for help on using the changeset viewer.