rust 0.3 → 0.9
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.
- checksums.yaml +4 -4
- data/bin/ruby-rust +3 -0
- data/lib/{rust-csv.rb → rust/core/csv.rb} +14 -4
- data/lib/rust/core/rust.rb +157 -0
- data/lib/rust/core/types/all.rb +4 -0
- data/lib/{rust-core.rb → rust/core/types/dataframe.rb} +183 -245
- data/lib/rust/core/types/datatype.rb +161 -0
- data/lib/rust/core/types/factor.rb +131 -0
- data/lib/rust/core/types/language.rb +166 -0
- data/lib/rust/core/types/list.rb +81 -0
- data/lib/rust/core/types/matrix.rb +132 -0
- data/lib/rust/core/types/s4class.rb +59 -0
- data/lib/rust/core/types/utils.rb +109 -0
- data/lib/rust/core.rb +7 -0
- data/lib/rust/models/all.rb +4 -0
- data/lib/rust/models/anova.rb +60 -0
- data/lib/rust/models/regression.rb +205 -0
- data/lib/rust/plots/all.rb +4 -0
- data/lib/rust/plots/basic-plots.rb +111 -0
- data/lib/{rust-plots.rb → rust/plots/core.rb} +64 -129
- data/lib/rust/plots/distribution-plots.rb +62 -0
- data/lib/rust/stats/all.rb +4 -0
- data/lib/{rust-basics.rb → rust/stats/correlation.rb} +11 -5
- data/lib/rust/stats/descriptive.rb +128 -0
- data/lib/{rust-effsize.rb → rust/stats/effsize.rb} +23 -21
- data/lib/rust/stats/probabilities.rb +248 -0
- data/lib/rust/stats/tests.rb +292 -0
- data/lib/rust.rb +4 -8
- metadata +31 -12
- data/lib/rust-calls.rb +0 -69
- data/lib/rust-descriptive.rb +0 -59
- data/lib/rust-tests.rb +0 -165
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative '../core'
|
2
|
+
|
3
|
+
module Rust
|
4
|
+
class ANOVAModel < RustDatatype
|
5
|
+
def self.can_pull?(type, klass)
|
6
|
+
return type == "list" && [klass].flatten.include?("aov")
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.pull_variable(variable, type, klass)
|
10
|
+
model = RustDatatype.pull_variable(variable, Rust::List)
|
11
|
+
|
12
|
+
return ANOVAModel.new(model)
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_in_r_as(variable_name)
|
16
|
+
@model.load_in_r_as(variable_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.generate(formula, data, **options)
|
20
|
+
mapped = ""
|
21
|
+
if options.size > 0
|
22
|
+
mapped = options.map { |k, v| "#{k}=#{v}" }.join(", ")
|
23
|
+
mapped = ", " + mapped
|
24
|
+
end
|
25
|
+
|
26
|
+
Rust.exclusive do
|
27
|
+
Rust["aov.data"] = data
|
28
|
+
Rust._eval("aov.model.result <- aov(#{formula.to_R}, data=aov.data#{mapped})")
|
29
|
+
result = ANOVAModel.new(Rust["aov.model.result"])
|
30
|
+
result.r_mirror_to("aov.model.result")
|
31
|
+
return result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(model)
|
36
|
+
@model = model
|
37
|
+
end
|
38
|
+
|
39
|
+
def model
|
40
|
+
@model
|
41
|
+
end
|
42
|
+
|
43
|
+
def summary
|
44
|
+
unless @summary
|
45
|
+
Rust.exclusive do
|
46
|
+
Rust._eval("aov.smr <- summary(#{self.r_mirror})")
|
47
|
+
@summary = Rust['aov.smr']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
return @summary
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module Rust::RBindings
|
57
|
+
def aov(formula, data, **options)
|
58
|
+
return ANOVAModel.generate(formula, data, **options)
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require_relative '../core'
|
2
|
+
require_relative '../stats/descriptive'
|
3
|
+
require_relative '../stats/correlation'
|
4
|
+
|
5
|
+
module Rust::Models
|
6
|
+
end
|
7
|
+
|
8
|
+
module Rust::Models::Regression
|
9
|
+
class RegressionModel < Rust::RustDatatype
|
10
|
+
def self.can_pull?(type, klass)
|
11
|
+
# Can only pull specific sub-types
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def load_in_r_as(variable_name)
|
16
|
+
@model.load_in_r_as(variable_name)
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def self.generate(object_type, model_type, dependent_variable, independent_variables, data, **options)
|
21
|
+
mapped = ""
|
22
|
+
if options.size > 0
|
23
|
+
mapped = options.map { |k, v| "#{k}=#{v}" }.join(", ")
|
24
|
+
mapped = ", " + mapped
|
25
|
+
end
|
26
|
+
|
27
|
+
formula = Rust::Formula.new(dependent_variable, independent_variables.join(" + "))
|
28
|
+
|
29
|
+
Rust.exclusive do
|
30
|
+
Rust["#{model_type}.data"] = data
|
31
|
+
|
32
|
+
Rust._eval("#{model_type}.model.result <- #{model_type}(#{formula.to_R}, data=#{model_type}.data#{mapped})")
|
33
|
+
result = Rust["#{model_type}.model.result"]
|
34
|
+
result.r_mirror_to("#{model_type}.model.result")
|
35
|
+
|
36
|
+
return result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize(model)
|
41
|
+
raise StandardError if model.is_a?(RegressionModel)
|
42
|
+
@model = model
|
43
|
+
end
|
44
|
+
|
45
|
+
def model
|
46
|
+
@model
|
47
|
+
end
|
48
|
+
|
49
|
+
def residuals
|
50
|
+
Rust.exclusive do
|
51
|
+
@residuals = Rust["residuals(#{self.r_mirror})"] unless @residuals
|
52
|
+
end
|
53
|
+
|
54
|
+
return @residuals
|
55
|
+
end
|
56
|
+
|
57
|
+
def fitted
|
58
|
+
Rust.exclusive do
|
59
|
+
@fitted = Rust["fitted(#{self.r_mirror})"] unless @fitted
|
60
|
+
end
|
61
|
+
|
62
|
+
return @fitted
|
63
|
+
end
|
64
|
+
|
65
|
+
def actuals
|
66
|
+
return self.fitted.zip(self.residuals).map { |couple| couple.sum }
|
67
|
+
end
|
68
|
+
|
69
|
+
def r_2
|
70
|
+
return self.summary|"r.squared"
|
71
|
+
end
|
72
|
+
|
73
|
+
def r_2_adjusted
|
74
|
+
return self.summary|"adj.r.squared"
|
75
|
+
end
|
76
|
+
|
77
|
+
def mse
|
78
|
+
Rust::Descriptive.variance(self.residuals)
|
79
|
+
end
|
80
|
+
|
81
|
+
def coefficients
|
82
|
+
a = self.summary|"coefficients"
|
83
|
+
end
|
84
|
+
|
85
|
+
def method_missing(name, *args)
|
86
|
+
return model|name.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
def summary
|
90
|
+
unless @summary
|
91
|
+
Rust.exclusive do
|
92
|
+
@summary = Rust["summary(#{self.r_mirror})"]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
return @summary
|
97
|
+
end
|
98
|
+
|
99
|
+
def r_hash
|
100
|
+
@model.r_hash
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class LinearRegressionModel < RegressionModel
|
105
|
+
def self.can_pull?(type, klass)
|
106
|
+
return type == "list" && klass == "lm"
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.pull_variable(variable, type, klass)
|
110
|
+
model = Rust::RustDatatype.pull_variable(variable, Rust::List)
|
111
|
+
|
112
|
+
return LinearRegressionModel.new(model)
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.generate(dependent_variable, independent_variables, data, **options)
|
116
|
+
RegressionModel.generate(
|
117
|
+
LinearRegressionModel,
|
118
|
+
"lm",
|
119
|
+
dependent_variable,
|
120
|
+
independent_variables,
|
121
|
+
data,
|
122
|
+
**options
|
123
|
+
)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class LinearMixedEffectsModel < RegressionModel
|
128
|
+
def self.can_pull?(type, klass)
|
129
|
+
return type == "S4" && klass == "lmerModLmerTest"
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.pull_priority
|
133
|
+
1
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.pull_variable(variable, type, klass)
|
137
|
+
model = Rust::RustDatatype.pull_variable(variable, Rust::S4Class)
|
138
|
+
|
139
|
+
return LinearMixedEffectsModel.new(model)
|
140
|
+
end
|
141
|
+
|
142
|
+
def summary
|
143
|
+
unless @summary
|
144
|
+
Rust.exclusive do
|
145
|
+
Rust._eval("tmp.summary <- summary(#{self.r_mirror})")
|
146
|
+
Rust._eval("mode(tmp.summary$objClass) <- \"list\"")
|
147
|
+
Rust._eval("tmp.summary$logLik <- attributes(tmp.summary$logLik)")
|
148
|
+
@summary = Rust["tmp.summary"]
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
return @summary
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.generate(dependent_variable, fixed_effects, random_effects, data, **options)
|
156
|
+
Rust.prerequisite("lmerTest")
|
157
|
+
Rust.prerequisite("rsq")
|
158
|
+
|
159
|
+
random_effects = random_effects.map { |effect| "(1|#{effect})" }
|
160
|
+
|
161
|
+
RegressionModel.generate(
|
162
|
+
LinearMixedEffectsModel,
|
163
|
+
"lmer",
|
164
|
+
dependent_variable,
|
165
|
+
fixed_effects + random_effects,
|
166
|
+
data,
|
167
|
+
**options
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
171
|
+
def r_2
|
172
|
+
Rust.exclusive do
|
173
|
+
Rust._eval("tmp.rsq <- rsq(#{self.r_mirror}, adj=F)")
|
174
|
+
return Rust['tmp.rsq']
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def r_2_adjusted
|
179
|
+
Rust.exclusive do
|
180
|
+
Rust._eval("tmp.rsq <- rsq(#{self.r_mirror}, adj=T)")
|
181
|
+
return Rust['tmp.rsq']
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
module Rust::RBindings
|
188
|
+
def lm(formula, data, **options)
|
189
|
+
independent = formula.right_part.split("+").map { |v| v.strip }
|
190
|
+
return LinearRegressionModel.generate(formula.left_part, independent, data, **options)
|
191
|
+
end
|
192
|
+
|
193
|
+
def lmer(formula, data, **options)
|
194
|
+
independent = formula.right_part.split("+").map { |v| v.strip }
|
195
|
+
|
196
|
+
RegressionModel.generate(
|
197
|
+
LinearMixedEffectsModel,
|
198
|
+
"lmer",
|
199
|
+
formula.left_part,
|
200
|
+
independent,
|
201
|
+
data,
|
202
|
+
**options
|
203
|
+
)
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative 'core'
|
2
|
+
|
3
|
+
module Rust::Plots
|
4
|
+
class ScatterPlot < BasePlot
|
5
|
+
def initialize(x = nil, y = nil, **options)
|
6
|
+
super()
|
7
|
+
@series = []
|
8
|
+
if x && y
|
9
|
+
self.series(x, y, **options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def series(x, y, **options)
|
14
|
+
@series << [x, y, options]
|
15
|
+
|
16
|
+
return self
|
17
|
+
end
|
18
|
+
|
19
|
+
def thickness(t)
|
20
|
+
self['lwd'] = t
|
21
|
+
|
22
|
+
return self
|
23
|
+
end
|
24
|
+
|
25
|
+
def lines()
|
26
|
+
self['type'] = "l"
|
27
|
+
|
28
|
+
return self
|
29
|
+
end
|
30
|
+
|
31
|
+
def points()
|
32
|
+
self['type'] = "p"
|
33
|
+
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
def lines_and_points()
|
38
|
+
self['type'] = "b"
|
39
|
+
|
40
|
+
return self
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def _show()
|
45
|
+
first = true
|
46
|
+
palette = self.palette(@series.size)
|
47
|
+
i = 0
|
48
|
+
|
49
|
+
base_options = {}
|
50
|
+
unless @options['xlim']
|
51
|
+
x_values = @series.map { |v| v[0] }.flatten
|
52
|
+
y_values = @series.map { |v| v[1] }.flatten
|
53
|
+
|
54
|
+
base_options[:xlim] = [x_values.min, x_values.max]
|
55
|
+
base_options[:ylim] = [y_values.min, y_values.max]
|
56
|
+
end
|
57
|
+
|
58
|
+
@series.each do |x, y, options|
|
59
|
+
options = options.merge(base_options)
|
60
|
+
Rust["plotter.x"] = x
|
61
|
+
Rust["plotter.y"] = y
|
62
|
+
|
63
|
+
function = nil
|
64
|
+
if first
|
65
|
+
function = Rust::Function.new("plot")
|
66
|
+
first = false
|
67
|
+
else
|
68
|
+
function = Rust::Function.new("lines")
|
69
|
+
end
|
70
|
+
|
71
|
+
augmented_options = {}
|
72
|
+
augmented_options['col'] = options[:color] || palette[i]
|
73
|
+
augmented_options['xlim'] = options[:xlim] if options[:xlim]
|
74
|
+
augmented_options['ylim'] = options[:ylim] if options[:ylim]
|
75
|
+
|
76
|
+
function.options = self._augmented_options(augmented_options)
|
77
|
+
function.arguments << Rust::Variable.new("plotter.x")
|
78
|
+
function.arguments << Rust::Variable.new("plotter.y")
|
79
|
+
|
80
|
+
function.call
|
81
|
+
|
82
|
+
i += 1
|
83
|
+
end
|
84
|
+
|
85
|
+
return self
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class BarPlot < BasePlot
|
90
|
+
def initialize(bars)
|
91
|
+
super()
|
92
|
+
@bars = bars
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
def _show()
|
97
|
+
Rust["plotter.bars"] = @bars.values
|
98
|
+
Rust["plotter.labels"] = @bars.keys
|
99
|
+
|
100
|
+
Rust._eval("names(plotter.bars) <- plotter.labels")
|
101
|
+
|
102
|
+
function = Rust::Function.new("barplot")
|
103
|
+
function.options = self._augmented_options
|
104
|
+
function.arguments << Rust::Variable.new("plotter.bars")
|
105
|
+
|
106
|
+
function.call
|
107
|
+
|
108
|
+
return self
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative 'rust-calls'
|
1
|
+
require_relative '../core'
|
3
2
|
|
4
3
|
module Rust::Plots
|
5
4
|
class BasePlot
|
6
5
|
def initialize
|
7
|
-
@
|
6
|
+
@renderables = []
|
8
7
|
@options = Rust::Options.new
|
8
|
+
@override_options = true
|
9
9
|
end
|
10
10
|
|
11
11
|
def x_label(label)
|
@@ -20,6 +20,14 @@ module Rust::Plots
|
|
20
20
|
return self
|
21
21
|
end
|
22
22
|
|
23
|
+
def palette(size)
|
24
|
+
if size <= 1
|
25
|
+
return ['black']
|
26
|
+
else
|
27
|
+
return Rust._pull("hcl.colors(n=#{size})")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
23
31
|
def x_range(range)
|
24
32
|
@options['xlim'] = range
|
25
33
|
|
@@ -36,7 +44,13 @@ module Rust::Plots
|
|
36
44
|
@options['xaxt'] = 'n'
|
37
45
|
@options['yaxt'] = 'n'
|
38
46
|
|
39
|
-
self.
|
47
|
+
self._add_renderable(axis)
|
48
|
+
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
def grid(grid)
|
53
|
+
self._add_renderable(grid)
|
40
54
|
|
41
55
|
return self
|
42
56
|
end
|
@@ -53,21 +67,25 @@ module Rust::Plots
|
|
53
67
|
return self
|
54
68
|
end
|
55
69
|
|
56
|
-
def
|
57
|
-
raise TypeError, "Expected
|
58
|
-
@
|
70
|
+
def _add_renderable(renderable)
|
71
|
+
raise TypeError, "Expected Renderable" unless renderable.is_a?(Renderable)
|
72
|
+
@renderables << renderable
|
59
73
|
|
60
74
|
return self
|
61
75
|
end
|
62
76
|
|
63
77
|
def []=(option, value)
|
64
|
-
@options[option] = value
|
78
|
+
@options[option.to_s] = value
|
79
|
+
end
|
80
|
+
|
81
|
+
def _do_not_override_options!
|
82
|
+
@override_options = false
|
65
83
|
end
|
66
84
|
|
67
85
|
def show()
|
68
86
|
Rust.exclusive do
|
69
87
|
self._show
|
70
|
-
self.
|
88
|
+
self._render_others
|
71
89
|
end
|
72
90
|
|
73
91
|
return self
|
@@ -82,7 +100,7 @@ module Rust::Plots
|
|
82
100
|
Rust.exclusive do
|
83
101
|
pdf_function.call
|
84
102
|
self._show
|
85
|
-
self.
|
103
|
+
self._render_others
|
86
104
|
Rust._eval("dev.off()")
|
87
105
|
end
|
88
106
|
|
@@ -94,9 +112,9 @@ module Rust::Plots
|
|
94
112
|
raise "You are trying to show a BasePlot"
|
95
113
|
end
|
96
114
|
|
97
|
-
def
|
98
|
-
@
|
99
|
-
|
115
|
+
def _render_others()
|
116
|
+
@renderables.each do |renderable|
|
117
|
+
renderable._render()
|
100
118
|
end
|
101
119
|
|
102
120
|
return self
|
@@ -106,7 +124,7 @@ module Rust::Plots
|
|
106
124
|
result = @options.clone
|
107
125
|
|
108
126
|
options.each do |key, value|
|
109
|
-
result[key] = value
|
127
|
+
result[key] = value if !result[key] || @override_options
|
110
128
|
end
|
111
129
|
|
112
130
|
result.select! { |k, v| v != nil }
|
@@ -115,113 +133,7 @@ module Rust::Plots
|
|
115
133
|
end
|
116
134
|
end
|
117
135
|
|
118
|
-
class
|
119
|
-
def initialize(x, y)
|
120
|
-
super()
|
121
|
-
@x = x
|
122
|
-
@y = y
|
123
|
-
end
|
124
|
-
|
125
|
-
def thickness(t)
|
126
|
-
self['lwd'] = t
|
127
|
-
|
128
|
-
return self
|
129
|
-
end
|
130
|
-
|
131
|
-
def lines()
|
132
|
-
self['type'] = "l"
|
133
|
-
|
134
|
-
return self
|
135
|
-
end
|
136
|
-
|
137
|
-
def points()
|
138
|
-
self['type'] = "p"
|
139
|
-
|
140
|
-
return self
|
141
|
-
end
|
142
|
-
|
143
|
-
def lines_and_points()
|
144
|
-
self['type'] = "b"
|
145
|
-
|
146
|
-
return self
|
147
|
-
end
|
148
|
-
|
149
|
-
protected
|
150
|
-
def _show()
|
151
|
-
Rust["plotter.x"] = @x
|
152
|
-
Rust["plotter.y"] = @y
|
153
|
-
|
154
|
-
function = Rust::Function.new("plot")
|
155
|
-
function.options = self._augmented_options
|
156
|
-
function.arguments << Rust::Variable.new("plotter.x")
|
157
|
-
function.arguments << Rust::Variable.new("plotter.y")
|
158
|
-
|
159
|
-
function.call
|
160
|
-
|
161
|
-
return self
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
class DistributionPlot < BasePlot
|
166
|
-
def initialize
|
167
|
-
super()
|
168
|
-
@series = []
|
169
|
-
end
|
170
|
-
|
171
|
-
def series(data, **options)
|
172
|
-
@series << [data, options]
|
173
|
-
|
174
|
-
return self
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
class DensityPlot < DistributionPlot
|
179
|
-
protected
|
180
|
-
def _show()
|
181
|
-
first = true
|
182
|
-
@series.each do |data, options|
|
183
|
-
Rust["plotter.series"] = data
|
184
|
-
|
185
|
-
if first
|
186
|
-
first = false
|
187
|
-
command = "plot"
|
188
|
-
else
|
189
|
-
command = "lines"
|
190
|
-
end
|
191
|
-
|
192
|
-
function = Rust::Function.new(command)
|
193
|
-
function.options = self._augmented_options({"col" => options[:color]})
|
194
|
-
function.arguments << Rust::Variable.new("density(plotter.series)")
|
195
|
-
function.call
|
196
|
-
end
|
197
|
-
|
198
|
-
return self
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
class BoxPlot < DistributionPlot
|
203
|
-
protected
|
204
|
-
def _show()
|
205
|
-
function = Rust::Function.new("boxplot")
|
206
|
-
|
207
|
-
names = []
|
208
|
-
@series.each_with_index do |data, i|
|
209
|
-
series, options = *data
|
210
|
-
varname = "plotter.series#{i}"
|
211
|
-
Rust[varname] = series
|
212
|
-
function.arguments << Rust::Variable.new(varname)
|
213
|
-
names << (options[:name] || (i+1).to_s)
|
214
|
-
end
|
215
|
-
|
216
|
-
function.options = self._augmented_options({'names' => names})
|
217
|
-
|
218
|
-
function.call
|
219
|
-
|
220
|
-
return self
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
class Plugin
|
136
|
+
class Renderable
|
225
137
|
def initialize
|
226
138
|
@options = Rust::Options.new
|
227
139
|
end
|
@@ -233,12 +145,12 @@ module Rust::Plots
|
|
233
145
|
end
|
234
146
|
|
235
147
|
protected
|
236
|
-
def
|
237
|
-
raise "You are trying to run an abstract
|
148
|
+
def _render()
|
149
|
+
raise "You are trying to run an abstract Renderable"
|
238
150
|
end
|
239
151
|
end
|
240
152
|
|
241
|
-
class Axis <
|
153
|
+
class Axis < Renderable
|
242
154
|
BELOW = 1
|
243
155
|
LEFT = 2
|
244
156
|
ABOVE = 3
|
@@ -276,7 +188,7 @@ module Rust::Plots
|
|
276
188
|
return self
|
277
189
|
end
|
278
190
|
|
279
|
-
def
|
191
|
+
def _render()
|
280
192
|
function = Rust::Function.new("axis")
|
281
193
|
function.options = @options
|
282
194
|
|
@@ -286,7 +198,7 @@ module Rust::Plots
|
|
286
198
|
end
|
287
199
|
end
|
288
200
|
|
289
|
-
class Grid <
|
201
|
+
class Grid < Renderable
|
290
202
|
def initialize
|
291
203
|
super()
|
292
204
|
|
@@ -330,7 +242,7 @@ module Rust::Plots
|
|
330
242
|
return self
|
331
243
|
end
|
332
244
|
|
333
|
-
def
|
245
|
+
def _render()
|
334
246
|
function = Rust::Function.new("grid")
|
335
247
|
|
336
248
|
function.arguments << @x
|
@@ -345,7 +257,30 @@ module Rust::Plots
|
|
345
257
|
end
|
346
258
|
|
347
259
|
module Rust::RBindings
|
348
|
-
def plot(x, y)
|
349
|
-
Rust::Plots::ScatterPlot.new(x, y)
|
260
|
+
def plot(x, y=(1..x.size).to_a, **options)
|
261
|
+
result = Rust::Plots::ScatterPlot.new(x, y)
|
262
|
+
|
263
|
+
options.each do |k, v|
|
264
|
+
result[k] = v
|
265
|
+
end
|
266
|
+
|
267
|
+
result._do_not_override_options!
|
268
|
+
|
269
|
+
result.show
|
270
|
+
end
|
271
|
+
|
272
|
+
def boxplot(*args, **options)
|
273
|
+
result = Rust::Plots::BoxPlot.new
|
274
|
+
options.each do |k, v|
|
275
|
+
result[k] = v
|
276
|
+
end
|
277
|
+
|
278
|
+
result._do_not_override_options!
|
279
|
+
|
280
|
+
args.each do |s|
|
281
|
+
result.series(s)
|
282
|
+
end
|
283
|
+
|
284
|
+
result.show
|
350
285
|
end
|
351
286
|
end
|