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
@@ -1,12 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+
1
3
  class RailsDataExplorer
2
4
  module Statistics
5
+
6
+ # Responsibilities:
7
+ # * Provide random numeric data, following a power distribution.
8
+ #
3
9
  class RngPowerLaw
4
10
 
11
+ # @param min [Numeric]
12
+ # @param max [Numeric]
13
+ # @param pow [Numeric]
14
+ # @param rng [Proc, optional] a random number generator
5
15
  def initialize(min = 1, max = 1000, pow = 2, rng = lambda { Kernel.rand })
6
16
  @min, @max, @pow, @rng = min, max, pow, rng
7
17
  @max += 1
8
18
  end
9
19
 
20
+ # Returns random data following a power distribution.
10
21
  def rand
11
22
  y = (
12
23
  (
@@ -1,5 +1,11 @@
1
+ # -*- coding: utf-8 -*-
2
+
1
3
  class RailsDataExplorer
2
4
  module Utils
5
+
6
+ # Responsibilities:
7
+ # * Map an input value between -1 and 1 to a color on a color scale.
8
+ #
3
9
  class ColorScale
4
10
 
5
11
  def initialize
@@ -1,13 +1,18 @@
1
- # Convert quantitative data to categorical data.
2
- # http://saedsayad.com/binning.htm
3
- # E.g., ages in years to 5 groups:
4
- # * < 10
5
- # * 11 - 20
6
- # * 21 - 30
7
- # * 31 - 40
8
- # * > 40
1
+ # -*- coding: utf-8 -*-
2
+
9
3
  class RailsDataExplorer
10
4
  module Utils
5
+
6
+ # Responsibilities:
7
+ # * Convert quantitative data to categorical data.
8
+ #
9
+ # http://saedsayad.com/binning.htm
10
+ # E.g., ages in years to 5 groups:
11
+ # * < 10
12
+ # * 11 - 20
13
+ # * 21 - 30
14
+ # * 31 - 40
15
+ # * > 40
11
16
  class DataBinner
12
17
 
13
18
  # @param[Hash] threshold_specs a hash with a key value pair for each threshold
@@ -1,2 +1,4 @@
1
+ # -*- coding: utf-8 -*-
2
+
1
3
  # Convert categorical data to quantitative data.
2
4
  # http://saedsayad.com/encoding.htm
@@ -1,7 +1,12 @@
1
- # Map a large set of quantitative/temporal/geo input values to a (countable)
2
- # smaller set – such as rounding values to some unit of precision.
1
+ # -*- coding: utf-8 -*-
2
+
3
3
  class RailsDataExplorer
4
4
  module Utils
5
+
6
+ # Responsibilities:
7
+ # * Map a large set of quantitative/temporal/geo input values to a (countable)
8
+ # smaller set – such as rounding values to some unit of precision.
9
+ #
5
10
  class DataQuantizer
6
11
 
7
12
  attr_accessor :number_of_bins, :delta
@@ -10,7 +15,7 @@ class RailsDataExplorer
10
15
  @options = {
11
16
  nice: true,
12
17
  type: 'midtread', # 'midtread' or 'midrise'
13
- number_of_bins: 100, # assuming 800px wide chart, 8px per bin
18
+ number_of_bins: 100, # assuming 1000px wide chart, 10px per bin
14
19
  delta: nil,
15
20
  }.merge(options)
16
21
  @data_series = data_series
@@ -1,18 +1,21 @@
1
- # Defines classes to describe tables:
2
- # rde_table.rows
3
- # rde_row.css_class
4
- # rde_row.tag
5
- # rde_row.cells
6
- # rde_cell.css_class
7
- # rde_cell.ruby_formatter
8
- # rde_cell.style
9
- # rde_cell.tag
10
- # rde_cell.title
11
- # rde_cell.value
1
+ # -*- coding: utf-8 -*-
12
2
 
13
3
  class RailsDataExplorer
14
4
  module Utils
15
5
 
6
+ # Responsibilities:
7
+ # * Provide classes to describe tables:
8
+ # rde_table.rows
9
+ # rde_row.css_class
10
+ # rde_row.tag
11
+ # rde_row.cells
12
+ # rde_cell.css_class
13
+ # rde_cell.ruby_formatter
14
+ # rde_cell.style
15
+ # rde_cell.tag
16
+ # rde_cell.title
17
+ # rde_cell.value
18
+ #
16
19
  class RdeTable
17
20
 
18
21
  attr_accessor :rows
@@ -1,9 +1,14 @@
1
- # Add ValueFormat to DataSeries and to individual data points
2
- # Good resource on significant figures:
3
- # * http://www.edu.pe.ca/gray/class_pages/krcutcliffe/physics521/sigfigs/sigfigRULES.htm
4
- # * http://en.wikipedia.org/wiki/Significant_figures
1
+ # -*- coding: utf-8 -*-
2
+
5
3
  class RailsDataExplorer
6
4
  module Utils
5
+
6
+ # Responsibilities:
7
+ # * Format values in data series and individual data
8
+ #
9
+ # Good resource on significant figures:
10
+ # * http://www.edu.pe.ca/gray/class_pages/krcutcliffe/physics521/sigfigs/sigfigRULES.htm
11
+ # * http://en.wikipedia.org/wiki/Significant_figures
7
12
  class ValueFormatter
8
13
 
9
14
  attr_accessor :d3_format, :ruby_formatter, :significant_figures
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = 'rails-data-explorer'
6
- gem.version = '0.2.3'
6
+ gem.version = '1.0.0'
7
7
  gem.platform = Gem::Platform::RUBY
8
8
 
9
9
  gem.authors = ['Jo Hund']
@@ -16,15 +16,14 @@ Gem::Specification.new do |gem|
16
16
  gem.files = `git ls-files`.split("\n")
17
17
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
 
19
- gem.add_dependency 'color'
20
- gem.add_dependency 'descriptive-statistics'
21
- gem.add_dependency 'distribution'
22
- gem.add_dependency 'interpolate'
19
+ gem.add_dependency 'color', ['~> 1.7.1']
20
+ gem.add_dependency 'descriptive-statistics', ['~> 2.1.2']
21
+ gem.add_dependency 'distribution', ['~> 0.7.1']
22
+ gem.add_dependency 'interpolate', ['~> 0.3.0']
23
23
 
24
24
  gem.add_development_dependency 'actionview', '>= 3.0.0'
25
25
  gem.add_development_dependency 'bundler', ['>= 1.0.0']
26
26
  gem.add_development_dependency 'minitest'
27
27
  gem.add_development_dependency 'minitest-spec-expect'
28
28
  gem.add_development_dependency 'rake', ['>= 0']
29
- gem.add_development_dependency 'yui-compressor'
30
29
  end
@@ -0,0 +1,11 @@
1
+ require_relative '../helper_no_rails'
2
+
3
+ class RailsDataExplorer
4
+ describe Chart do
5
+
6
+ it 'computes a dom id' do
7
+ Chart.new.dom_id.must_match /rde-chart-\d/
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../helper_no_rails'
2
+
3
+ class RailsDataExplorer
4
+ describe DataSet do
5
+
6
+ let(:data_set) {
7
+ data_series_attrs = [
8
+ { name: 'ds1', values: (1..6).to_a },
9
+ { name: 'ds2', values: ('a'..'f').to_a },
10
+ ]
11
+ DataSet.new(data_series_attrs, 'the title')
12
+ }
13
+
14
+ it 'returns #data_series' do
15
+ data_set.data_series.count.must_equal 2
16
+ end
17
+
18
+ it 'returns #number_of_values' do
19
+ data_set.number_of_values.must_equal 6
20
+ end
21
+
22
+ it 'returns number of dimensions' do
23
+ data_set.dimensions_count.must_equal 2
24
+ end
25
+
26
+ it 'returns data data_series_names' do
27
+ data_set.data_series_names.must_equal ["ds1", "ds2"]
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,126 @@
1
+ require_relative '../../helper_no_rails'
2
+
3
+ class RailsDataExplorer
4
+ class DataType
5
+ describe Categorical do
6
+
7
+ let(:dt) { Categorical.new }
8
+ let(:values) { ['a', 'a', 'b', 'c'] }
9
+
10
+ describe "#descriptive_statistics" do
11
+
12
+ let(:desc_stats) {
13
+ dt.descriptive_statistics(values)
14
+ }
15
+
16
+ it "computes count for each uniq val" do
17
+ desc_stats.detect{ |e| 'a_count' == e[:label] }[:value].must_equal 2
18
+ end
19
+
20
+ it "computes percent for each uniq val" do
21
+ desc_stats.detect{ |e| 'a_percent' == e[:label] }[:value].must_equal 50.0
22
+ end
23
+
24
+ it "computes total count" do
25
+ desc_stats.detect{ |e| '[Total]_count' == e[:label] }[:value].must_equal 4
26
+ end
27
+ end
28
+
29
+ describe "#available_chart_types" do
30
+ end
31
+
32
+ describe '#label_sorter' do
33
+
34
+ it 'sorts numerical labels with greater and less than signs' do
35
+ labels = ['3', '< -1', '2', '1', '0', '> 3', '-1']
36
+ ds = DataSeries.new('_', labels)
37
+ labels.sort(
38
+ &Categorical.new.label_sorter(nil, ds, '_')
39
+ ).must_equal(['< -1', '-1', '0', '1', '2', '3', '> 3'])
40
+ end
41
+
42
+ it 'sorts mixed numerical and non-numerical labels with non-num at the end' do
43
+ labels = ['3', '2', '[Other]', '1']
44
+ ds = DataSeries.new('_', labels)
45
+ labels.sort(
46
+ &Categorical.new.label_sorter(nil, ds, '_')
47
+ ).must_equal(['1', '2', '3', '[Other]'])
48
+ end
49
+
50
+ it 'accesses label_val_key if given' do
51
+ labels = ['2', '1']
52
+ ds = DataSeries.new('_', labels)
53
+ labels.map { |e| { x: e } }.sort(
54
+ &Categorical.new.label_sorter(:x, ds, '_')
55
+ ).must_equal([{ x: '1' }, { x: '2' }])
56
+ end
57
+
58
+ end
59
+
60
+ describe '#limit_distinct_values' do
61
+
62
+ let(:vals) {
63
+ %w[
64
+ a a a a a a a a a a a a a
65
+ b b b b
66
+ c
67
+ d
68
+ e e e e e
69
+ f f f f f f f
70
+ g
71
+ h h h h
72
+ ]
73
+ }
74
+
75
+ it 'reduces large number of observations to smaller number' do
76
+ Categorical.new.limit_distinct_values(vals, 4).must_equal(
77
+ %w[
78
+ a a a a a a a a a a a a a
79
+ [Other] [Other] [Other] [Other]
80
+ [Other]
81
+ [Other]
82
+ e e e e e
83
+ f f f f f f f
84
+ [Other]
85
+ [Other] [Other] [Other] [Other]
86
+ ]
87
+ )
88
+ end
89
+
90
+ it 'allows override for val_for_others' do
91
+ Categorical.new.limit_distinct_values(
92
+ vals, 4, 'override'
93
+ ).must_equal(
94
+ %w[
95
+ a a a a a a a a a a a a a
96
+ override override override override
97
+ override
98
+ override
99
+ e e e e e
100
+ f f f f f f f
101
+ override
102
+ override override override override
103
+ ]
104
+ )
105
+ end
106
+
107
+ it 'uses label value as tie breaker on equal frequencies' do
108
+ Categorical.new.limit_distinct_values(vals, 5).must_equal(
109
+ %w[
110
+ a a a a a a a a a a a a a
111
+ b b b b
112
+ [Other]
113
+ [Other]
114
+ e e e e e
115
+ f f f f f f f
116
+ [Other]
117
+ [Other] [Other] [Other] [Other]
118
+ ]
119
+ )
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../../helper_no_rails'
2
+
3
+ class RailsDataExplorer
4
+ class DataType
5
+ class Quantitative
6
+ describe Temporal do
7
+
8
+ let(:dt) { Temporal.new }
9
+ let(:values) { [DateTime.new(2015, 02, 06), DateTime.new(2015, 02, 07)] }
10
+
11
+ describe "#descriptive_statistics" do
12
+
13
+ let(:desc_stats) {
14
+ dt.descriptive_statistics(values)
15
+ }
16
+
17
+ it "computes 'Min'" do
18
+ desc_stats.detect { |e| 'Min' == e[:label] }[:value].must_equal DateTime.new(2015, 02, 06)
19
+ end
20
+
21
+ it "computes 'Max'" do
22
+ desc_stats.detect { |e| 'Max' == e[:label] }[:value].must_equal DateTime.new(2015, 02, 07)
23
+ end
24
+
25
+ it "computes 'Count'" do
26
+ desc_stats.detect { |e| 'Count' == e[:label] }[:value].must_equal 2
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,118 @@
1
+ require_relative '../../helper_no_rails'
2
+
3
+ class RailsDataExplorer
4
+ class DataType
5
+ describe Quantitative do
6
+
7
+ let(:dt) { Quantitative.new }
8
+ let(:values) { (1..101).to_a }
9
+
10
+ describe "#descriptive_statistics" do
11
+
12
+ let(:desc_stats) {
13
+ dt.descriptive_statistics(values)
14
+ }
15
+
16
+ it "computes 'Min'" do
17
+ desc_stats.detect { |e| 'Min' == e[:label] }[:value].must_equal 1
18
+ end
19
+
20
+ it "computes '1%ile'" do
21
+ desc_stats.detect { |e| '1%ile' == e[:label] }[:value].must_equal 3
22
+ end
23
+
24
+ it "computes '5%ile'" do
25
+ desc_stats.detect { |e| '5%ile' == e[:label] }[:value].must_equal 7
26
+ end
27
+
28
+ it "computes '10%ile'" do
29
+ desc_stats.detect { |e| '10%ile' == e[:label] }[:value].must_equal 12
30
+ end
31
+
32
+ it "computes '25%ile'" do
33
+ desc_stats.detect { |e| '25%ile' == e[:label] }[:value].must_equal 27
34
+ end
35
+
36
+ it "computes 'Median'" do
37
+ desc_stats.detect { |e| 'Median' == e[:label] }[:value].must_equal 51
38
+ end
39
+
40
+ it "computes '75%ile'" do
41
+ desc_stats.detect { |e| '75%ile' == e[:label] }[:value].must_equal 77
42
+ end
43
+
44
+ it "computes '90%ile'" do
45
+ desc_stats.detect { |e| '90%ile' == e[:label] }[:value].must_equal 92
46
+ end
47
+
48
+ it "computes '95%ile'" do
49
+ desc_stats.detect { |e| '95%ile' == e[:label] }[:value].must_equal 97
50
+ end
51
+
52
+ it "computes '99%ile'" do
53
+ desc_stats.detect { |e| '99%ile' == e[:label] }[:value].must_equal 101
54
+ end
55
+
56
+ it "computes 'Max'" do
57
+ desc_stats.detect { |e| 'Max' == e[:label] }[:value].must_equal 101
58
+ end
59
+
60
+ it "computes 'Range'" do
61
+ desc_stats.detect { |e| 'Range' == e[:label] }[:value].must_equal 100
62
+ end
63
+
64
+ it "computes 'Mean'" do
65
+ desc_stats.detect { |e| 'Mean' == e[:label] }[:value].must_equal 51
66
+ end
67
+
68
+ it "computes 'Mode'" do
69
+ desc_stats.detect { |e| 'Mode' == e[:label] }[:value].must_equal nil
70
+ end
71
+
72
+ it "computes 'Count'" do
73
+ desc_stats.detect { |e| 'Count' == e[:label] }[:value].must_equal 101
74
+ end
75
+
76
+ it "computes 'Sum'" do
77
+ desc_stats.detect { |e| 'Sum' == e[:label] }[:value].must_equal 5151
78
+ end
79
+
80
+ it "computes 'Variance'" do
81
+ desc_stats.detect { |e| 'Variance' == e[:label] }[:value].must_equal 858.5
82
+ end
83
+
84
+ it "computes 'Std. dev.'" do
85
+ desc_stats.detect { |e| 'Std. dev.' == e[:label] }[:value].must_equal 29.300170647967224
86
+ end
87
+
88
+ it "computes 'Rel. std. dev.'" do
89
+ desc_stats.detect { |e| 'Rel. std. dev.' == e[:label] }[:value].must_equal 57.166195047502946
90
+ end
91
+
92
+ it "computes 'Skewness'" do
93
+ desc_stats.detect { |e| 'Skewness' == e[:label] }[:value].must_equal 0.0
94
+ end
95
+
96
+ it "computes 'Kurtosis'" do
97
+ desc_stats.detect { |e| 'Kurtosis' == e[:label] }[:value].must_equal 1.781945253348864
98
+ end
99
+
100
+ end
101
+
102
+ describe '#axis_scale' do
103
+
104
+ it 'determines linear' do
105
+ ds = DataSeries.new('_', [1, 1_000])
106
+ Quantitative.new.axis_scale(ds, {}, :vega).must_equal 'linear'
107
+ end
108
+
109
+ it 'determines log' do
110
+ ds = DataSeries.new('_', [1, 1_000_000])
111
+ Quantitative.new.axis_scale(ds, {}, :vega).must_equal 'log'
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+ end