statsample 0.6.5 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
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'