Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/18/16 16:28:59 (8 years ago)
Author:
pfleck
Message:

#2597

  • Extracted DensityChart from DensityTrackbar.
  • Added DensityChart to RegressionSolutionTargetResponseView with different options (none/training/test/all).
  • Moved RegressionSolutionGradientView and RegressionSolutionTargetResponseView to subfolder.
File:
1 moved

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionTargetResponseGradientView.cs

    r13846 r13850  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Drawing;
    2425using System.Linq;
    2526using System.Threading.Tasks;
     
    3334  [Content(typeof(IRegressionSolution))]
    3435  public partial class RegressionSolutionTargetResponseGradientView : DataAnalysisSolutionEvaluationView {
    35     private readonly Dictionary<string, GradientChart> charts;
     36    private readonly Dictionary<string, GradientChart> gradientCharts;
     37    private readonly Dictionary<string, DensityChart> densityCharts;
     38    private readonly Dictionary<string, Panel> groupingPanels;
     39
    3640    private const int Points = 200;
    37 
    38     private IEnumerable<GradientChart> VisibleCharts {
    39       get { return gradientChartTableLayout.Controls.OfType<GradientChart>(); }
     41    private const int MaxColumns = 4;
     42
     43    private IEnumerable<string> VisibleVariables {
     44      get {
     45        foreach (ListViewItem item in variableListView.CheckedItems)
     46          yield return item.Text;
     47      }
     48    }
     49    private IEnumerable<GradientChart> VisibleGradientCharts {
     50      get { return VisibleVariables.Select(v => gradientCharts[v]); }
     51    }
     52    private IEnumerable<DensityChart> VisibleDensityCharts {
     53      get { return VisibleVariables.Select(v => densityCharts[v]); }
     54    }
     55    private IEnumerable<Panel> VisibleChartsPanels {
     56      get { return VisibleVariables.Select(v => groupingPanels[v]); }
    4057    }
    4158
    4259    public RegressionSolutionTargetResponseGradientView() {
    4360      InitializeComponent();
    44       charts = new Dictionary<string, GradientChart>();
     61      gradientCharts = new Dictionary<string, GradientChart>();
     62      densityCharts = new Dictionary<string, DensityChart>();
     63      groupingPanels = new Dictionary<string, Panel>();
    4564
    4665      limitView.Content = new DoubleLimit(0, 1);
     66      densityComboBox.SelectedIndex = 0; // select None
     67
     68      // Avoid additional horizontal scrollbar
     69      var vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
     70      scrollPanel.Padding = new Padding(0, 0, vertScrollWidth, 0);
     71      scrollPanel.AutoScroll = true;
    4772    }
    4873
     
    91116      var variableValues = allowedInputVariables.Select(x => new List<double> { problemData.Dataset.GetDoubleValues(x, problemData.TrainingIndices).Median() });
    92117      var sharedFixedVariables = new ModifiableDataset(allowedInputVariables, variableValues);
    93       // create charts
    94       charts.Clear();
     118
     119      // create controls
     120      gradientCharts.Clear();
     121      densityCharts.Clear();
     122      groupingPanels.Clear();
    95123      foreach (var variableName in allowedInputVariables) {
    96         var gradientChart = new GradientChart {
     124        var gradientChart = CreateGradientChart(variableName, sharedFixedVariables);
     125        gradientCharts.Add(variableName, gradientChart);
     126
     127        var densityChart = new DensityChart() {
     128          //Dock = DockStyle.Top,
     129          //Location = new Point(0, 0),
     130          Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right,
     131          Margin = Padding.Empty,
     132          Height = 12,
     133          Visible = false
     134        };
     135        densityCharts.Add(variableName, densityChart);
     136
     137        var panel = new Panel() {
    97138          Dock = DockStyle.Fill,
    98139          Margin = Padding.Empty,
    99           ShowLegend = false,
    100           ShowCursor = true,
    101           ShowXAxisLabel = true,
    102           ShowYAxisLabel = true,
    103           YAxisTicks = 5,
     140          BackColor = Color.White
    104141        };
    105         gradientChart.VariableValueChanged += async (o, e) => {
    106           var recalculations = VisibleCharts.Except(new[] { (GradientChart)o }).Select(async chart => {
    107             await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false);
    108           }).ToList();
    109           await Task.WhenAll(recalculations);
    110 
    111           if (recalculations.All(t => t.IsCompleted))
    112             SetupYAxis();
    113         };
    114         gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableName, Points);
    115         charts[variableName] = gradientChart;
    116       }
     142
     143        panel.Controls.Add(densityChart);
     144        panel.Controls.Add(gradientChart);
     145        groupingPanels.Add(variableName, panel);
     146      }
     147
    117148      // update variable list
    118149      variableListView.Items.Clear();
     
    123154        variableListView.Items[variable].Checked = true;
    124155    }
     156    private GradientChart CreateGradientChart(string variableName, ModifiableDataset sharedFixedVariables) {
     157      var gradientChart = new GradientChart {
     158        Dock = DockStyle.Fill,
     159        Margin = Padding.Empty,
     160        ShowLegend = false,
     161        ShowCursor = true,
     162        ShowXAxisLabel = true,
     163        ShowYAxisLabel = true,
     164        YAxisTicks = 5,
     165      };
     166      gradientChart.VariableValueChanged += async (o, e) => {
     167        var recalculations = VisibleGradientCharts.Except(new[] { (GradientChart)o }).Select(async chart => {
     168          await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false);
     169        }).ToList();
     170        await Task.WhenAll(recalculations);
     171
     172        if (recalculations.All(t => t.IsCompleted))
     173          SetupYAxis();
     174      };
     175      gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableName, Points);
     176
     177      return gradientChart;
     178    }
    125179
    126180    private void SetupYAxis() {
     
    128182      if (automaticYAxisCheckBox.Checked) {
    129183        double min = double.MaxValue, max = double.MinValue;
    130         foreach (var chart in VisibleCharts) {
     184        foreach (var chart in VisibleGradientCharts) {
    131185          if (chart.YMin < min) min = chart.YMin;
    132186          if (chart.YMax > max) max = chart.YMax;
     
    140194      }
    141195
    142       foreach (var chart in VisibleCharts) {
     196      foreach (var chart in VisibleGradientCharts) {
    143197        chart.FixedYAxisMin = axisMin;
    144198        chart.FixedYAxisMax = axisMax;
    145         chart.Update();
    146       }
    147     }
    148 
    149     // sort chart controls so that they always appear in the same order as in the list view
    150     // the gradient chart layout should be suspended before calling this method
    151     private void SortControls() {
     199        //chart.Update();
     200      }
     201    }
     202
     203    // reorder chart controls so that they always appear in the same order as in the list view
     204    // the table layout containing the controls should be suspended before calling this method
     205    private void ReOrderControls() {
    152206      var tl = gradientChartTableLayout;
    153       var indices = variableListView.CheckedItems.Cast<ListViewItem>().ToDictionary(checkedItem => checkedItem.Text, checkedItem => checkedItem.Index);
    154       var count = tl.Controls.Count;
    155       var charts = new GradientChart[count];
    156       for (int i = 0; i < count; ++i) charts[i] = (GradientChart)tl.Controls[i];
    157       Array.Sort(charts, (a, b) => indices[a.FreeVariable].CompareTo(indices[b.FreeVariable]));
    158207      tl.Controls.Clear();
    159       tl.Controls.AddRange(charts);
     208      int row = 0, column = 0;
     209      foreach (var chartsPanel in VisibleChartsPanels) {
     210        tl.Controls.Add(chartsPanel, column, row);
     211        column++;
     212        if (column == MaxColumns) {
     213          row++;
     214          column = 0;
     215        }
     216      }
    160217    }
    161218
    162219    private async void variableListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
    163       if (charts == null) return;
    164220      var item = e.Item;
    165221      var variable = item.Text;
    166       var chart = charts[variable];
     222      var gradientChart = gradientCharts[variable];
     223      var densityChart = densityCharts[variable];
     224      var chartsPanel = groupingPanels[variable];
    167225      var tl = gradientChartTableLayout;
     226
    168227      tl.SuspendLayout();
    169       var columnWidth = tl.GetColumnWidths()[0]; // all columns have the same width
    170       var rowHeight = 0.8f * columnWidth;
    171       tl.RowStyles.Clear();
     228
    172229      if (item.Checked) {
    173         tl.Controls.Add(chart);
    174         await chart.RecalculateAsync();
     230        tl.Controls.Add(chartsPanel);
     231        await gradientChart.RecalculateAsync();
     232        UpdateDensityChart(densityChart, variable);
    175233      } else {
    176         tl.Controls.Remove(chart);
    177       }
    178       SetupYAxis();
    179 
    180       var count = tl.Controls.Count;
    181       SortControls();
    182       tl.RowCount = count / tl.ColumnCount + (count % tl.ColumnCount == 0 ? 0 : 1);
    183       for (int i = 0; i < count; ++i) {
    184         var control = tl.Controls[i];
    185         int rowIndex = i / tl.ColumnCount;
    186         int columnIndex = i % tl.ColumnCount;
    187         tl.SetRow(control, rowIndex);
    188         tl.SetColumn(control, columnIndex);
    189       }
    190       for (int i = 0; i < tl.RowCount; ++i) {
    191         tl.RowStyles.Add(new RowStyle(SizeType.Absolute, rowHeight));
    192       }
     234        tl.Controls.Remove(chartsPanel);
     235      }
     236
     237      if (tl.Controls.Count > 0) {
     238        SetupYAxis();
     239
     240        ReOrderControls();
     241
     242        // set column styles
     243        int numVariables = VisibleVariables.Count();
     244        tl.ColumnCount = Math.Min(numVariables, MaxColumns);
     245        tl.ColumnStyles.Clear();
     246        for (int c = 0; c < tl.ColumnCount; c++)
     247          tl.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100.0f / tl.ColumnCount));
     248
     249        // set column styles
     250        tl.RowCount = (int)Math.Ceiling((double)numVariables / tl.ColumnCount);
     251        var columnWidth = tl.Width / tl.ColumnCount; // assume all columns have the same width
     252        var rowHeight = (int)(0.8 * columnWidth);
     253        tl.RowStyles.Clear();
     254        for (int r = 0; r < tl.RowCount; r++)
     255          tl.RowStyles.Add(new RowStyle(SizeType.Absolute, rowHeight));
     256      }
     257
    193258      tl.ResumeLayout();
    194259    }
     
    204269      SetupYAxis();
    205270    }
     271
     272    private void densityComboBox_SelectedIndexChanged(object sender, EventArgs e) {
     273      int si = densityComboBox.SelectedIndex;
     274      if (si == 0) {
     275        foreach (var densityChart in densityCharts.Values)
     276          densityChart.Visible = false;
     277      } else {
     278        var indices = GetDensityIndices(si).ToList();
     279
     280        foreach (var entry in densityCharts) {
     281          var variableName = entry.Key;
     282          var densityChart = entry.Value;
     283          if (!VisibleVariables.Contains(variableName))
     284            continue;
     285          UpdateDensityChart(densityChart, variableName, indices);
     286
     287        }
     288      }
     289    }
     290    private IEnumerable<int> GetDensityIndices(int selectedIndex) {
     291      var problemData = Content.ProblemData;
     292      return
     293        selectedIndex == 1 ? problemData.TrainingIndices :
     294        selectedIndex == 2 ? problemData.TestIndices :
     295        problemData.AllIndices;
     296    }
     297    private void UpdateDensityChart(DensityChart densityChart, string variable, IList<int> indices = null) {
     298      if (densityComboBox.SelectedIndex == 0)
     299        return;
     300      if (indices == null) {
     301        indices = GetDensityIndices(densityComboBox.SelectedIndex).ToList();
     302      }
     303      var data = Content.ProblemData.Dataset.GetDoubleValues(variable, indices).ToList();
     304      var gradientChart = gradientCharts[variable];
     305      var min = gradientChart.FixedXAxisMin;
     306      var max = gradientChart.FixedXAxisMax;
     307      var buckets = gradientChart.DrawingSteps;
     308      if (min.HasValue && max.HasValue) {
     309        densityChart.UpdateChart(data, min.Value, max.Value, buckets);
     310        densityChart.Width = gradientChart.Width;
     311
     312        var gcPlotPosition = gradientChart.InnerPlotPosition;
     313        densityChart.Left = (int)(gcPlotPosition.X / 100.0 * gradientChart.Width);
     314        densityChart.Width = (int)(gcPlotPosition.Width / 100.0 * gradientChart.Width);
     315
     316        densityChart.Visible = true;
     317      }
     318    }
    206319  }
    207320}
     321
Note: See TracChangeset for help on using the changeset viewer.