statsample 0.6.5 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. data/History.txt +15 -0
  2. data/Manifest.txt +6 -0
  3. data/README.txt +30 -12
  4. data/Rakefile +91 -0
  5. data/demo/levene.rb +9 -0
  6. data/demo/multiple_regression.rb +1 -7
  7. data/demo/polychoric.rb +1 -0
  8. data/demo/principal_axis.rb +8 -0
  9. data/lib/distribution/f.rb +22 -22
  10. data/lib/spss.rb +99 -99
  11. data/lib/statsample/bivariate/polychoric.rb +32 -22
  12. data/lib/statsample/bivariate/tetrachoric.rb +212 -207
  13. data/lib/statsample/bivariate.rb +6 -6
  14. data/lib/statsample/codification.rb +65 -65
  15. data/lib/statsample/combination.rb +60 -59
  16. data/lib/statsample/converter/csv19.rb +12 -12
  17. data/lib/statsample/converters.rb +1 -1
  18. data/lib/statsample/dataset.rb +93 -36
  19. data/lib/statsample/dominanceanalysis/bootstrap.rb +66 -3
  20. data/lib/statsample/dominanceanalysis.rb +5 -6
  21. data/lib/statsample/factor/pca.rb +41 -11
  22. data/lib/statsample/factor/principalaxis.rb +105 -29
  23. data/lib/statsample/factor/rotation.rb +20 -3
  24. data/lib/statsample/factor.rb +1 -1
  25. data/lib/statsample/graph/gdchart.rb +13 -13
  26. data/lib/statsample/graph/svggraph.rb +166 -167
  27. data/lib/statsample/matrix.rb +22 -12
  28. data/lib/statsample/mle/logit.rb +3 -2
  29. data/lib/statsample/mle/probit.rb +7 -5
  30. data/lib/statsample/mle.rb +4 -2
  31. data/lib/statsample/multiset.rb +125 -124
  32. data/lib/statsample/permutation.rb +2 -1
  33. data/lib/statsample/regression/binomial/logit.rb +4 -3
  34. data/lib/statsample/regression/binomial/probit.rb +2 -1
  35. data/lib/statsample/regression/binomial.rb +62 -81
  36. data/lib/statsample/regression/multiple/baseengine.rb +1 -1
  37. data/lib/statsample/regression/multiple/gslengine.rb +1 -1
  38. data/lib/statsample/regression/multiple/matrixengine.rb +12 -6
  39. data/lib/statsample/regression/multiple.rb +15 -42
  40. data/lib/statsample/regression/simple.rb +93 -78
  41. data/lib/statsample/regression.rb +74 -2
  42. data/lib/statsample/reliability.rb +117 -120
  43. data/lib/statsample/srs.rb +156 -153
  44. data/lib/statsample/test/levene.rb +90 -0
  45. data/lib/statsample/test/umannwhitney.rb +25 -9
  46. data/lib/statsample/test.rb +2 -0
  47. data/lib/statsample/vector.rb +388 -413
  48. data/lib/statsample.rb +74 -30
  49. data/po/es/statsample.mo +0 -0
  50. data/test/test_bivariate.rb +5 -4
  51. data/test/test_combination.rb +1 -1
  52. data/test/test_dataset.rb +2 -2
  53. data/test/test_factor.rb +53 -6
  54. data/test/test_gsl.rb +1 -1
  55. data/test/test_mle.rb +1 -1
  56. data/test/test_regression.rb +18 -33
  57. data/test/test_statistics.rb +15 -33
  58. data/test/test_stest.rb +35 -0
  59. data/test/test_svg_graph.rb +2 -2
  60. data/test/test_vector.rb +331 -333
  61. metadata +38 -11
@@ -1,59 +1,128 @@
1
1
  module Statsample
2
2
  module Factor
3
+ # Principal Axis Analysis for a covariance or correlation matrix.
4
+ #
5
+ # For PCA, use Statsample::Factor::PCA
6
+ #
7
+ # == Usage:
8
+ # require 'statsample'
9
+ # a=[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2.0, 1.0, 1.5, 1.1].to_scale
10
+ # b=[2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9].to_scale
11
+ # ds={'a'=>a,'b'=>b}.to_dataset
12
+ # cor_matrix=Statsample::Bivariate.correlation_matrix(ds)
13
+ # pa=Statsample::Factor::PrincipalAxis.new(cor_matrix)
14
+ # pa.iterate(1)
15
+ # pa.m
16
+ # => 1
17
+ # pca.component_matrix
18
+ # => GSL::Matrix
19
+ # [ 9.622e-01
20
+ # 9.622e-01 ]
21
+ # pca.communalities
22
+ # => [0.962964636346122, 0.962964636346122]
23
+ #
24
+ # == References:
25
+ #
26
+ # * SPSS manual
27
+ # * Smith, L. (2002). A tutorial on Principal Component Analysis. Available on http://courses.eas.ualberta.ca/eas570/pca_tutorial.pdf
28
+ #
3
29
  class PrincipalAxis
4
- MIN_CHANGE_ESTIMATE=0.0001
30
+ # Minimum difference between succesive iterations on sum of communalities
31
+ DELTA=1e-3
32
+ # Maximum number of iterations
33
+ MAX_ITERATIONS=50
5
34
  include GetText
6
35
  bindtextdomain("statsample")
7
- attr_accessor :m, :name
36
+ # Number of factors. Set by default to the number of factors
37
+ # with eigen values > 1 on PCA over data
38
+ attr_accessor :m
8
39
 
9
- attr_reader :iterations, :initial_eigenvalues
10
- def initialize(matrix ,opts=Hash.new)
40
+ # Name of analysis
41
+ attr_accessor :name
42
+
43
+ # Number of iterations required to converge
44
+ attr_reader :iterations
45
+ # Initial eigenvalues
46
+ attr_reader :initial_eigenvalues
47
+ # Tolerance for iteratios.
48
+ attr_accessor :epsilon
49
+ # Use SMC(squared multiple correlations) as diagonal. If false, use 1
50
+ attr_accessor :smc
51
+ # Maximum number of iterations
52
+ attr_accessor :max_iterations
53
+ # Eigenvalues of factor analysis
54
+ attr_accessor :eigenvalues
55
+
56
+ def initialize(matrix, opts=Hash.new)
11
57
  @matrix=matrix
12
58
  @name=""
13
59
  @m=nil
60
+ @initial_eigenvalues=nil
61
+ @initial_communalities=nil
62
+ @component_matrix=nil
63
+ @delta=DELTA
64
+ @smc=true
65
+ @max_iterations=MAX_ITERATIONS
14
66
  opts.each{|k,v|
15
67
  self.send("#{k}=",v) if self.respond_to? k
16
68
  }
69
+
70
+ if @m.nil?
71
+ pca=PCA.new(::Matrix.rows(@matrix.to_a))
72
+ @m=pca.m
73
+ end
74
+
17
75
  @clean=true
18
76
  end
19
- def communality(m)
77
+ # Communality for all variables given m factors
78
+ def communalities(m=nil)
20
79
  if m!=@m or @clean
21
80
  iterate(m)
22
- raise "Can't calculate comunnality" if @communality.nil?
81
+ raise "Can't calculate comunality" if @communalities.nil?
23
82
  end
24
- @communality
83
+ @communalities
25
84
  end
26
- def component_matrix(m)
85
+ # Component matrix for m factors
86
+ def component_matrix(m=nil)
27
87
  if m!=@m or @clean
28
88
  iterate(m)
29
89
  end
30
90
  @component_matrix
31
91
  end
32
-
33
- def iterate(m, t=25)
92
+ # Iterate to find the factors
93
+ # Parameters
94
+ # * m: Number of factors
95
+ def iterate(m=nil)
34
96
  @clean=false
97
+ m||=@m
35
98
  @m=m
99
+ t = @max_iterations
36
100
  work_matrix=@matrix.to_a
101
+
37
102
  prev_com=initial_communalities
103
+
38
104
  pca=PCA.new(::Matrix.rows(work_matrix))
39
105
  @initial_eigenvalues=pca.eigenvalues
106
+ prev_sum=prev_com.inject(0) {|ac,v| ac+v}
40
107
  @iterations=0
41
108
  t.times do |i|
42
109
  @iterations+=1
43
110
  prev_com.each_with_index{|v,it|
44
111
  work_matrix[it][it]=v
45
112
  }
46
- pca=Statsample::PCA.new(::Matrix.rows(work_matrix))
47
-
48
- @communality=pca.communality(m)
113
+ pca=PCA.new(::Matrix.rows(work_matrix))
114
+ @communalities=pca.communalities(m)
115
+ @eigenvalues=pca.eigenvalues
116
+ com_sum=@communalities.inject(0) {|ac,v| ac+v}
49
117
  jump=true
50
- @communality.each_with_index do |v2,i2|
118
+
119
+ break if (com_sum-prev_sum).abs<@delta
120
+ @communalities.each_with_index do |v2,i2|
51
121
  raise "Variable #{i2} with communality > 1" if v2>1.0
52
- #p (v2-prev_com[i2]).abs
53
- jump=false if (v2-prev_com[i2]).abs>=MIN_CHANGE_ESTIMATE
54
122
  end
55
- break if jump
56
- prev_com=@communality
123
+ prev_sum=com_sum
124
+ prev_com=@communalities
125
+
57
126
  end
58
127
  @component_matrix=pca.component_matrix(m)
59
128
  end
@@ -61,14 +130,20 @@ module Factor
61
130
 
62
131
  def initial_communalities
63
132
  if @initial_communalities.nil?
133
+ if @smc
64
134
  @initial_communalities=@matrix.column_size.times.collect {|i|
65
- rxx , rxy = FactorialAnalysis.separate_matrices(@matrix,i)
135
+ rxx , rxy = PrincipalAxis.separate_matrices(@matrix,i)
66
136
  matrix=(rxy.t*rxx.inverse*rxy)
67
137
  matrix[0,0]
68
138
  }
139
+ else
140
+ @initial_communalities=[1.0]*@matrix.column_size
141
+ end
69
142
  end
70
143
  @initial_communalities
71
144
  end
145
+
146
+
72
147
  # Returns two matrixes from a correlation matrix
73
148
  # with regressors correlation matrix and criteria xy
74
149
  # matrix.
@@ -91,21 +166,22 @@ module Factor
91
166
  rxx=Matrix.rows(rows)
92
167
  [rxx,rxy]
93
168
  end
94
-
95
-
169
+ def summary
170
+ rp=ReportBuilder.new()
171
+ rp.add(self)
172
+ rp.to_text
173
+ end
96
174
  def to_reportbuilder(generator)
175
+ iterate if @clean
97
176
  anchor=generator.add_toc_entry(_("Factor Analysis: ")+name)
98
177
  generator.add_html "<div class='pca'>"+_("Factor Analysis")+" #{@name}<a name='#{anchor}'></a>"
99
- if @m.nil?
100
- # Set number of factors with eigenvalues > 1
101
- m=@eigenpairs.find_all {|v| v[0]>=1.0}.size
102
- else
103
- m=@m
104
- end
178
+
105
179
  generator.add_text "Number of factors: #{m}"
180
+ generator.add_text "Iterations: #{@iterations}"
181
+
106
182
  t=ReportBuilder::Table.new(:name=>_("Communalities"), :header=>["Variable","Initial","Extraction"])
107
- communality(m).each_with_index {|com,i|
108
- t.add_row([i, sprintf("%0.3f", initial_communalities[i]), sprintf("%0.3f", com)])
183
+ communalities(m).each_with_index {|com,i|
184
+ t.add_row([i, sprintf("%0.4f", initial_communalities[i]), sprintf("%0.3f", com)])
109
185
  }
110
186
  generator.parse_element(t)
111
187
 
@@ -16,19 +16,36 @@ module Factor
16
16
  # p rotation.component_transformation_matrix
17
17
  #
18
18
  class Rotation
19
- MAX_PRECISION=1e-15
19
+ EPSILON=1e-15
20
+ MAX_ITERATIONS=25
21
+
20
22
  attr_reader :iterations, :rotated, :component_transformation_matrix, :h2
23
+ # Maximum number of iterations
24
+ attr_accessor :max_iterations
25
+ # Maximum precision
26
+ attr_accessor :epsilon
27
+
28
+
21
29
  def initialize(matrix, opts=Hash.new)
22
30
  @matrix=matrix
23
31
  @n=@matrix.row_size # Variables, p on original
24
32
  @m=@matrix.column_size # Factors, r on original
25
33
  @component_transformation_matrix=nil
34
+ @max_iterations=MAX_ITERATIONS
35
+ @epsilon=EPSILON
26
36
  @h2=(@matrix.collect {|c| c**2} * Matrix.column_vector([1]*@m)).column(0).to_a
37
+ opts.each{|k,v|
38
+ self.send("#{k}=",v) if self.respond_to? k
39
+ }
40
+
41
+
27
42
  end
28
43
  alias_method :communalities, :h2
29
44
  alias_method :rotated_component_matrix, :rotated
30
45
  # Start iteration of
31
- def iterate(max_i=25)
46
+ def iterate(max_i=nil)
47
+ max_i||=@max_iterations
48
+ @max_iterations=max_i
32
49
  t=Matrix.identity(@m)
33
50
  b=@matrix.dup
34
51
  h=Matrix.diagonal(*@h2).collect {|c| Math::sqrt(c)}
@@ -61,7 +78,7 @@ module Factor
61
78
  phi=Math::atan2(num,den) / 4.0
62
79
  # puts "#{i}-#{j}: #{phi}"
63
80
 
64
- if(Math::sin(phi.abs) >= MAX_PRECISION)
81
+ if(Math::sin(phi.abs) >= @epsilon)
65
82
  xx_rot=( Math::cos(phi)*xx)+(Math::sin(phi)*yy)
66
83
  yy_rot=((-Math::sin(phi))*xx)+(Math::cos(phi)*yy)
67
84
 
@@ -3,7 +3,7 @@ require 'statsample/factor/principalaxis'
3
3
  require 'statsample/factor/rotation'
4
4
 
5
5
  module Statsample
6
- # = Factor Analysis toolbox
6
+ # Factor Analysis toolbox.
7
7
  # * Classes for Extraction of factors:
8
8
  # * Statsample::Factor::PCA
9
9
  # * Statsample::Factor::PrincipalAxis
@@ -18,9 +18,9 @@ module Statsample
18
18
  end
19
19
  end
20
20
  end
21
- class Vector # :nodoc:
21
+ class Vector
22
22
  # Creates a barchart using ruby-gdchart
23
- def gdchart_frequencies(file, width=300, height=150, chart_type=GDChart::BAR, options={})
23
+ def gdchart_frequencies(file, width=300, height=150, chart_type=GDChart::BAR, options={}) # :nodoc:
24
24
  labels,data=[],[]
25
25
  self.frequencies.sort.each{|k,v|
26
26
  labels.push(k.to_s)
@@ -29,17 +29,17 @@ module Statsample
29
29
  options['ext_color']=[0xFF3399,0xFF9933,0xFFEE33,0x33FF33, 0x9966FF]
30
30
  Statsample::Util.chart_gdchart(file,width,height,chart_type, labels,options,1,data)
31
31
  end
32
- def gdchart_histogram(bins,file, width=300, height=150, chart_type=GDChart::BAR, options={})
33
- check_type :scale
34
- labels=[]
35
- h=histogram(bins)
36
- data=[]
37
- (0...bins).each{|bin|
38
- data.push(h[bin])
39
- range=h.get_range(bin)
40
- labels.push(((range[0]+range[1]) / 2.to_f).to_s)
41
- }
42
- Statsample::Util.chart_gdchart(file, width, height, chart_type, labels,options, 1,data)
32
+ def gdchart_histogram(bins,file, width=300, height=150, chart_type=GDChart::BAR, options={}) # :nodoc:
33
+ check_type :scale
34
+ labels=[]
35
+ h=histogram(bins)
36
+ data=[]
37
+ (0...bins).each{|bin|
38
+ data.push(h[bin])
39
+ range=h.get_range(bin)
40
+ labels.push(((range[0]+range[1]) / 2.to_f).to_s)
41
+ }
42
+ Statsample::Util.chart_gdchart(file, width, height, chart_type, labels,options, 1,data)
43
43
  end
44
44
  end
45
45
  end
@@ -6,178 +6,177 @@ require 'SVG/Graph/Plot'
6
6
  require 'statsample/graph/svghistogram'
7
7
 
8
8
  module Statsample
9
- class Vector
10
- # Creates a barchart using ruby-gdchart
11
- def svggraph_frequencies(file, width=600, height=300, chart_type=SVG::Graph::BarNoOp, options={})
12
- labels, data1=[],[]
13
- self.frequencies.sort.each{|k,v|
14
- labels.push(k.to_s)
15
- data1.push(v)
16
- }
17
- options[:height]=height
18
- options[:width]=width
19
- options[:fields]=labels
20
- graph = chart_type.new(options)
21
- graph.add_data(
22
- :data => data1,
23
- :title => "Frequencies"
24
- )
25
-
26
- File.open(file,"w") {|f|
27
- f.puts(graph.burn)
28
- }
29
- end
30
- def svggraph_histogram(bins, options={})
31
- check_type :scale
32
- options={:graph_title=>"Histogram", :show_graph_title=>true,:show_normal=>true, :mean=>self.mean, :sigma=>sdp }.merge! options
33
- graph = Statsample::Graph::SvgHistogram.new(options)
34
- graph.histogram=histogram(bins)
35
- graph
36
- end
37
- # Returns a Run-Sequence Plot
38
- # Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/runseqpl.htm
39
- def svggraph_runsequence_plot(options={})
40
- check_type :scale
41
- options={:graph_title=>"Run-Sequence Plot", :show_graph_title=>true, :scale_x_integers => true, :add_popups=>true }.merge! options
42
- vx=(1..@data.size).to_a.to_vector(:scale)
43
- vy=@data.to_vector(:scale)
44
- ds={'index'=>vx,'value'=>vy}.to_dataset
45
- graph = Statsample::Graph::SvgScatterplot.new(ds,options)
46
- graph.set_x('index')
47
- graph.parse
48
- graph
49
- end
50
- def svggraph_boxplot(options={})
51
- check_type :scale
52
- options={:graph_title=>"Boxplot", :fields=>['vector'], :show_graph_title=>true}.merge! options
53
- vx=@valid_data.to_a.to_vector(:scale)
54
- graph = Statsample::Graph::SvgBoxplot.new(options)
55
- graph.add_data(:title=>"vector", :data=>@data.to_a)
56
- graph
57
- end
58
-
59
- def svggraph_lag_plot(options={})
60
- check_type :scale
61
- options={:graph_title=>"Lag Plot", :show_graph_title=>true}.merge! options
62
- vx=@valid_data[0...(@valid_data.size-1)].to_vector(:scale)
63
- vy=@valid_data[1...@valid_data.size].to_vector(:scale)
64
- ds={'x_minus_1'=>vx,'x'=>vy}.to_dataset
65
- graph = Statsample::Graph::SvgScatterplot.new(ds,options)
66
- graph.set_x('x_minus_1')
67
- graph.parse
68
- graph
69
- end
70
-
71
- # Returns a Normal Probability Plot
72
- # Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm
73
- def svggraph_normalprobability_plot(options={})
74
- extend Statsample::Util
75
- check_type :scale
76
- options={:graph_title=>"Normal Probability Plot", :show_graph_title=>true}.merge! options
77
- n=@valid_data.size
78
- vx=(1..@valid_data.size).to_a.collect{|i|
79
- Distribution::Normal.p_value(normal_order_statistic_medians(i,n))
80
- }.to_vector(:scale)
81
- vy=@valid_data.sort.to_vector(:scale)
82
- ds={'normal_order_statistics_medians'=>vx, 'ordered_response'=>vy}.to_dataset
83
- graph = Statsample::Graph::SvgScatterplot.new(ds,options)
84
- graph.set_x('normal_order_statistics_medians')
85
- graph.parse
86
- graph
87
- end
88
- end
9
+ class Vector
10
+ # Creates a barchart using ruby-gdchart
11
+ def svggraph_frequencies(file, width=600, height=300, chart_type=SVG::Graph::BarNoOp, options={})
12
+ labels, data1=[],[]
13
+ self.frequencies.sort.each{|k,v|
14
+ labels.push(k.to_s)
15
+ data1.push(v)
16
+ }
17
+ options[:height]=height
18
+ options[:width]=width
19
+ options[:fields]=labels
20
+ graph = chart_type.new(options)
21
+ graph.add_data(
22
+ :data => data1,
23
+ :title => "Frequencies"
24
+ )
25
+
26
+ File.open(file,"w") {|f|
27
+ f.puts(graph.burn)
28
+ }
29
+ end
30
+ def svggraph_histogram(bins, options={})
31
+ check_type :scale
32
+ options={:graph_title=>"Histogram", :show_graph_title=>true,:show_normal=>true, :mean=>self.mean, :sigma=>sdp }.merge! options
33
+ graph = Statsample::Graph::SvgHistogram.new(options)
34
+ graph.histogram=histogram(bins)
35
+ graph
36
+ end
37
+ # Returns a Run-Sequence Plot
38
+ # Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/runseqpl.htm
39
+ def svggraph_runsequence_plot(options={})
40
+ check_type :scale
41
+ options={:graph_title=>"Run-Sequence Plot", :show_graph_title=>true, :scale_x_integers => true, :add_popups=>true }.merge! options
42
+ vx=(1..@data.size).to_a.to_vector(:scale)
43
+ vy=@data.to_vector(:scale)
44
+ ds={'index'=>vx,'value'=>vy}.to_dataset
45
+ graph = Statsample::Graph::SvgScatterplot.new(ds,options)
46
+ graph.set_x('index')
47
+ graph.parse
48
+ graph
49
+ end
50
+ def svggraph_boxplot(options={})
51
+ check_type :scale
52
+ options={:graph_title=>"Boxplot", :fields=>['vector'], :show_graph_title=>true}.merge! options
53
+ vx=@valid_data.to_a.to_vector(:scale)
54
+ graph = Statsample::Graph::SvgBoxplot.new(options)
55
+ graph.add_data(:title=>"vector", :data=>@data.to_a)
56
+ graph
57
+ end
58
+
59
+ def svggraph_lag_plot(options={})
60
+ check_type :scale
61
+ options={:graph_title=>"Lag Plot", :show_graph_title=>true}.merge! options
62
+ vx=@valid_data[0...(@valid_data.size-1)].to_vector(:scale)
63
+ vy=@valid_data[1...@valid_data.size].to_vector(:scale)
64
+ ds={'x_minus_1'=>vx,'x'=>vy}.to_dataset
65
+ graph = Statsample::Graph::SvgScatterplot.new(ds,options)
66
+ graph.set_x('x_minus_1')
67
+ graph.parse
68
+ graph
69
+ end
70
+ # Returns a Normal Probability Plot
71
+ # Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm
72
+ def svggraph_normalprobability_plot(options={})
73
+ extend Statsample::Util
74
+ check_type :scale
75
+ options={:graph_title=>"Normal Probability Plot", :show_graph_title=>true}.merge! options
76
+ n=@valid_data.size
77
+ vx=(1..@valid_data.size).to_a.collect{|i|
78
+ Distribution::Normal.p_value(normal_order_statistic_medians(i,n))
79
+ }.to_vector(:scale)
80
+ vy=@valid_data.sort.to_vector(:scale)
81
+ ds={'normal_order_statistics_medians'=>vx, 'ordered_response'=>vy}.to_dataset
82
+ graph = Statsample::Graph::SvgScatterplot.new(ds,options)
83
+ graph.set_x('normal_order_statistics_medians')
84
+ graph.parse
85
+ graph
86
+ end
87
+ end
89
88
  end
90
89
 
91
90
  # replaces all key and fill classes with similar ones, without opacity
92
91
  # this allows rendering of svg and png on rox and gqview without problems
93
92
  module SVG #:nodoc:
94
- module Graph
95
- class BarNoOp < Bar # :nodoc:
96
- def get_css; SVG::Graph.get_css_standard; end
97
- end
98
- class BarHorizontalNoOp < BarHorizontal
99
- def get_css; SVG::Graph.get_css_standard; end
100
- end
101
-
102
- class LineNoOp < Line
103
- def get_css; SVG::Graph.get_css_standard; end
104
-
105
- end
106
- class PlotNoOp < Plot
107
- def get_css; SVG::Graph.get_css_standard; end
108
- end
109
- class PieNoOp < Pie
110
- def get_css; SVG::Graph.get_css_standard; end
111
-
112
- end
113
- class << self
114
- def get_css_standard
115
- return <<EOL
116
- /* default fill styles for multiple datasets (probably only use a single dataset on this graph though) */
117
- .key1,.fill1{
118
- fill: #ff0000;
119
- stroke: none;
120
- stroke-width: 0.5px;
121
- }
122
- .key2,.fill2{
123
- fill: #0000ff;
124
- stroke: none;
125
- stroke-width: 1px;
126
- }
127
- .key3,.fill3{
128
- fill: #00ff00;
129
- stroke: none;
130
- stroke-width: 1px;
131
- }
132
- .key4,.fill4{
133
- fill: #ffcc00;
134
- stroke: none;
135
- stroke-width: 1px;
136
- }
137
- .key5,.fill5{
138
- fill: #00ccff;
139
- stroke: none;
140
- stroke-width: 1px;
141
- }
142
- .key6,.fill6{
143
- fill: #ff00ff;
144
- stroke: none;
145
- stroke-width: 1px;
146
- }
147
- .key7,.fill7{
148
- fill: #00ffff;
149
- stroke: none;
150
- stroke-width: 1px;
151
- }
152
- .key8,.fill8{
153
- fill: #ffff00;
154
- stroke: none;
155
- stroke-width: 1px;
156
- }
157
- .key9,.fill9{
158
- fill: #cc6666;
159
- stroke: none;
160
- stroke-width: 1px;
161
- }
162
- .key10,.fill10{
163
- fill: #663399;
164
- stroke: none;
165
- stroke-width: 1px;
166
- }
167
- .key11,.fill11{
168
- fill: #339900;
169
- stroke: none;
170
- stroke-width: 1px;
171
- }
172
- .key12,.fill12{
173
- fill: #9966FF;
174
- stroke: none;
175
- stroke-width: 1px;
176
- }
177
- EOL
178
- end
179
- end
180
- end
93
+ module Graph
94
+ class BarNoOp < Bar # :nodoc:
95
+ def get_css; SVG::Graph.get_css_standard; end
96
+ end
97
+ class BarHorizontalNoOp < BarHorizontal
98
+ def get_css; SVG::Graph.get_css_standard; end
99
+ end
100
+
101
+ class LineNoOp < Line
102
+ def get_css; SVG::Graph.get_css_standard; end
103
+
104
+ end
105
+ class PlotNoOp < Plot
106
+ def get_css; SVG::Graph.get_css_standard; end
107
+ end
108
+ class PieNoOp < Pie
109
+ def get_css; SVG::Graph.get_css_standard; end
110
+
111
+ end
112
+ class << self
113
+ def get_css_standard
114
+ return <<-EOL
115
+ /* default fill styles for multiple datasets (probably only use a single dataset on this graph though) */
116
+ .key1,.fill1{
117
+ fill: #ff0000;
118
+ stroke: none;
119
+ stroke-width: 0.5px;
120
+ }
121
+ .key2,.fill2{
122
+ fill: #0000ff;
123
+ stroke: none;
124
+ stroke-width: 1px;
125
+ }
126
+ .key3,.fill3{
127
+ fill: #00ff00;
128
+ stroke: none;
129
+ stroke-width: 1px;
130
+ }
131
+ .key4,.fill4{
132
+ fill: #ffcc00;
133
+ stroke: none;
134
+ stroke-width: 1px;
135
+ }
136
+ .key5,.fill5{
137
+ fill: #00ccff;
138
+ stroke: none;
139
+ stroke-width: 1px;
140
+ }
141
+ .key6,.fill6{
142
+ fill: #ff00ff;
143
+ stroke: none;
144
+ stroke-width: 1px;
145
+ }
146
+ .key7,.fill7{
147
+ fill: #00ffff;
148
+ stroke: none;
149
+ stroke-width: 1px;
150
+ }
151
+ .key8,.fill8{
152
+ fill: #ffff00;
153
+ stroke: none;
154
+ stroke-width: 1px;
155
+ }
156
+ .key9,.fill9{
157
+ fill: #cc6666;
158
+ stroke: none;
159
+ stroke-width: 1px;
160
+ }
161
+ .key10,.fill10{
162
+ fill: #663399;
163
+ stroke: none;
164
+ stroke-width: 1px;
165
+ }
166
+ .key11,.fill11{
167
+ fill: #339900;
168
+ stroke: none;
169
+ stroke-width: 1px;
170
+ }
171
+ .key12,.fill12{
172
+ fill: #9966FF;
173
+ stroke: none;
174
+ stroke-width: 1px;
175
+ }
176
+ EOL
177
+ end
178
+ end
179
+ end
181
180
  end
182
181
 
183
182
  require 'statsample/graph/svgscatterplot'