rubyplot 0.0.1 → 0.1.pre.a1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +133 -0
- data/.travis.yml +18 -0
- data/CHANGELOG.md +9 -0
- data/CONTRIBUTING.md +48 -0
- data/Gemfile +6 -0
- data/README.md +47 -0
- data/Rakefile +32 -0
- data/ext/grruby/extconf.rb +6 -0
- data/ext/grruby/grruby.c +1163 -0
- data/ext/grruby/grruby.h +135 -0
- data/lib/rubyplot.rb +30 -1
- data/lib/rubyplot/artist.rb +13 -0
- data/lib/rubyplot/artist/axes.rb +328 -0
- data/lib/rubyplot/artist/axis.rb +3 -0
- data/lib/rubyplot/artist/axis/base.rb +34 -0
- data/lib/rubyplot/artist/axis/x_axis.rb +35 -0
- data/lib/rubyplot/artist/axis/y_axis.rb +40 -0
- data/lib/rubyplot/artist/base.rb +14 -0
- data/lib/rubyplot/artist/circle.rb +28 -0
- data/lib/rubyplot/artist/figure.rb +90 -0
- data/lib/rubyplot/artist/legend.rb +59 -0
- data/lib/rubyplot/artist/legend_box.rb +89 -0
- data/lib/rubyplot/artist/line2d.rb +24 -0
- data/lib/rubyplot/artist/plot.rb +9 -0
- data/lib/rubyplot/artist/plot/area.rb +38 -0
- data/lib/rubyplot/artist/plot/bar.rb +69 -0
- data/lib/rubyplot/artist/plot/bar_type.rb +31 -0
- data/lib/rubyplot/artist/plot/base.rb +67 -0
- data/lib/rubyplot/artist/plot/bubble.rb +41 -0
- data/lib/rubyplot/artist/plot/line.rb +61 -0
- data/lib/rubyplot/artist/plot/multi_bars.rb +75 -0
- data/lib/rubyplot/artist/plot/multi_stacked_bar.rb +78 -0
- data/lib/rubyplot/artist/plot/scatter.rb +29 -0
- data/lib/rubyplot/artist/plot/stacked_bar.rb +69 -0
- data/lib/rubyplot/artist/polygon.rb +21 -0
- data/lib/rubyplot/artist/rectangle.rb +39 -0
- data/lib/rubyplot/artist/text.rb +49 -0
- data/lib/rubyplot/artist/tick.rb +3 -0
- data/lib/rubyplot/artist/tick/base.rb +35 -0
- data/lib/rubyplot/artist/tick/x_tick.rb +25 -0
- data/lib/rubyplot/artist/tick/y_tick.rb +24 -0
- data/lib/rubyplot/backend.rb +2 -0
- data/lib/rubyplot/backend/gr_wrapper.rb +7 -0
- data/lib/rubyplot/backend/magick_wrapper.rb +141 -0
- data/lib/rubyplot/color.rb +992 -0
- data/lib/rubyplot/figure.rb +2 -0
- data/lib/rubyplot/spi.rb +8 -0
- data/lib/rubyplot/subplot.rb +4 -0
- data/lib/rubyplot/themes.rb +47 -0
- data/lib/rubyplot/utils.rb +14 -0
- data/lib/rubyplot/version.rb +1 -1
- data/rubyplot.gemspec +10 -0
- data/spec/axes_spec.rb +477 -0
- data/spec/figure_spec.rb +12 -0
- data/spec/spec_helper.rb +62 -0
- data/spec/spi/multi_plot_graph_spec.rb +33 -0
- data/spec/spi/single_plot_graph_spec.rb +227 -0
- data/spec/spi/subplots_spec.rb +55 -0
- metadata +166 -8
@@ -0,0 +1,34 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Axis
|
4
|
+
class Base
|
5
|
+
# Length in pixels of the arrow after the last major tick.
|
6
|
+
FINISH_ARROW_LENGTH = 10.0
|
7
|
+
|
8
|
+
attr_reader :label, :ticks, :major_ticks_count
|
9
|
+
attr_reader :abs_x1, :abs_x2, :abs_y1, :abs_y2, :backend, :length
|
10
|
+
attr_reader :stroke_width, :major_ticks
|
11
|
+
attr_accessor :title, :min_val, :max_val
|
12
|
+
|
13
|
+
def initialize axes
|
14
|
+
@axes = axes
|
15
|
+
@title = ''
|
16
|
+
@min_val = nil
|
17
|
+
@max_val = nil
|
18
|
+
@stroke_width = 1.0
|
19
|
+
@major_ticks_count = 5
|
20
|
+
@x_ticks = nil
|
21
|
+
@texts = []
|
22
|
+
@lines = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def draw
|
26
|
+
configure_title
|
27
|
+
@lines.each(&:draw)
|
28
|
+
@texts.each(&:draw)
|
29
|
+
end
|
30
|
+
|
31
|
+
end # class Base
|
32
|
+
end # class Axis
|
33
|
+
end # class Artist
|
34
|
+
end # module Rubyplot
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Rubyplot
|
4
|
+
module Artist
|
5
|
+
class XAxis < Axis::Base
|
6
|
+
def initialize axes
|
7
|
+
super
|
8
|
+
@abs_x1 = @axes.origin[0]
|
9
|
+
@abs_x2 = @axes.abs_x + @axes.width - @axes.y_axis_margin
|
10
|
+
@major_ticks_distance = (@abs_x2 - @abs_x1) / @major_ticks_count
|
11
|
+
@length = (@abs_x2 - @abs_x1).abs
|
12
|
+
configure_axis_line
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def configure_axis_line
|
18
|
+
@lines << Rubyplot::Artist::Line2D.new(
|
19
|
+
self, abs_x1: @abs_x1, abs_y1: @axes.origin[1], abs_x2: @abs_x2, abs_y2: @axes.origin[1],
|
20
|
+
stroke_width: @stroke_width
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def configure_title
|
25
|
+
@texts << Rubyplot::Artist::Text.new(
|
26
|
+
@title,
|
27
|
+
self,
|
28
|
+
pointsize: @axes.marker_font_size,
|
29
|
+
abs_y: @axes.origin[1] + 20,
|
30
|
+
abs_x: @axes.origin[0] + (@abs_x2 - @abs_x1)/2
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end # class XAxis
|
34
|
+
end # class Artist
|
35
|
+
end # module Rubyplot
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class YAxis < Axis::Base
|
4
|
+
def initialize(*)
|
5
|
+
super
|
6
|
+
@abs_x1 = @axes.origin[0]
|
7
|
+
@abs_y1 = @axes.origin[1]
|
8
|
+
@abs_x2 = @axes.origin[0]
|
9
|
+
@abs_y2 = @axes.origin[1] - (@axes.height - @axes.x_axis_margin)
|
10
|
+
@y_ticks = []
|
11
|
+
@length = (@abs_y1 - @abs_y2).abs
|
12
|
+
configure_axis_line
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def configure_axis_line
|
18
|
+
@lines << Rubyplot::Artist::Line2D.new(
|
19
|
+
self,
|
20
|
+
abs_x1: @abs_x1,
|
21
|
+
abs_y1: @abs_y1,
|
22
|
+
abs_x2: @abs_x2,
|
23
|
+
abs_y2: @abs_y2,
|
24
|
+
stroke_width: @stroke_width
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure_title
|
29
|
+
@texts << Rubyplot::Artist::Text.new(
|
30
|
+
@title,
|
31
|
+
self,
|
32
|
+
rotation: -90.0,
|
33
|
+
abs_x: @axes.origin[0] - 10,
|
34
|
+
abs_y: (@abs_y1 - @abs_y2) / 2,
|
35
|
+
pointsize: @axes.marker_font_size
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end # class YAxis
|
39
|
+
end # class Artist
|
40
|
+
end # module Rubyplot
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Base
|
4
|
+
# Absolute X co-ordinate of this Aritist on the canvas.
|
5
|
+
attr_reader :abs_x
|
6
|
+
# Absolute Y co-ordinate of this Aritist on the canvas.
|
7
|
+
attr_reader :abs_y
|
8
|
+
def initialize(abs_x, abs_y)
|
9
|
+
@abs_x = abs_x
|
10
|
+
@abs_y = abs_y
|
11
|
+
end
|
12
|
+
end # class Base
|
13
|
+
end # module Artist
|
14
|
+
end # module Rubyplot
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Circle < Base
|
4
|
+
# rubocop:disable Metrics/ParameterLists
|
5
|
+
def initialize(owner, abs_x:, abs_y:, radius:, stroke_opacity: 0.0,
|
6
|
+
color: :default, stroke_width:)
|
7
|
+
super(abs_x, abs_y)
|
8
|
+
@owner = owner
|
9
|
+
@radius = radius
|
10
|
+
@stroke_width = stroke_width
|
11
|
+
@stroke_opacity = stroke_opacity
|
12
|
+
@color = color
|
13
|
+
end
|
14
|
+
# rubocop:enable Metrics/ParameterLists
|
15
|
+
|
16
|
+
def draw
|
17
|
+
Rubyplot.backend.draw_circle(
|
18
|
+
x: @abs_x,
|
19
|
+
y: @abs_y,
|
20
|
+
radius: @radius,
|
21
|
+
stroke_opacity: @stroke_opacity,
|
22
|
+
stroke_width: @stroke_width,
|
23
|
+
color: Rubyplot::Color::COLOR_INDEX[@color]
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end # class Circle
|
27
|
+
end # module Artist
|
28
|
+
end # module Rubyplot
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Figure < Artist::Base
|
4
|
+
DEFAULT_TARGET_WIDTH = 800
|
5
|
+
|
6
|
+
# Title on the figure.
|
7
|
+
attr_reader :title
|
8
|
+
# Number of Axes objects in the rows.
|
9
|
+
attr_reader :nrows
|
10
|
+
# Number of Axes objects in the cols.
|
11
|
+
attr_reader :ncols
|
12
|
+
# Total width of the Figure in pixels.
|
13
|
+
attr_reader :width
|
14
|
+
# Total height of the Figure in pixels.
|
15
|
+
attr_reader :height
|
16
|
+
# Ratio of the total height that is the spacing between the top of the
|
17
|
+
# Figure and the top of the Axes.
|
18
|
+
attr_reader :top_spacing
|
19
|
+
# Ratio of the total width that is the spacing between the left of the
|
20
|
+
# Figure and the left of the Axes.
|
21
|
+
attr_reader :left_spacing
|
22
|
+
# Ratio of the total width that is the spacing between the right of the
|
23
|
+
# Figure and the right of the Axes.
|
24
|
+
attr_reader :right_spacing
|
25
|
+
# Ratio of the total width that is the spacing between the bottom of the
|
26
|
+
# Figure and the bottom of the Axes.
|
27
|
+
attr_reader :bottom_spacing
|
28
|
+
attr_reader :theme_options
|
29
|
+
attr_reader :marker_color
|
30
|
+
attr_reader :font_color
|
31
|
+
|
32
|
+
# Initialize a Rubyplot::Artist::Figure object.
|
33
|
+
# @param height [Integer] nil Height in pixels of the complete Figure.
|
34
|
+
# @param width [Integer] nil Width in pixels of the complete Figure.
|
35
|
+
def initialize(height: nil, width: nil)
|
36
|
+
super(0, 0)
|
37
|
+
@title = ''
|
38
|
+
@nrows = 1
|
39
|
+
@ncols = 1
|
40
|
+
@width = width || DEFAULT_TARGET_WIDTH
|
41
|
+
@height = height || @width * 0.75
|
42
|
+
@top_spacing = 0.05
|
43
|
+
@bottom_spacing = 0.05
|
44
|
+
@left_spacing = 0.05
|
45
|
+
@right_spacing = 0.05
|
46
|
+
@subplots = nil
|
47
|
+
@n = 0
|
48
|
+
setup_default_theme
|
49
|
+
add_subplots @nrows, @ncols
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_subplots(nrows, ncols)
|
53
|
+
@subplots = Array.new(nrows) { Array.new(ncols) { nil } }
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_subplot(nrow, ncol)
|
57
|
+
@subplots[nrow][ncol] = Rubyplot::Artist::Axes.new(self)
|
58
|
+
@subplots[nrow][ncol]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Draw on a canvas and output to a file.
|
62
|
+
#
|
63
|
+
# @param output [TrueClass, FalseClass] true Whether to output to file or not.
|
64
|
+
def write(file_name, output: true)
|
65
|
+
Rubyplot.backend.set_base_image_gradient(
|
66
|
+
Rubyplot::Color::COLOR_INDEX[@theme_options[:background_colors][0]],
|
67
|
+
Rubyplot::Color::COLOR_INDEX[@theme_options[:background_colors][1]],
|
68
|
+
@width,
|
69
|
+
@height,
|
70
|
+
@theme_options[:background_direction]
|
71
|
+
)
|
72
|
+
@subplots.each { |i| i.each(&:draw) }
|
73
|
+
Rubyplot.backend.write(file_name) if output
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def setup_default_theme
|
79
|
+
defaults = {
|
80
|
+
marker_color: :white,
|
81
|
+
font_color: :black,
|
82
|
+
background_image: nil
|
83
|
+
}
|
84
|
+
@theme_options = defaults.merge Themes::CLASSIC_WHITE
|
85
|
+
@marker_color = @theme_options[:marker_color]
|
86
|
+
@font_color = @theme_options[:font_color] || @marker_color
|
87
|
+
end
|
88
|
+
end # class Figure
|
89
|
+
end # module Artist
|
90
|
+
end # module Rubyplot
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Legend < Artist::Base
|
4
|
+
TOP_MARGIN = 2.5
|
5
|
+
BOTTOM_MARGIN = 2.5
|
6
|
+
# Space between the color box and the legend text.
|
7
|
+
BOX_AND_TEXT_SPACE = 5.0
|
8
|
+
attr_reader :legend_box_size, :font, :font_size, :font_color
|
9
|
+
|
10
|
+
# rubocop:disable Metrics/ParameterLists
|
11
|
+
def initialize(legend_box, axes, text:, color:,abs_x:,abs_y:)
|
12
|
+
super(abs_x, abs_y)
|
13
|
+
@legend_box = legend_box
|
14
|
+
@axes = axes
|
15
|
+
@text = text
|
16
|
+
@color = color
|
17
|
+
@legend_box_size = @legend_box.per_legend_height -
|
18
|
+
(TOP_MARGIN + BOTTOM_MARGIN) # size of the color box of the legend.
|
19
|
+
@font_size = 20.0
|
20
|
+
@font = @axes.font
|
21
|
+
@font_color = @axes.font_color
|
22
|
+
configure_legend_color_box
|
23
|
+
configure_legend_text
|
24
|
+
end
|
25
|
+
# rubocop:enable Metrics/ParameterLists
|
26
|
+
|
27
|
+
def draw
|
28
|
+
@legend_color_box.draw
|
29
|
+
@text.draw
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def configure_legend_color_box
|
35
|
+
@legend_color_box = Rubyplot::Artist::Rectangle.new(
|
36
|
+
self,
|
37
|
+
abs_x: @abs_x,
|
38
|
+
abs_y: @abs_y + TOP_MARGIN,
|
39
|
+
width: @legend_box_size,
|
40
|
+
height: @legend_box_size,
|
41
|
+
border_color: @color,
|
42
|
+
fill_color: @color
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def configure_legend_text
|
47
|
+
@text = Rubyplot::Artist::Text.new(
|
48
|
+
@text,
|
49
|
+
self,
|
50
|
+
abs_x: @abs_x + @legend_box_size + BOX_AND_TEXT_SPACE,
|
51
|
+
abs_y: @legend_color_box.abs_y + @legend_box_size - 2.5,
|
52
|
+
font: @font,
|
53
|
+
color: @font_color,
|
54
|
+
pointsize: @font_size
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end # class Legend
|
58
|
+
end # class Artist
|
59
|
+
end # module Rubyplot
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class LegendBox < Base
|
4
|
+
# Ratio of total height of legend box that is the top margin.
|
5
|
+
TOP_SPACING_RATIO = 0.1
|
6
|
+
# Ratio of the total height of the legend box that is the bottom margin.
|
7
|
+
BOTTOM_SPACING_RATIO = 0.1
|
8
|
+
# Ratio of the total width of the legend box that is the left margin.
|
9
|
+
LEFT_SPACING_RATIO = 0.1
|
10
|
+
# Ratio of the total width of the legend box that is the right margin.
|
11
|
+
RIGHT_SPACING_RATIO = 0.1
|
12
|
+
|
13
|
+
attr_accessor :border_color
|
14
|
+
|
15
|
+
def initialize(axes, abs_x:, abs_y:)
|
16
|
+
super(abs_x, abs_y)
|
17
|
+
@axes = axes
|
18
|
+
@border_color = :black
|
19
|
+
@legends = []
|
20
|
+
configure_dimensions
|
21
|
+
configure_legends
|
22
|
+
configure_legend_box
|
23
|
+
end
|
24
|
+
|
25
|
+
def draw
|
26
|
+
unless @legends.empty?
|
27
|
+
@bounding_box.draw
|
28
|
+
@legends.each(&:draw)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def top_margin
|
33
|
+
TOP_SPACING_RATIO * @legends_height
|
34
|
+
end
|
35
|
+
|
36
|
+
def bottom_margin
|
37
|
+
BOTTOM_SPACING_RATIO * @legends_height
|
38
|
+
end
|
39
|
+
|
40
|
+
def left_margin
|
41
|
+
LEFT_SPACING_RATIO * @legends_width
|
42
|
+
end
|
43
|
+
|
44
|
+
def right_margin
|
45
|
+
RIGHT_SPACING_RATIO * @legends_width
|
46
|
+
end
|
47
|
+
|
48
|
+
# Calculation of the height that each legend takes.
|
49
|
+
def per_legend_height
|
50
|
+
25.0
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def configure_legend_box
|
56
|
+
@bounding_box = Rubyplot::Artist::Rectangle.new(
|
57
|
+
self,
|
58
|
+
abs_x: @abs_x,
|
59
|
+
abs_y: @abs_y,
|
60
|
+
width: @width,
|
61
|
+
height: @height,
|
62
|
+
border_color: @border_color
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
def configure_dimensions
|
67
|
+
@legends_height = @axes.plots.size * per_legend_height
|
68
|
+
@legends_width = 0.2 * @axes.width
|
69
|
+
@height = @legends_height + top_margin + bottom_margin
|
70
|
+
@width = @legends_width + left_margin + right_margin
|
71
|
+
end
|
72
|
+
|
73
|
+
def configure_legends
|
74
|
+
@axes.plots.each_with_index do |plot, count|
|
75
|
+
next unless plot.label != ''
|
76
|
+
|
77
|
+
@legends << Rubyplot::Artist::Legend.new(
|
78
|
+
self,
|
79
|
+
@axes,
|
80
|
+
text: plot.label,
|
81
|
+
color: plot.color,
|
82
|
+
abs_x: @abs_x + left_margin,
|
83
|
+
abs_y: @abs_y + count * per_legend_height + top_margin
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end # class LegendBox
|
88
|
+
end # module Artist
|
89
|
+
end # module Rubyplot
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
class Line2D < Artist::Base
|
4
|
+
# rubocop:disable Metrics/ParameterLists
|
5
|
+
def initialize(owner,abs_x1:,abs_y1:,abs_x2:,abs_y2:,color: '#000000',
|
6
|
+
stroke_opacity: 0.0, stroke_width: 2.0)
|
7
|
+
@owner = owner
|
8
|
+
@abs_x1 = abs_x1
|
9
|
+
@abs_y1 = abs_y1
|
10
|
+
@abs_x2 = abs_x2
|
11
|
+
@abs_y2 = abs_y2
|
12
|
+
@color = color
|
13
|
+
@stroke_opacity = stroke_opacity
|
14
|
+
@stroke_width = stroke_width
|
15
|
+
end
|
16
|
+
# rubocop:enable Metrics/ParameterLists
|
17
|
+
|
18
|
+
def draw
|
19
|
+
Rubyplot.backend.draw_line(x1: @abs_x1, y1: @abs_y1, x2: @abs_x2, y2: @abs_y2,
|
20
|
+
stroke_width: @stroke_width)
|
21
|
+
end
|
22
|
+
end # class Line2D
|
23
|
+
end # class Artist
|
24
|
+
end # module Rubyplot
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require_relative 'plot/base'
|
2
|
+
require_relative 'plot/scatter'
|
3
|
+
require_relative 'plot/line'
|
4
|
+
require_relative 'plot/bar'
|
5
|
+
require_relative 'plot/multi_bars'
|
6
|
+
require_relative 'plot/stacked_bar'
|
7
|
+
require_relative 'plot/multi_stacked_bar'
|
8
|
+
require_relative 'plot/bubble'
|
9
|
+
require_relative 'plot/area'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Rubyplot
|
2
|
+
module Artist
|
3
|
+
module Plot
|
4
|
+
class Area < Artist::Plot::Base
|
5
|
+
attr_accessor :sorted_data
|
6
|
+
|
7
|
+
def initialize(*)
|
8
|
+
super
|
9
|
+
@sorted_data = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def data x_values, y_values=[]
|
13
|
+
y_values = Array.new(x_values.size) { |i| i } if y_values.empty?
|
14
|
+
x_values.sort! if @sorted_data
|
15
|
+
super(x_values, y_values)
|
16
|
+
end
|
17
|
+
|
18
|
+
def draw
|
19
|
+
poly_points = []
|
20
|
+
@normalized_data[:y_values].each_with_index do |iy, idx_y|
|
21
|
+
ix = @normalized_data[:x_values][idx_y]
|
22
|
+
abs_x = ix * @axes.x_axis.length + @axes.abs_x + @axes.y_axis_margin
|
23
|
+
abs_y = (@axes.y_axis.length - iy * @axes.y_axis.length) + @axes.abs_y
|
24
|
+
poly_points << [abs_x, abs_y]
|
25
|
+
end
|
26
|
+
poly_points << [@axes.x_axis.abs_x2, @axes.origin[1] - @axes.x_axis.stroke_width]
|
27
|
+
poly_points << [@axes.origin[0], @axes.origin[1] - @axes.x_axis.stroke_width]
|
28
|
+
Rubyplot::Artist::Polygon.new(
|
29
|
+
self,
|
30
|
+
coords: poly_points,
|
31
|
+
color: @data[:color],
|
32
|
+
fill_opacity: 0.3
|
33
|
+
).draw
|
34
|
+
end
|
35
|
+
end # class Area
|
36
|
+
end # module Plot
|
37
|
+
end # module Artist
|
38
|
+
end # module Rubyplot
|