rails-data-explorer 0.2.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -3
  3. data/README.md +2 -0
  4. data/lib/rails-data-explorer-no-rails.rb +36 -32
  5. data/lib/rails-data-explorer.rb +38 -35
  6. data/lib/rails_data_explorer.rb +29 -10
  7. data/lib/{rails-data-explorer → rails_data_explorer}/action_view_extension.rb +39 -17
  8. data/lib/rails_data_explorer/active_record_extension.rb +19 -0
  9. data/lib/{rails-data-explorer → rails_data_explorer}/chart.rb +10 -0
  10. data/lib/rails_data_explorer/chart/anova.rb +1 -0
  11. data/lib/{rails-data-explorer → rails_data_explorer}/chart/box_plot.rb +12 -3
  12. data/lib/{rails-data-explorer → rails_data_explorer}/chart/box_plot_group.rb +49 -22
  13. data/lib/{rails-data-explorer → rails_data_explorer}/chart/contingency_table.rb +19 -8
  14. data/lib/{rails-data-explorer → rails_data_explorer}/chart/descriptive_statistics_table.rb +9 -0
  15. data/lib/rails_data_explorer/chart/descriptive_statistics_table_group.rb +1 -0
  16. data/lib/{rails-data-explorer → rails_data_explorer}/chart/histogram_categorical.rb +12 -8
  17. data/lib/{rails-data-explorer → rails_data_explorer}/chart/histogram_quantitative.rb +12 -2
  18. data/lib/{rails-data-explorer → rails_data_explorer}/chart/histogram_temporal.rb +11 -2
  19. data/lib/{rails-data-explorer → rails_data_explorer}/chart/multi_dimensional_charts.rb +2 -0
  20. data/lib/{rails-data-explorer → rails_data_explorer}/chart/parallel_coordinates.rb +11 -1
  21. data/lib/{rails-data-explorer → rails_data_explorer}/chart/parallel_set.rb +11 -2
  22. data/lib/{rails-data-explorer → rails_data_explorer}/chart/pie_chart.rb +12 -8
  23. data/lib/{rails-data-explorer → rails_data_explorer}/chart/scatterplot.rb +13 -1
  24. data/lib/{rails-data-explorer → rails_data_explorer}/chart/scatterplot_matrix.rb +2 -0
  25. data/lib/{rails-data-explorer/chart/stacked_bar_chart_categorical_percent.rb → rails_data_explorer/chart/stacked_bar_chart_categorical.rb} +37 -14
  26. data/lib/rails_data_explorer/chart/stacked_bar_chart_categorical_percent.rb +28 -0
  27. data/lib/rails_data_explorer/chart/stacked_histogram_temporal.rb +199 -0
  28. data/lib/rails_data_explorer/data_series.rb +241 -0
  29. data/lib/{rails-data-explorer → rails_data_explorer}/data_set.rb +13 -4
  30. data/lib/{rails-data-explorer → rails_data_explorer}/data_type.rb +13 -0
  31. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/categorical.rb +79 -18
  32. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/geo.rb +2 -0
  33. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/quantitative.rb +14 -4
  34. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/quantitative/decimal.rb +9 -0
  35. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/quantitative/integer.rb +9 -0
  36. data/lib/{rails-data-explorer → rails_data_explorer}/data_type/quantitative/temporal.rb +9 -0
  37. data/lib/{rails-data-explorer → rails_data_explorer}/engine.rb +12 -0
  38. data/lib/{rails-data-explorer → rails_data_explorer}/exploration.rb +11 -0
  39. data/lib/rails_data_explorer/statistics/pearsons_chi_squared_independence_test.rb +72 -0
  40. data/lib/{rails-data-explorer → rails_data_explorer}/statistics/rng_category.rb +13 -0
  41. data/lib/{rails-data-explorer → rails_data_explorer}/statistics/rng_gaussian.rb +12 -1
  42. data/lib/{rails-data-explorer → rails_data_explorer}/statistics/rng_power_law.rb +11 -0
  43. data/lib/{rails-data-explorer → rails_data_explorer}/utils/color_scale.rb +6 -0
  44. data/lib/{rails-data-explorer → rails_data_explorer}/utils/data_binner.rb +13 -8
  45. data/lib/{rails-data-explorer → rails_data_explorer}/utils/data_encoder.rb +2 -0
  46. data/lib/{rails-data-explorer → rails_data_explorer}/utils/data_quantizer.rb +8 -3
  47. data/lib/{rails-data-explorer → rails_data_explorer}/utils/rde_table.rb +14 -11
  48. data/lib/{rails-data-explorer → rails_data_explorer}/utils/value_formatter.rb +9 -4
  49. data/rails-data-explorer.gemspec +5 -6
  50. data/spec/rails_data_explorer/chart_spec.rb +11 -0
  51. data/spec/{rails-data-explorer → rails_data_explorer}/data_series_spec.rb +0 -0
  52. data/spec/rails_data_explorer/data_set_spec.rb +31 -0
  53. data/spec/rails_data_explorer/data_type/categorical_spec.rb +126 -0
  54. data/{lib/rails-data-explorer/chart/descriptive_statistics_table_group.rb → spec/rails_data_explorer/data_type/quantitative/decimal_spec.rb} +0 -0
  55. data/spec/rails_data_explorer/data_type/quantitative/integer_spec.rb +0 -0
  56. data/spec/rails_data_explorer/data_type/quantitative/temporal_spec.rb +34 -0
  57. data/spec/rails_data_explorer/data_type/quantitative_spec.rb +118 -0
  58. data/spec/rails_data_explorer/data_type_spec.rb +7 -0
  59. data/spec/{rails-data-explorer → rails_data_explorer}/exploration_spec.rb +5 -5
  60. data/spec/rails_data_explorer/statistics/pearsons_chi_squared_independence_test_spec.rb +0 -0
  61. data/spec/rails_data_explorer/utils/color_scale_spec.rb +13 -0
  62. data/spec/{rails-data-explorer → rails_data_explorer}/utils/data_binner_spec.rb +0 -0
  63. data/spec/{rails-data-explorer → rails_data_explorer}/utils/data_quantizer_spec.rb +0 -0
  64. data/spec/rails_data_explorer/utils/value_formatter_spec.rb +33 -0
  65. data/vendor/assets/stylesheets/sources/rde-default-style.css +5 -1
  66. metadata +91 -82
  67. data/lib/rails-data-explorer/active_record_extension.rb +0 -14
  68. data/lib/rails-data-explorer/constants.rb +0 -5
  69. data/lib/rails-data-explorer/data_series.rb +0 -156
  70. data/lib/rails-data-explorer/statistics/pearsons_chi_squared_independence_test.rb +0 -75
  71. data/spec/rails-data-explorer/data_type/categorical_spec.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5b417c02b65c9c3f0fed2ddb85c5f6e992671aea
4
- data.tar.gz: b0ff6ff26221174cf12ba739f5a6029ac636a0d1
3
+ metadata.gz: 411afabc4250e907fbdbe7e70805be898219eb5a
4
+ data.tar.gz: 6a95cd6abc7828634bfd88ac69ca9b2a805a4970
5
5
  SHA512:
6
- metadata.gz: 7badacd27cd2ed6059094d5aba6027918e342437c79ae938504b451c6572632c42d0abf1817c0ea7dc0e0c3083f037dd11acd455ab6e23784349908faf5a0c00
7
- data.tar.gz: 597a4a2857756a8226582d69b3a2154ea1708e2c19a396a2cc94f2947d63a8126a8517b7242923d9b328384730bde98b3172a10a472ef8bc35d1d52d08daae20
6
+ metadata.gz: 598df5a92a7f39dbb213283cfd93cbf0a7c72fdc3c12aaa03fd875d924b2160eacfcdbec079045c8a8eca67da6fa336939ed58e8f4d8b6e839ce48ba5ad866d9
7
+ data.tar.gz: 8f9ee3dd2de65400978ea82a3445c40974bac8e5a5e8a54137fe062a25eed16ecd6b10e92e5a2ffcdf57b7ad37f651451b12f6e4d23a5b93271630f9f7a1226e
@@ -1,6 +1,22 @@
1
- there seems a huge inefficiency in RailsDataExplorer#build_exploration_from_data_series_specs
2
- where we iterate over the entire data collection for every exploration.
3
-
1
+ TODO: add sampling for large ActiveRecord tables
2
+
3
+ # 1.0.0
4
+
5
+ * New chart type: StackedBarChartCategorical to go with its percentage cousing.
6
+ * Improved display of table of contents.
7
+ * Improved display of box plot groups: Auto scale charts to make best use of
8
+ screen space when there are extreme outliers.
9
+ * Automatically limit the number of distinct values in a categorical data series
10
+ to reduce number of items in categorical charts. Group less frequent observations
11
+ under '[Other]'.
12
+ * Made charts wider to use more screen space.
13
+ * Scroll contingency tables horizontally if they are too wide.
14
+ * Improved label sorter for categorical values. When working with a mix of
15
+ numeric and non-numeric labels, sort non-numeric ones at the end.
16
+ * Improved performance by caching a lot of computed data.
17
+ * Removed obsolete files.
18
+ * Improved documentation.
19
+ * Various bug fixes.
4
20
 
5
21
  ### 0.2.3
6
22
 
data/README.md CHANGED
@@ -27,7 +27,9 @@ named 'signups' in `app/controllers/users_controller.rb`:
27
27
 
28
28
  ~~~ ruby
29
29
  def signups
30
+ # DANGER! Make sure not to load too much data into memory!
30
31
  user_data = User.all.to_a
32
+
31
33
  c_binner = RailsDataExplorer::Utils::DataBinner.new(
32
34
  '0' => 0,
33
35
  '1' => 1,
@@ -7,37 +7,41 @@ require 'descriptive-statistics'
7
7
  require 'distribution'
8
8
  require 'interpolate'
9
9
 
10
- # require 'rails-data-explorer/engine'
10
+ # require 'rails_data_explorer/action_view_extension.rb'
11
11
 
12
- require 'rails_data_explorer'
13
- require 'rails-data-explorer/chart'
14
- require 'rails-data-explorer/constants'
15
- require 'rails-data-explorer/data_series'
16
- require 'rails-data-explorer/data_set'
17
- require 'rails-data-explorer/data_type'
18
- require 'rails-data-explorer/exploration'
19
- require 'rails-data-explorer/statistics/rng_category'
20
- require 'rails-data-explorer/statistics/rng_gaussian'
21
- require 'rails-data-explorer/statistics/rng_power_law'
22
- require 'rails-data-explorer/utils/color_scale'
23
- require 'rails-data-explorer/utils/data_binner'
24
- require 'rails-data-explorer/utils/data_quantizer'
25
- require 'rails-data-explorer/utils/value_formatter'
12
+ # require 'rails_data_explorer/engine.rb'
26
13
 
27
- require 'rails-data-explorer/chart/box_plot'
28
- require 'rails-data-explorer/chart/box_plot_group'
29
- require 'rails-data-explorer/chart/contingency_table'
30
- require 'rails-data-explorer/chart/descriptive_statistics_table'
31
- require 'rails-data-explorer/chart/histogram_categorical'
32
- require 'rails-data-explorer/chart/histogram_quantitative'
33
- require 'rails-data-explorer/chart/histogram_temporal'
34
- require 'rails-data-explorer/chart/parallel_coordinates'
35
- require 'rails-data-explorer/chart/parallel_set'
36
- require 'rails-data-explorer/chart/pie_chart'
37
- require 'rails-data-explorer/chart/scatterplot'
38
- require 'rails-data-explorer/chart/stacked_bar_chart_categorical_percent'
39
- require 'rails-data-explorer/data_type/categorical'
40
- require 'rails-data-explorer/data_type/quantitative'
41
- require 'rails-data-explorer/data_type/quantitative/decimal'
42
- require 'rails-data-explorer/data_type/quantitative/integer'
43
- require 'rails-data-explorer/data_type/quantitative/temporal'
14
+ require 'rails_data_explorer.rb'
15
+ require 'rails_data_explorer/chart.rb'
16
+ require 'rails_data_explorer/data_series.rb'
17
+ require 'rails_data_explorer/data_set.rb'
18
+ require 'rails_data_explorer/data_type.rb'
19
+ require 'rails_data_explorer/exploration.rb'
20
+ require 'rails_data_explorer/statistics/rng_category.rb'
21
+ require 'rails_data_explorer/statistics/rng_gaussian.rb'
22
+ require 'rails_data_explorer/statistics/rng_power_law.rb'
23
+ require 'rails_data_explorer/utils/color_scale.rb'
24
+ require 'rails_data_explorer/utils/data_binner.rb'
25
+ require 'rails_data_explorer/utils/data_quantizer.rb'
26
+ require 'rails_data_explorer/utils/rde_table.rb'
27
+ require 'rails_data_explorer/utils/value_formatter.rb'
28
+
29
+ require 'rails_data_explorer/chart/box_plot.rb'
30
+ require 'rails_data_explorer/chart/box_plot_group.rb'
31
+ require 'rails_data_explorer/chart/contingency_table.rb'
32
+ require 'rails_data_explorer/chart/descriptive_statistics_table.rb'
33
+ require 'rails_data_explorer/chart/histogram_categorical.rb'
34
+ require 'rails_data_explorer/chart/histogram_quantitative.rb'
35
+ require 'rails_data_explorer/chart/histogram_temporal.rb'
36
+ require 'rails_data_explorer/chart/parallel_coordinates.rb'
37
+ require 'rails_data_explorer/chart/parallel_set.rb'
38
+ require 'rails_data_explorer/chart/pie_chart.rb'
39
+ require 'rails_data_explorer/chart/scatterplot.rb'
40
+ require 'rails_data_explorer/chart/stacked_bar_chart_categorical.rb'
41
+ require 'rails_data_explorer/data_type/categorical.rb'
42
+ require 'rails_data_explorer/data_type/quantitative.rb'
43
+ require 'rails_data_explorer/data_type/quantitative/decimal.rb'
44
+ require 'rails_data_explorer/data_type/quantitative/integer.rb'
45
+ require 'rails_data_explorer/data_type/quantitative/temporal.rb'
46
+
47
+ require 'rails_data_explorer/chart/stacked_bar_chart_categorical_percent.rb'
@@ -1,3 +1,5 @@
1
+
2
+
1
3
  require 'action_view'
2
4
  require 'active_support/all' # TODO: once the dust settles, only require the modules we need
3
5
  require 'color'
@@ -5,41 +7,42 @@ require 'descriptive-statistics'
5
7
  require 'distribution'
6
8
  require 'interpolate'
7
9
 
8
- require 'rails-data-explorer/action_view_extension'
10
+ require 'rails_data_explorer/action_view_extension.rb'
11
+
12
+ require 'rails_data_explorer/engine.rb'
9
13
 
10
- require 'rails-data-explorer/engine'
14
+ require 'rails_data_explorer.rb'
15
+ require 'rails_data_explorer/chart.rb'
16
+ require 'rails_data_explorer/data_series.rb'
17
+ require 'rails_data_explorer/data_set.rb'
18
+ require 'rails_data_explorer/data_type.rb'
19
+ require 'rails_data_explorer/exploration.rb'
20
+ require 'rails_data_explorer/statistics/rng_category.rb'
21
+ require 'rails_data_explorer/statistics/rng_gaussian.rb'
22
+ require 'rails_data_explorer/statistics/rng_power_law.rb'
23
+ require 'rails_data_explorer/utils/color_scale.rb'
24
+ require 'rails_data_explorer/utils/data_binner.rb'
25
+ require 'rails_data_explorer/utils/data_quantizer.rb'
26
+ require 'rails_data_explorer/utils/rde_table.rb'
27
+ require 'rails_data_explorer/utils/value_formatter.rb'
11
28
 
12
- require 'rails_data_explorer'
13
- require 'rails-data-explorer/chart'
14
- require 'rails-data-explorer/constants'
15
- require 'rails-data-explorer/data_series'
16
- require 'rails-data-explorer/data_set'
17
- require 'rails-data-explorer/data_type'
18
- require 'rails-data-explorer/exploration'
19
- require 'rails-data-explorer/statistics/rng_category'
20
- require 'rails-data-explorer/statistics/rng_gaussian'
21
- require 'rails-data-explorer/statistics/rng_power_law'
22
- require 'rails-data-explorer/utils/color_scale'
23
- require 'rails-data-explorer/utils/data_binner'
24
- require 'rails-data-explorer/utils/data_quantizer'
25
- require 'rails-data-explorer/utils/rde_table'
26
- require 'rails-data-explorer/utils/value_formatter'
29
+ require 'rails_data_explorer/chart/box_plot.rb'
30
+ require 'rails_data_explorer/chart/box_plot_group.rb'
31
+ require 'rails_data_explorer/chart/contingency_table.rb'
32
+ require 'rails_data_explorer/chart/descriptive_statistics_table.rb'
33
+ require 'rails_data_explorer/chart/histogram_categorical.rb'
34
+ require 'rails_data_explorer/chart/histogram_quantitative.rb'
35
+ require 'rails_data_explorer/chart/histogram_temporal.rb'
36
+ require 'rails_data_explorer/chart/parallel_coordinates.rb'
37
+ require 'rails_data_explorer/chart/parallel_set.rb'
38
+ require 'rails_data_explorer/chart/pie_chart.rb'
39
+ require 'rails_data_explorer/chart/scatterplot.rb'
40
+ require 'rails_data_explorer/chart/stacked_bar_chart_categorical.rb'
41
+ # require 'rails_data_explorer/chart/stacked_histogram_temporal.rb'
42
+ require 'rails_data_explorer/data_type/categorical.rb'
43
+ require 'rails_data_explorer/data_type/quantitative.rb'
44
+ require 'rails_data_explorer/data_type/quantitative/decimal.rb'
45
+ require 'rails_data_explorer/data_type/quantitative/integer.rb'
46
+ require 'rails_data_explorer/data_type/quantitative/temporal.rb'
27
47
 
28
- require 'rails-data-explorer/chart/box_plot'
29
- require 'rails-data-explorer/chart/box_plot_group'
30
- require 'rails-data-explorer/chart/contingency_table'
31
- require 'rails-data-explorer/chart/descriptive_statistics_table'
32
- require 'rails-data-explorer/chart/histogram_categorical'
33
- require 'rails-data-explorer/chart/histogram_quantitative'
34
- require 'rails-data-explorer/chart/histogram_temporal'
35
- require 'rails-data-explorer/chart/parallel_coordinates'
36
- require 'rails-data-explorer/chart/parallel_set'
37
- require 'rails-data-explorer/chart/pie_chart'
38
- require 'rails-data-explorer/chart/scatterplot'
39
- require 'rails-data-explorer/chart/stacked_bar_chart_categorical_percent'
40
- # require 'rails-data-explorer/chart/stacked_histogram_temporal'
41
- require 'rails-data-explorer/data_type/categorical'
42
- require 'rails-data-explorer/data_type/quantitative'
43
- require 'rails-data-explorer/data_type/quantitative/decimal'
44
- require 'rails-data-explorer/data_type/quantitative/integer'
45
- require 'rails-data-explorer/data_type/quantitative/temporal'
48
+ require 'rails_data_explorer/chart/stacked_bar_chart_categorical_percent.rb'
@@ -1,7 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # Responsibilities:
4
+ # * Integrate all the pieces required for this gem
5
+ # * Initialize a collection of Explorations
6
+ #
7
+ # Collaborators:
8
+ # * Exploration
1
9
  class RailsDataExplorer
2
10
 
3
- attr_accessor :output_buffer # required for content_tag
4
- include ActionView::Helpers::TagHelper
11
+ GREATER_ZERO = 1.0 / 1_000_000 # The smallest value to use if we have to avoid zero (div by zero)
5
12
 
6
13
  attr_reader :explorations
7
14
  attr_reader :data_series_names
@@ -28,6 +35,16 @@ class RailsDataExplorer
28
35
  multivariate: {}
29
36
  }
30
37
  @data_series_names = data_series_specs.map { |e| e[:name] }
38
+
39
+ @cached_data_series = data_series_specs.inject({}) { |m, ds_spec|
40
+ m[ds_spec[:name]] = DataSeries.new(
41
+ ds_spec[:name],
42
+ data_collection.map(&ds_spec[:data_method]),
43
+ ds_spec
44
+ )
45
+ m
46
+ }
47
+
31
48
  # Default to all univariate explorations
32
49
  explorations_to_render = (
33
50
  explorations_to_render || @data_series_names.inject({ univariate: {}}) { |m,e|
@@ -60,7 +77,10 @@ class RailsDataExplorer
60
77
  charts[:univariate].uniq.compact.each { |data_series_spec|
61
78
  @explorations << Exploration.new(
62
79
  data_series_spec[:name],
63
- data_collection.map(&data_series_spec[:data_method]),
80
+ DataSet.new(
81
+ [@cached_data_series[data_series_spec[:name]]],
82
+ data_series_spec[:name]
83
+ ),
64
84
  render_exploration_for?(
65
85
  explorations_to_render,
66
86
  :univariate,
@@ -114,14 +134,13 @@ class RailsDataExplorer
114
134
  private
115
135
 
116
136
  def build_exploration_from_data_series_specs(data_collection, ds_specs, render_charts)
137
+ expl_title = ds_specs.map { |e| e[:name] }.sort.join(' vs. ')
117
138
  Exploration.new(
118
- ds_specs.map { |e| e[:name] }.sort.join(' vs. '),
119
- ds_specs.map { |ds_spec|
120
- {
121
- name: ds_spec[:name],
122
- values: data_collection.map(&ds_spec[:data_method])
123
- }
124
- },
139
+ expl_title,
140
+ DataSet.new(
141
+ ds_specs.map { |ds_spec| @cached_data_series[ds_spec[:name]] },
142
+ expl_title
143
+ ),
125
144
  render_charts
126
145
  )
127
146
  end
@@ -1,12 +1,19 @@
1
1
  # -*- coding: utf-8 -*-
2
- #
3
- # Adds view helpers to ActionView
4
- #
2
+
5
3
  class RailsDataExplorer
4
+
5
+ # Responsibilities:
6
+ # * Add rails-data-explorer view helpers to ActionView
7
+ # * Render rails-data-explorer generated content
8
+ #
9
+ # Collaborators:
10
+ # * RailsDataExplorer
11
+ # * Exploration
12
+ #
6
13
  module ActionViewExtension
7
14
 
8
15
  # Renders the entire RailsDataExplorer view
9
- # @param rails_data_explorer [RailsDataExplorer]
16
+ # @param rde [RailsDataExplorer]
10
17
  def rails_data_explorer(rde)
11
18
  content_tag(:div, class: 'rails-data-explorer') do
12
19
  [
@@ -16,7 +23,8 @@ class RailsDataExplorer
16
23
  end
17
24
  end
18
25
 
19
- # Returns a url that can be used to reset the Filterrific params
26
+ # Returns a url that can be used to reset the Filterrific params when
27
+ # rails-data-explorer is used in combination with Filterrific.
20
28
  def reset_filterrific_url(opts = {})
21
29
  url_for(
22
30
  { filterrific: { reset_filterrific: true } }.merge(opts)
@@ -37,11 +45,6 @@ class RailsDataExplorer
37
45
  end +
38
46
  content_tag(:div, class: 'panel-body') do
39
47
  content_tag(:table, class: 'table rde_toc-matrix') do
40
- # render header row for analysis types
41
- content_tag(:tr) do
42
- content_tag(:th, 'Univariate', colspan: '2') +
43
- content_tag(:th, 'Bivariate', colspan: ds_names.length)
44
- end +
45
48
  # render uni-/bi-variate analysis column headers (with reversed data_series names)
46
49
  content_tag(:tr) do
47
50
  content_tag(
@@ -57,7 +60,8 @@ class RailsDataExplorer
57
60
  },
58
61
  anchor: 'rails_data_explorer-toc',
59
62
  ),
60
- class: 'btn btn-default btn-xs'
63
+ class: 'btn btn-default btn-xs',
64
+ title: 'Load univariate explorations for all data series.'
61
65
  ),
62
66
  colspan: 2
63
67
  ) +
@@ -74,7 +78,7 @@ class RailsDataExplorer
74
78
  )
75
79
  }
76
80
  encountered_bv_with_self = false
77
- # cell with name
81
+ # row header with data_series name
78
82
  content_tag(
79
83
  :th,
80
84
  ds_name.truncate(12),
@@ -83,6 +87,7 @@ class RailsDataExplorer
83
87
  ) +
84
88
  # cell with link to univariate analysis
85
89
  if uv_expl
90
+ tooltip_suffix = "univariate exploration for #{ ds_name.inspect }."
86
91
  if uv_expl.render_charts?
87
92
  # Link to anchor on current page (chart is currently rendered)
88
93
  content_tag(
@@ -93,6 +98,7 @@ class RailsDataExplorer
93
98
  class: 'btn btn-default btn-xs'
94
99
  ),
95
100
  class: 'rde_toc-currently_rendered',
101
+ title: 'Jump to ' + tooltip_suffix,
96
102
  )
97
103
  else
98
104
  # Load new page
@@ -106,12 +112,18 @@ class RailsDataExplorer
106
112
  ),
107
113
  class: 'btn btn-default btn-xs'
108
114
  ),
109
- class: 'rde_toc-available_not_rendered'
115
+ class: 'rde_toc-available_not_rendered',
116
+ title: 'Load ' + tooltip_suffix,
110
117
  )
111
118
  end
112
119
  else
113
120
  # show that no exploration exists
114
- content_tag(:td, 'N/A', class: 'rde_toc-not_available')
121
+ content_tag(
122
+ :td,
123
+ 'N/A',
124
+ class: 'rde_toc-not_available',
125
+ title: 'There is no ' + tooltip_suffix,
126
+ )
115
127
  end +
116
128
  # iterate over reversed data_series names
117
129
  reversed_ds_names.map { |r_ds_name|
@@ -120,6 +132,8 @@ class RailsDataExplorer
120
132
  [ds_name, r_ds_name]
121
133
  )
122
134
  }
135
+ bv_ds_names = [ds_name.inspect, r_ds_name.inspect].sort.join(' vs. ')
136
+ tooltip_suffix = "bivariate exploration for #{ bv_ds_names }."
123
137
  if encountered_bv_with_self
124
138
  # blank cell
125
139
  '<td class="rde_toc-oso_diagonal"></td>'.html_safe
@@ -144,7 +158,8 @@ class RailsDataExplorer
144
158
  ),
145
159
  class: 'btn btn-default btn-xs'
146
160
  ),
147
- class: 'rde_toc-available_not_rendered'
161
+ class: 'rde_toc-available_not_rendered',
162
+ title: "Load all bivariate explorations for #{ ds_name.inspect }.",
148
163
  )
149
164
  elsif bv_expl
150
165
  # bivariate analysis exists
@@ -158,6 +173,7 @@ class RailsDataExplorer
158
173
  class: 'btn btn-default btn-xs'
159
174
  ),
160
175
  class: 'rde_toc-currently_rendered',
176
+ title: 'Jump to ' + tooltip_suffix,
161
177
  )
162
178
  else
163
179
  # Link to anchor on new page (chart is currently not rendered)
@@ -171,12 +187,18 @@ class RailsDataExplorer
171
187
  ),
172
188
  class: 'btn btn-default btn-xs'
173
189
  ),
174
- class: 'rde_toc-available_not_rendered'
190
+ class: 'rde_toc-available_not_rendered',
191
+ title: 'Load ' + tooltip_suffix,
175
192
  )
176
193
  end
177
194
  else
178
195
  # show that no exploration exists
179
- content_tag(:td, 'N/A', class: 'rde_toc-not_available')
196
+ content_tag(
197
+ :td,
198
+ 'N/A',
199
+ class: 'rde_toc-not_available',
200
+ title: 'There is no ' + tooltip_suffix,
201
+ )
180
202
  end
181
203
  }.join.html_safe
182
204
  end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class RailsDataExplorer
4
+
5
+ # Responsibilities:
6
+ # * Add rails-data-explorer methods to ActiveRecord::Base and sub classes
7
+ #
8
+ # Collaborators:
9
+ #
10
+ module ActiveRecordExtension
11
+
12
+ module ClassMethods
13
+
14
+ protected
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -1,4 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+
1
3
  class RailsDataExplorer
4
+
5
+ # Responsibilities:
6
+ # * Visualize data
7
+ # * Integrate with front end visualization libraries
8
+ #
9
+ # Collaborators:
10
+ # * RdeTable
11
+ #
2
12
  class Chart
3
13
 
4
14
  include ActionView::Helpers::NumberHelper