Changeset 15131 for stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionTargetResponseGradientView.cs
- Timestamp:
- 07/06/17 10:19:37 (7 years ago)
- Location:
- stable
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Views
- Property svn:mergeinfo changed
/branches/symbreg-factors-2650/HeuristicLab.Problems.DataAnalysis.Views (added) merged: 14240-14241,14248,14251,14277,14330,14351,14421,14449,14497-14499,14542,14591-14592,14762,14825
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionTargetResponseGradientView.cs
r14964 r15131 21 21 22 22 using System; 23 using System.Collections; 23 24 using System.Collections.Generic; 24 25 using System.Drawing; … … 35 36 [Content(typeof(IRegressionSolution))] 36 37 public partial class RegressionSolutionTargetResponseGradientView : DataAnalysisSolutionEvaluationView { 37 private readonly Dictionary<string, GradientChart> gradientCharts;38 private readonly Dictionary<string, IGradientChart> gradientCharts; 38 39 private readonly Dictionary<string, DensityChart> densityCharts; 39 40 private readonly Dictionary<string, Panel> groupingPanels; … … 49 50 } 50 51 } 51 private IEnumerable< GradientChart> VisibleGradientCharts {52 private IEnumerable<IGradientChart> VisibleGradientCharts { 52 53 get { return VisibleVariables.Select(v => gradientCharts[v]); } 53 54 } … … 61 62 public RegressionSolutionTargetResponseGradientView() { 62 63 InitializeComponent(); 63 gradientCharts = new Dictionary<string, GradientChart>();64 gradientCharts = new Dictionary<string, IGradientChart>(); 64 65 densityCharts = new Dictionary<string, DensityChart>(); 65 66 groupingPanels = new Dictionary<string, Panel>(); … … 120 121 121 122 122 var variableValues = allowedInputVariables.Select(x => new List<double> { problemData.Dataset.GetDoubleValues(x, problemData.TrainingIndices).Median() }); 123 var doubleVariables = allowedInputVariables.Where(problemData.Dataset.VariableHasType<double>); 124 var doubleVariableValues = (IEnumerable<IList>)doubleVariables.Select(x => new List<double> { problemData.Dataset.GetDoubleValues(x, problemData.TrainingIndices).Median() }); 125 126 var factorVariables = allowedInputVariables.Where(problemData.Dataset.VariableHasType<string>); 127 var factorVariableValues = (IEnumerable<IList>)factorVariables.Select(x => new List<string> { 128 problemData.Dataset.GetStringValues(x, problemData.TrainingIndices) 129 .GroupBy(val => val).OrderByDescending(g => g.Count()).First().Key // most frequent value 130 }); 131 123 132 if (sharedFixedVariables != null) 124 133 sharedFixedVariables.ItemChanged -= SharedFixedVariables_ItemChanged; 125 sharedFixedVariables = new ModifiableDataset(allowedInputVariables, variableValues); 126 // ItemChanged eventhandler is registered later, after creating the gradient charts 134 135 sharedFixedVariables = new ModifiableDataset(doubleVariables.Concat(factorVariables), doubleVariableValues.Concat(factorVariableValues)); 136 127 137 128 138 // create controls … … 130 140 densityCharts.Clear(); 131 141 groupingPanels.Clear(); 132 foreach (var variableName in allowedInputVariables) {142 foreach (var variableName in doubleVariables) { 133 143 var gradientChart = CreateGradientChart(variableName, sharedFixedVariables); 134 144 gradientCharts.Add(variableName, gradientChart); … … 158 168 // Initially, the inner plot areas are not initialized for hidden charts (scollpanel, ...) 159 169 // This event handler listens for the paint event once (where everything is already initialized) to do some manual layouting. 160 gradientChart.ChartPostPaint += OnGradientChart OnChartPostPaint;170 gradientChart.ChartPostPaint += OnGradientChartPostPaint; 161 171 162 172 var panel = new Panel() { … … 170 180 groupingPanels.Add(variableName, panel); 171 181 } 172 182 foreach (var variableName in factorVariables) { 183 var gradientChart = CreateFactorGradientChart(variableName, sharedFixedVariables); 184 gradientCharts.Add(variableName, gradientChart); 185 186 var densityChart = new DensityChart() { 187 Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right, 188 Margin = Padding.Empty, 189 Height = 12, 190 Visible = false, 191 Top = (int)(gradientChart.Height * 0.1), 192 }; 193 densityCharts.Add(variableName, densityChart); 194 gradientChart.ZoomChanged += (o, e) => { 195 var gradient = (FactorGradientChart)o; 196 var density = densityCharts[gradient.FreeVariable]; 197 density.Visible = densityComboBox.SelectedIndex != 0 && !gradient.IsZoomed; 198 if (density.Visible) 199 UpdateDensityChart(density, gradient.FreeVariable); 200 }; 201 gradientChart.SizeChanged += (o, e) => { 202 var gradient = (FactorGradientChart)o; 203 var density = densityCharts[gradient.FreeVariable]; 204 density.Top = (int)(gradient.Height * 0.1); 205 }; 206 207 // Initially, the inner plot areas are not initialized for hidden charts (scollpanel, ...) 208 // This event handler listens for the paint event once (where everything is already initialized) to do some manual layouting. 209 gradientChart.ChartPostPaint += OnFactorGradientChartPostPaint; 210 211 var panel = new Panel() { 212 Dock = DockStyle.Fill, 213 Margin = Padding.Empty, 214 BackColor = Color.White 215 }; 216 217 panel.Controls.Add(densityChart); 218 panel.Controls.Add(gradientChart); 219 groupingPanels.Add(variableName, panel); 220 } 173 221 // update variable list 174 222 variableListView.ItemChecked -= variableListView_ItemChecked; … … 196 244 } 197 245 198 private void OnGradientChartOnChartPostPaint(object o, EventArgs e) { 246 247 private void OnGradientChartPostPaint(object o, EventArgs e) { 199 248 var gradient = (GradientChart)o; 200 249 var density = densityCharts[gradient.FreeVariable]; … … 209 258 // removed after succesful layouting due to performance reasons 210 259 if (gcPlotPosition.Width != 0) 211 gradient.ChartPostPaint -= OnGradientChartOnChartPostPaint; 260 gradient.ChartPostPaint -= OnGradientChartPostPaint; 261 } 262 263 private void OnFactorGradientChartPostPaint(object o, EventArgs e) { 264 var gradient = (FactorGradientChart)o; 265 var density = densityCharts[gradient.FreeVariable]; 266 267 density.Width = gradient.Width; 268 269 var gcPlotPosition = gradient.InnerPlotPosition; 270 density.Left = (int)(gcPlotPosition.X / 100.0 * gradient.Width); 271 density.Width = (int)(gcPlotPosition.Width / 100.0 * gradient.Width); 272 gradient.UpdateTitlePosition(); 273 274 // removed after succesful layouting due to performance reasons 275 if (gcPlotPosition.Width != 0) 276 gradient.ChartPostPaint -= OnFactorGradientChartPostPaint; 212 277 } 213 278 … … 215 280 foreach (var variable in VisibleVariables) { 216 281 var gradientChart = gradientCharts[variable]; 217 await gradientChart.RecalculateAsync( );282 await gradientChart.RecalculateAsync(false, false); 218 283 } 219 284 gradientChartTableLayout.SuspendLayout(); … … 224 289 gradientChartTableLayout.Refresh(); 225 290 foreach (var variable in VisibleVariables) { 226 var densityChart = densityCharts[variable]; 227 UpdateDensityChart(densityChart, variable); 291 DensityChart densityChart; 292 if (densityCharts.TryGetValue(variable, out densityChart)) { 293 UpdateDensityChart(densityChart, variable); 294 } 228 295 } 229 296 } … … 238 305 }; 239 306 gradientChart.VariableValueChanged += async (o, e) => { 240 var recalculations = VisibleGradientCharts.Except(new[] { (GradientChart)o }).Select(async chart => { 241 await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false); 242 }).ToList(); 307 var recalculations = VisibleGradientCharts 308 .Except(new[] { (IGradientChart)o }) 309 .Select(async chart => { 310 await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false); 311 }).ToList(); 243 312 await Task.WhenAll(recalculations); 244 313 … … 251 320 return gradientChart; 252 321 } 253 322 private FactorGradientChart CreateFactorGradientChart(string variableName, ModifiableDataset sharedFixedVariables) { 323 var gradientChart = new FactorGradientChart { 324 Dock = DockStyle.Fill, 325 Margin = Padding.Empty, 326 ShowLegend = false, 327 ShowCursor = true, 328 YAxisTicks = 5, 329 }; 330 gradientChart.VariableValueChanged += async (o, e) => { 331 var recalculations = VisibleGradientCharts 332 .Except(new[] { (FactorGradientChart)o }) 333 .Select(async chart => { 334 await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false); 335 }).ToList(); 336 await Task.WhenAll(recalculations); 337 338 if (recalculations.All(t => t.IsCompleted)) 339 SetupYAxis(); 340 }; 341 var variableValues = Content.ProblemData.Dataset.GetStringValues(variableName).Distinct().OrderBy(n => n).ToList(); 342 gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableName, variableValues); 343 gradientChart.SolutionAdded += gradientChart_SolutionAdded; 344 gradientChart.SolutionRemoved += gradientChart_SolutionRemoved; 345 return gradientChart; 346 } 254 347 private void SetupYAxis() { 255 348 double axisMin, axisMax; … … 345 438 if (item.Checked) { 346 439 tl.Controls.Add(chartsPanel); 347 await gradientChart.RecalculateAsync( );440 await gradientChart.RecalculateAsync(false, false); 348 441 } else { 349 442 tl.Controls.Remove(chartsPanel); … … 409 502 indices = GetDensityIndices(densityComboBox.SelectedIndex).ToList(); 410 503 } 411 var data = Content.ProblemData.Dataset.GetDoubleValues(variable, indices).ToList(); 412 var gradientChart = gradientCharts[variable]; 413 var min = gradientChart.FixedXAxisMin; 414 var max = gradientChart.FixedXAxisMax; 415 var buckets = gradientChart.DrawingSteps; 416 if (min.HasValue && max.HasValue) { 417 densityChart.UpdateChart(data, min.Value, max.Value, buckets); 418 densityChart.Width = gradientChart.Width; 419 420 var gcPlotPosition = gradientChart.InnerPlotPosition; 421 densityChart.Left = (int)(gcPlotPosition.X / 100.0 * gradientChart.Width); 422 densityChart.Width = (int)(gcPlotPosition.Width / 100.0 * gradientChart.Width); 423 424 densityChart.Visible = true; 425 } 426 427 gradientChart.UpdateTitlePosition(); 504 if (Content.ProblemData.Dataset.VariableHasType<double>(variable)) { 505 var data = Content.ProblemData.Dataset.GetDoubleValues(variable, indices).ToList(); 506 var gradientChart = gradientCharts[variable] as GradientChart; 507 if (gradientChart != null) { 508 var min = gradientChart.FixedXAxisMin; 509 var max = gradientChart.FixedXAxisMax; 510 var buckets = gradientChart.DrawingSteps; 511 if (min.HasValue && max.HasValue) { 512 densityChart.UpdateChart(data, min.Value, max.Value, buckets); 513 densityChart.Width = gradientChart.Width; 514 515 var gcPlotPosition = gradientChart.InnerPlotPosition; 516 densityChart.Left = (int)(gcPlotPosition.X / 100.0 * gradientChart.Width); 517 densityChart.Width = (int)(gcPlotPosition.Width / 100.0 * gradientChart.Width); 518 519 densityChart.Visible = true; 520 } 521 gradientChart.UpdateTitlePosition(); 522 } 523 } else if (Content.ProblemData.Dataset.VariableHasType<string>(variable)) { 524 var data = Content.ProblemData.Dataset.GetStringValues(variable).ToList(); 525 var gradientChart = gradientCharts[variable] as FactorGradientChart; 526 if (gradientChart != null) { 527 densityChart.UpdateChart(data); 528 densityChart.Width = gradientChart.Width; 529 530 var gcPlotPosition = gradientChart.InnerPlotPosition; 531 densityChart.Left = (int)(gcPlotPosition.X / 100.0 * gradientChart.Width); 532 densityChart.Width = (int)(gcPlotPosition.Width / 100.0 * gradientChart.Width); 533 534 densityChart.Visible = true; 535 536 gradientChart.UpdateTitlePosition(); 537 } 538 } 428 539 } 429 540 … … 448 559 var densityChart = densityCharts[variable]; 449 560 // recalculate and refresh 450 await gradientChart.RecalculateAsync( );561 await gradientChart.RecalculateAsync(false, false); 451 562 gradientChart.Refresh(); 452 563 UpdateDensityChart(densityChart, variable);
Note: See TracChangeset
for help on using the changeset viewer.