gruff 0.13.0 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +79 -0
- data/.rubocop.yml +29 -31
- data/CHANGELOG.md +43 -0
- data/README.md +11 -5
- data/gruff.gemspec +8 -10
- data/lib/gruff/accumulator_bar.rb +4 -2
- data/lib/gruff/area.rb +9 -12
- data/lib/gruff/bar.rb +46 -31
- data/lib/gruff/base.rb +236 -207
- data/lib/gruff/bezier.rb +6 -8
- data/lib/gruff/box_plot.rb +174 -0
- data/lib/gruff/bullet.rb +17 -16
- data/lib/gruff/candlestick.rb +112 -0
- data/lib/gruff/dot.rb +14 -14
- data/lib/gruff/font.rb +42 -0
- data/lib/gruff/helper/bar_conversion.rb +5 -5
- data/lib/gruff/helper/bar_value_label.rb +26 -20
- data/lib/gruff/helper/stacked_mixin.rb +4 -3
- data/lib/gruff/histogram.rb +9 -7
- data/lib/gruff/line.rb +96 -83
- data/lib/gruff/mini/bar.rb +9 -6
- data/lib/gruff/mini/legend.rb +16 -12
- data/lib/gruff/mini/pie.rb +9 -6
- data/lib/gruff/mini/side_bar.rb +9 -6
- data/lib/gruff/net.rb +16 -22
- data/lib/gruff/patch/rmagick.rb +0 -1
- data/lib/gruff/patch/string.rb +2 -1
- data/lib/gruff/pie.rb +42 -75
- data/lib/gruff/renderer/bezier.rb +8 -9
- data/lib/gruff/renderer/circle.rb +8 -9
- data/lib/gruff/renderer/dash_line.rb +10 -10
- data/lib/gruff/renderer/dot.rb +15 -14
- data/lib/gruff/renderer/ellipse.rb +8 -9
- data/lib/gruff/renderer/line.rb +8 -11
- data/lib/gruff/renderer/polygon.rb +9 -10
- data/lib/gruff/renderer/polyline.rb +8 -9
- data/lib/gruff/renderer/rectangle.rb +11 -8
- data/lib/gruff/renderer/renderer.rb +25 -40
- data/lib/gruff/renderer/text.rb +21 -37
- data/lib/gruff/scatter.rb +86 -85
- data/lib/gruff/side_bar.rb +50 -37
- data/lib/gruff/side_stacked_bar.rb +26 -35
- data/lib/gruff/spider.rb +52 -28
- data/lib/gruff/stacked_area.rb +20 -16
- data/lib/gruff/stacked_bar.rb +44 -22
- data/lib/gruff/store/store.rb +6 -10
- data/lib/gruff/store/xy_data.rb +2 -0
- data/lib/gruff/themes.rb +6 -6
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +70 -57
- data/rails_generators/gruff/templates/controller.rb +1 -1
- metadata +25 -28
- data/.rubocop_todo.yml +0 -182
- data/.travis.yml +0 -23
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/lib/gruff/photo_bar.rb +0 -93
- data/lib/gruff/scene.rb +0 -198
- data/lib/gruff/store/custom_data.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53adc2df58a382381368665252e0e5862ea81ebd4d513e051058aa5369d379a9
|
4
|
+
data.tar.gz: a63a2c06b2f2f936a8ee663463248faab871cab07ba0b58c84febff858b3c08b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa57dd19908889380ac8ca2ad4cf3d71da6349370ad90e6c318a01aa79fafd1db9c09f5118a4c1034aaad026596d5b42e4a5837e69ea360909c2b16e054c9fa3
|
7
|
+
data.tar.gz: 2334380acbf92ebbcfc2c090912e79955c5d28f6de4fb714f2d30de4a4b2b922fd661068641a4057ba94bba90359bd1a45fd0902da941e246df93bf80e9a0601
|
@@ -0,0 +1,79 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
lint:
|
11
|
+
runs-on: ubuntu-20.04
|
12
|
+
timeout-minutes: 20
|
13
|
+
name: Lint
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v3
|
16
|
+
with:
|
17
|
+
ref: ${{ github.event.pull_request.head.sha }}
|
18
|
+
- name: Set up Ruby 2.5
|
19
|
+
uses: ruby/setup-ruby@master
|
20
|
+
with:
|
21
|
+
ruby-version: '2.5'
|
22
|
+
bundler-cache: true
|
23
|
+
- name: Install dependencies
|
24
|
+
run: bundle install --path=vendor/bundle --jobs 4 --retry 3
|
25
|
+
- name: RuboCop Problem Matchers
|
26
|
+
uses: r7kamura/rubocop-problem-matchers-action@v1.1.0
|
27
|
+
- name: Run tests
|
28
|
+
run: bundle exec rubocop
|
29
|
+
|
30
|
+
test-ruby:
|
31
|
+
runs-on: ubuntu-20.04
|
32
|
+
timeout-minutes: 20
|
33
|
+
strategy:
|
34
|
+
matrix:
|
35
|
+
ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1']
|
36
|
+
imagemagick-version:
|
37
|
+
- { full: 7.1.0-31, major-minor: '7.0' }
|
38
|
+
name: Ruby ${{ matrix.ruby-version }}
|
39
|
+
steps:
|
40
|
+
- uses: actions/checkout@v3
|
41
|
+
- name: Cache ImageMagick
|
42
|
+
uses: actions/cache@v3
|
43
|
+
with:
|
44
|
+
path: ./build-ImageMagick
|
45
|
+
key: v1-linux-imagemagick-${{ matrix.imagemagick-version.full }}
|
46
|
+
restore-keys: |
|
47
|
+
v1-linux-imagemagick-${{ matrix.imagemagick-version.full }}
|
48
|
+
- name: Install ImageMagick ${{ matrix.imagemagick-version.full }}
|
49
|
+
run: |
|
50
|
+
export IMAGEMAGICK_VERSION=${{ matrix.imagemagick-version.full }}
|
51
|
+
./before_install_linux.sh
|
52
|
+
- name: Set up Ruby
|
53
|
+
uses: ruby/setup-ruby@master
|
54
|
+
with:
|
55
|
+
ruby-version: ${{ matrix.ruby-version }}
|
56
|
+
bundler-cache: false
|
57
|
+
- name: Install dependencies
|
58
|
+
run: bundle install --path=vendor/bundle --jobs 4 --retry 3
|
59
|
+
- name: Run tests
|
60
|
+
run: bundle exec rake
|
61
|
+
|
62
|
+
test-jruby:
|
63
|
+
runs-on: ubuntu-20.04
|
64
|
+
timeout-minutes: 20
|
65
|
+
strategy:
|
66
|
+
matrix:
|
67
|
+
ruby-version: ['9.2.20.1', '9.3.4.0']
|
68
|
+
name: JRuby ${{ matrix.ruby-version }}
|
69
|
+
steps:
|
70
|
+
- uses: actions/checkout@v3
|
71
|
+
- name: Set up Ruby
|
72
|
+
uses: ruby/setup-ruby@master
|
73
|
+
with:
|
74
|
+
ruby-version: jruby-${{ matrix.ruby-version }}
|
75
|
+
bundler-cache: true
|
76
|
+
- name: Install dependencies
|
77
|
+
run: bundle install --path=vendor/bundle --jobs 4 --retry 3
|
78
|
+
- name: Run tests
|
79
|
+
run: bundle exec rake
|
data/.rubocop.yml
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rake
|
3
4
|
|
4
5
|
AllCops:
|
5
6
|
EnabledByDefault: true
|
6
|
-
TargetRubyVersion: 2.
|
7
|
+
TargetRubyVersion: 2.5
|
7
8
|
Exclude:
|
8
9
|
- 'vendor/bundle/**/*'
|
9
10
|
- 'rails_generators/gruff/**/*'
|
10
11
|
|
12
|
+
Metrics:
|
13
|
+
Enabled: false
|
14
|
+
|
11
15
|
Gemspec/OrderedDependencies:
|
12
16
|
Enabled: false
|
13
17
|
|
@@ -17,15 +21,9 @@ Gemspec/RequiredRubyVersion:
|
|
17
21
|
Layout/AccessModifierIndentation:
|
18
22
|
EnforcedStyle: outdent
|
19
23
|
|
20
|
-
Layout/ClassStructure:
|
21
|
-
Enabled: false
|
22
|
-
|
23
24
|
Layout/FirstMethodArgumentLineBreak:
|
24
25
|
Enabled: false
|
25
26
|
|
26
|
-
Layout/LeadingCommentSpace:
|
27
|
-
Enabled: false
|
28
|
-
|
29
27
|
Layout/LineLength:
|
30
28
|
Max: 150
|
31
29
|
|
@@ -35,22 +33,34 @@ Layout/MultilineMethodArgumentLineBreaks:
|
|
35
33
|
Layout/MultilineAssignmentLayout:
|
36
34
|
EnforcedStyle: same_line
|
37
35
|
|
38
|
-
|
36
|
+
Layout/RedundantLineBreak:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Layout/SingleLineBlockChain:
|
39
40
|
Enabled: false
|
40
41
|
|
41
42
|
Lint/ConstantResolution:
|
42
43
|
Enabled: false
|
43
44
|
|
45
|
+
Lint/FloatComparison:
|
46
|
+
Enabled: false
|
47
|
+
|
44
48
|
Lint/NumberConversion:
|
45
49
|
Enabled: false
|
46
50
|
|
47
|
-
|
51
|
+
Naming/MemoizedInstanceVariableName:
|
48
52
|
Enabled: false
|
49
53
|
|
50
|
-
|
54
|
+
Naming/MethodParameterName:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Naming/VariableNumber:
|
58
|
+
Enabled: false
|
59
|
+
|
60
|
+
Style/AccessorGrouping:
|
51
61
|
Enabled: false
|
52
62
|
|
53
|
-
Style/
|
63
|
+
Style/ClassAndModuleChildren:
|
54
64
|
Enabled: false
|
55
65
|
|
56
66
|
Style/ConstantVisibility:
|
@@ -62,15 +72,15 @@ Style/Copyright:
|
|
62
72
|
Style/Documentation:
|
63
73
|
Enabled: true
|
64
74
|
|
65
|
-
Style/
|
75
|
+
Style/DocumentationMethod:
|
76
|
+
Enabled: false
|
77
|
+
|
78
|
+
Style/DocumentDynamicEvalDefinition:
|
66
79
|
Enabled: false
|
67
80
|
|
68
81
|
Style/FormatString:
|
69
82
|
EnforcedStyle: sprintf
|
70
83
|
|
71
|
-
Style/FormatStringToken:
|
72
|
-
Enabled: false
|
73
|
-
|
74
84
|
Style/GuardClause:
|
75
85
|
Enabled: false
|
76
86
|
|
@@ -92,15 +102,9 @@ Style/MethodCallWithArgsParentheses:
|
|
92
102
|
Style/MissingElse:
|
93
103
|
Enabled: false
|
94
104
|
|
95
|
-
Style/MutableConstant:
|
96
|
-
Enabled: false
|
97
|
-
|
98
105
|
Style/Next:
|
99
106
|
Enabled: false
|
100
107
|
|
101
|
-
Style/NumericLiterals:
|
102
|
-
Enabled: false
|
103
|
-
|
104
108
|
Style/NumericPredicate:
|
105
109
|
Enabled: false
|
106
110
|
|
@@ -113,17 +117,11 @@ Style/RedundantBegin:
|
|
113
117
|
Style/SingleLineBlockParams:
|
114
118
|
Enabled: false
|
115
119
|
|
116
|
-
Style/SpecialGlobalVars:
|
117
|
-
Enabled: false
|
118
|
-
|
119
120
|
Style/StructInheritance:
|
120
121
|
Enabled: false
|
121
122
|
|
122
|
-
|
123
|
-
Enabled: false
|
124
|
-
|
125
|
-
Style/TernaryParentheses:
|
123
|
+
Performance/ChainArrayAllocation:
|
126
124
|
Enabled: false
|
127
125
|
|
128
|
-
Performance/
|
126
|
+
Performance/StringReplacement:
|
129
127
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,48 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.16.0
|
4
|
+
- Add Candlestick (#575)
|
5
|
+
- Add BoxPlot (#574)
|
6
|
+
- Raise exception if less data set was given in Gruff::Spider (#573)
|
7
|
+
- Adjust default label offset value in Gruff::Pie
|
8
|
+
- Remove has_left_labels from attribute (#571)
|
9
|
+
- Remove center_labels_over_point from attribute (#570)
|
10
|
+
- Adjust legend label / box position
|
11
|
+
- Fix right margin when truncate the label
|
12
|
+
- Adjust axis label position
|
13
|
+
- Adjust left label margin
|
14
|
+
- Fix axis label position with hide_line_markers
|
15
|
+
- Fix margin of value label in Bar/StackedBar (#568)
|
16
|
+
- Fix label position in Gruff::Spider (#567)
|
17
|
+
- Fix axis label position with legend_at_bottom
|
18
|
+
- Fix axis label position with hide_line_markers
|
19
|
+
- Refactor: Remove instance variable usage
|
20
|
+
- Remove Gruff::Scene (#566)
|
21
|
+
- Fix exception with zero value in StackBar (#565)
|
22
|
+
- Fix segment spacing in SideStackedBar (#564)
|
23
|
+
- Fix margin of value label in SideBar/SideStackedBar (#563)
|
24
|
+
- Raise exception if negative values were given in stacked graph (#562)
|
25
|
+
- Fix centering in value label position (#561)
|
26
|
+
- Fix duck typing support in Gruff::Histogram (#560)
|
27
|
+
- Fix start drawing position to top in Pie and enabled sort option by default (#559)
|
28
|
+
|
29
|
+
## 0.15.0
|
30
|
+
- Fix SideStackedBar which bars overlap on the coordinate axes if data contains 0 (#558)
|
31
|
+
- Lazy loading library to reduce memory usage (#556)
|
32
|
+
- Drop Ruby 2.4 support (#554)
|
33
|
+
- Fix sort drawing in Gruff::Line (#553)
|
34
|
+
- Fix color value handling in Line#dataxy method (#552)
|
35
|
+
|
36
|
+
## 0.14.0
|
37
|
+
- Update rails template (#547)
|
38
|
+
- Remove singleton in order to support multi-thread processing (#546)
|
39
|
+
- Fix bug in Gruff::Scatter that X coordinate value is wrong if set value in x_axis_increment (#534)
|
40
|
+
- Add marker_x_count attribute in Gruff::Line (#532)
|
41
|
+
- Add label_formatting attribute in Gruff::Pie (#531)
|
42
|
+
- Removed the ability to inject custom PieSlice classes from the outside (#530)
|
43
|
+
- Remove Gruff::PhotoBar (#513)
|
44
|
+
- Deprecate last_series_goes_on_bottom attribute in Gruff::StackedArea (#512)
|
45
|
+
|
3
46
|
## 0.13.0
|
4
47
|
- Allow to customize label value with lambda (#510)
|
5
48
|
- Rename enable_vertical_line_markers attribute to show_vertical_markers (#509)
|
data/README.md
CHANGED
@@ -126,6 +126,13 @@ In progress!
|
|
126
126
|
|
127
127
|
![Histogram chart](https://raw.github.com/topfunky/gruff/master/test/expected/histogram.png)
|
128
128
|
|
129
|
+
### Box plot
|
130
|
+
|
131
|
+
![Box plot](https://raw.github.com/topfunky/gruff/master/test/expected/box_plot.png)
|
132
|
+
|
133
|
+
### Candlestick
|
134
|
+
|
135
|
+
![Candlestick](https://raw.github.com/topfunky/gruff/master/test/expected/candlestick.png)
|
129
136
|
|
130
137
|
## Documentation
|
131
138
|
|
@@ -133,23 +140,22 @@ http://www.rubydoc.info/github/topfunky/gruff/frames
|
|
133
140
|
|
134
141
|
## Supported Ruby Versions
|
135
142
|
|
136
|
-
|
137
|
-
|
143
|
+
- Ruby 2.5 or later
|
144
|
+
- JRuby 9.2.x or later
|
138
145
|
|
139
146
|
## Development
|
140
147
|
1. Build docker image
|
141
148
|
```sh
|
142
|
-
$ ./docker
|
149
|
+
$ ./docker-build.sh
|
143
150
|
```
|
144
151
|
|
145
152
|
2. Launch docker image
|
146
153
|
```sh
|
147
|
-
$ ./docker
|
154
|
+
$ ./docker-launch.sh
|
148
155
|
```
|
149
156
|
|
150
157
|
3. Run tests
|
151
158
|
```sh
|
152
|
-
$ bundle install
|
153
159
|
$ bundle exec rake
|
154
160
|
```
|
155
161
|
|
data/gruff.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
lib = File.expand_path('lib')
|
@@ -10,12 +9,9 @@ Gem::Specification.new do |s|
|
|
10
9
|
s.name = 'gruff'
|
11
10
|
s.version = Gruff::VERSION
|
12
11
|
s.authors = ['Geoffrey Grosenbach', 'Uwe Kubosch']
|
13
|
-
s.date = Date.today.to_s
|
14
12
|
s.description = 'Beautiful graphs for one or multiple datasets. Can be used on websites or in documents.'
|
15
13
|
s.email = 'boss@topfunky.com'
|
16
|
-
s.files = `git ls-files`.split.
|
17
|
-
f =~ /^test|^docker|^Rakefile/
|
18
|
-
end
|
14
|
+
s.files = `git ls-files`.split.grep_v(/^test|^docker|^before_install_linux.sh|^Rakefile/i)
|
19
15
|
s.homepage = 'https://github.com/topfunky/gruff'
|
20
16
|
s.require_paths = %w[lib]
|
21
17
|
s.summary = 'Beautiful graphs for one or multiple datasets.'
|
@@ -28,16 +24,18 @@ Gem::Specification.new do |s|
|
|
28
24
|
s.platform = 'java'
|
29
25
|
s.add_dependency 'rmagick4j'
|
30
26
|
else
|
31
|
-
s.add_dependency 'rmagick'
|
32
|
-
s.add_development_dependency 'rubocop', '~> 1.
|
33
|
-
s.add_development_dependency 'rubocop-performance', '~> 1.
|
27
|
+
s.add_dependency 'rmagick', '>= 4.2'
|
28
|
+
s.add_development_dependency 'rubocop', '~> 1.27.0'
|
29
|
+
s.add_development_dependency 'rubocop-performance', '~> 1.13.3'
|
30
|
+
s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
34
31
|
end
|
35
32
|
s.add_dependency 'histogram'
|
36
|
-
s.required_ruby_version = '>= 2.
|
33
|
+
s.required_ruby_version = '>= 2.5.0'
|
37
34
|
|
38
35
|
s.add_development_dependency 'rake'
|
39
|
-
s.add_development_dependency 'parallel'
|
40
36
|
s.add_development_dependency 'minitest-reporters'
|
41
37
|
s.add_development_dependency 'simplecov'
|
42
38
|
s.add_development_dependency 'yard', '~> 0.9.25'
|
39
|
+
|
40
|
+
s.metadata['rubygems_mfa_required'] = 'true'
|
43
41
|
end
|
@@ -14,10 +14,12 @@
|
|
14
14
|
# g.write('accumulator_bar.png')
|
15
15
|
#
|
16
16
|
class Gruff::AccumulatorBar < Gruff::StackedBar
|
17
|
-
|
17
|
+
private
|
18
|
+
|
19
|
+
def setup_data
|
18
20
|
raise(Gruff::IncorrectNumberOfDatasetsException) unless store.length == 1
|
19
21
|
|
20
|
-
accum_array = store.data.first.points[0..-2].reduce([0]) { |a, v| a << a.last + v }
|
22
|
+
accum_array = store.data.first.points[0..-2].reduce([0]) { |a, v| a << (a.last + v) }
|
21
23
|
data 'Accumulator', accum_array
|
22
24
|
set_colors
|
23
25
|
store.reverse!
|
data/lib/gruff/area.rb
CHANGED
@@ -20,20 +20,17 @@ class Gruff::Area < Gruff::Base
|
|
20
20
|
# Specifies the stroke width in line around area graph. Default is +2.0+.
|
21
21
|
attr_writer :stroke_width
|
22
22
|
|
23
|
-
|
23
|
+
private
|
24
|
+
|
25
|
+
def initialize_attributes
|
24
26
|
super
|
25
27
|
@sorted_drawing = true
|
26
28
|
@fill_opacity = 0.85
|
27
29
|
@stroke_width = 2.0
|
28
30
|
end
|
29
|
-
private :initialize_ivars
|
30
|
-
|
31
|
-
def draw
|
32
|
-
super
|
33
|
-
|
34
|
-
return unless data_given?
|
35
31
|
|
36
|
-
|
32
|
+
def draw_graph
|
33
|
+
x_increment = @graph_width / (column_count - 1)
|
37
34
|
|
38
35
|
store.norm_data.each do |data_row|
|
39
36
|
poly_points = []
|
@@ -41,7 +38,7 @@ class Gruff::Area < Gruff::Base
|
|
41
38
|
data_row.points.each_with_index do |data_point, index|
|
42
39
|
# Use incremented x and scaled y
|
43
40
|
new_x = @graph_left + (x_increment * index)
|
44
|
-
new_y = @graph_top + (@graph_height - data_point * @graph_height)
|
41
|
+
new_y = @graph_top + (@graph_height - (data_point * @graph_height))
|
45
42
|
|
46
43
|
poly_points << new_x
|
47
44
|
poly_points << new_y
|
@@ -51,11 +48,11 @@ class Gruff::Area < Gruff::Base
|
|
51
48
|
|
52
49
|
# Add closing points, draw polygon
|
53
50
|
poly_points << @graph_right
|
54
|
-
poly_points << @graph_bottom - 1
|
51
|
+
poly_points << (@graph_bottom - 1)
|
55
52
|
poly_points << @graph_left
|
56
|
-
poly_points << @graph_bottom - 1
|
53
|
+
poly_points << (@graph_bottom - 1)
|
57
54
|
|
58
|
-
Gruff::Renderer::Polygon.new(color: data_row.color, width: @stroke_width, opacity: @fill_opacity).render(poly_points)
|
55
|
+
Gruff::Renderer::Polygon.new(renderer, color: data_row.color, width: @stroke_width, opacity: @fill_opacity).render(poly_points)
|
59
56
|
end
|
60
57
|
end
|
61
58
|
end
|
data/lib/gruff/bar.rb
CHANGED
@@ -33,7 +33,25 @@ class Gruff::Bar < Gruff::Base
|
|
33
33
|
# Prevent drawing of column labels below a bar graph. Default is +false+.
|
34
34
|
attr_writer :hide_labels
|
35
35
|
|
36
|
-
|
36
|
+
# Value to avoid completely overwriting the coordinate axis
|
37
|
+
AXIS_MARGIN = 0.5
|
38
|
+
private_constant :AXIS_MARGIN
|
39
|
+
|
40
|
+
# Can be used to adjust the spaces between the bars.
|
41
|
+
# Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
|
42
|
+
# and 1 means that each bars' width is nearly 0 (so each bar is a simple
|
43
|
+
# line with no x dimension).
|
44
|
+
#
|
45
|
+
# Default value is +0.9+.
|
46
|
+
def spacing_factor=(space_percent)
|
47
|
+
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' unless (space_percent >= 0) && (space_percent <= 1)
|
48
|
+
|
49
|
+
@spacing_factor = (1 - space_percent)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def initialize_attributes
|
37
55
|
super
|
38
56
|
@spacing_factor = 0.9
|
39
57
|
@group_spacing = 10
|
@@ -41,57 +59,52 @@ class Gruff::Bar < Gruff::Base
|
|
41
59
|
@show_labels_for_bar_values = false
|
42
60
|
@hide_labels = false
|
43
61
|
end
|
44
|
-
private :initialize_ivars
|
45
62
|
|
46
|
-
def
|
63
|
+
def setup_drawing
|
47
64
|
# Labels will be centered over the left of the bar if
|
48
65
|
# there are more labels than columns. This is basically the same
|
49
66
|
# as where it would be for a line graph.
|
50
67
|
@center_labels_over_point = (@labels.keys.length > column_count)
|
51
68
|
|
52
69
|
super
|
53
|
-
return unless data_given?
|
54
|
-
|
55
|
-
draw_bars
|
56
|
-
end
|
57
|
-
|
58
|
-
# Can be used to adjust the spaces between the bars.
|
59
|
-
# Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
|
60
|
-
# and 1 means that each bars' width is nearly 0 (so each bar is a simple
|
61
|
-
# line with no x dimension).
|
62
|
-
#
|
63
|
-
# Default value is +0.9+.
|
64
|
-
def spacing_factor=(space_percent)
|
65
|
-
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' unless (space_percent >= 0) && (space_percent <= 1)
|
66
|
-
|
67
|
-
@spacing_factor = (1 - space_percent)
|
68
70
|
end
|
69
71
|
|
70
|
-
protected
|
71
|
-
|
72
72
|
def hide_labels?
|
73
73
|
@hide_labels
|
74
74
|
end
|
75
75
|
|
76
76
|
def hide_left_label_area?
|
77
|
-
@hide_line_markers
|
77
|
+
@hide_line_markers && @y_axis_label.nil?
|
78
78
|
end
|
79
79
|
|
80
80
|
def hide_bottom_label_area?
|
81
|
-
hide_labels?
|
81
|
+
hide_labels? && @x_axis_label.nil? && @legend_at_bottom == false
|
82
82
|
end
|
83
83
|
|
84
|
-
|
85
|
-
|
84
|
+
def setup_graph_measurements
|
85
|
+
super
|
86
|
+
return if @hide_line_markers
|
87
|
+
|
88
|
+
if @show_labels_for_bar_values
|
89
|
+
proc_text_metrics = ->(text) { text_metrics(@marker_font, text) }
|
90
|
+
|
91
|
+
if maximum_value >= 0
|
92
|
+
_, metrics = Gruff::BarValueLabel.metrics(maximum_value, @label_formatting, proc_text_metrics)
|
93
|
+
@graph_top += metrics.height
|
94
|
+
end
|
86
95
|
|
87
|
-
|
96
|
+
@graph_height = @graph_bottom - @graph_top
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def draw_graph
|
88
101
|
# Setup spacing.
|
89
102
|
#
|
90
103
|
# Columns sit side-by-side.
|
91
104
|
@bar_spacing ||= @spacing_factor # space between the bars
|
92
105
|
|
93
|
-
bar_width = (@graph_width - calculate_spacing) / (column_count * store.length)
|
94
|
-
padding = (bar_width * (1 - @bar_spacing)) / 2
|
106
|
+
bar_width = (@graph_width - calculate_spacing) / (column_count * store.length)
|
107
|
+
padding = (bar_width * (1 - @bar_spacing)) / 2.0
|
95
108
|
|
96
109
|
# Setup the BarConversion Object
|
97
110
|
conversion = Gruff::BarConversion.new(
|
@@ -99,6 +112,8 @@ protected
|
|
99
112
|
minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
|
100
113
|
)
|
101
114
|
|
115
|
+
proc_text_metrics = ->(text) { text_metrics(@marker_font, text) }
|
116
|
+
|
102
117
|
# iterate over all normalised data
|
103
118
|
store.norm_data.each_with_index do |data_row, row_index|
|
104
119
|
data_row.points.each_with_index do |data_point, point_index|
|
@@ -107,12 +122,12 @@ protected
|
|
107
122
|
# Use incremented x and scaled y
|
108
123
|
# x
|
109
124
|
left_x = @graph_left + (bar_width * (row_index + point_index + ((store.length - 1) * point_index))) + padding + group_spacing
|
110
|
-
right_x = left_x + bar_width * @bar_spacing
|
125
|
+
right_x = left_x + (bar_width * @bar_spacing)
|
111
126
|
# y
|
112
127
|
left_y, right_y = conversion.get_top_bottom_scaled(data_point)
|
113
128
|
|
114
129
|
# create new bar
|
115
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
130
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: data_row.color)
|
116
131
|
rect_renderer.render(left_x, left_y - AXIS_MARGIN, right_x, right_y - AXIS_MARGIN)
|
117
132
|
|
118
133
|
# Calculate center based on bar_width and current row
|
@@ -122,8 +137,8 @@ protected
|
|
122
137
|
draw_label(label_center, point_index)
|
123
138
|
if @show_labels_for_bar_values
|
124
139
|
bar_value_label = Gruff::BarValueLabel::Bar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
|
125
|
-
bar_value_label.prepare_rendering(@label_formatting,
|
126
|
-
draw_value_label(x, y, text
|
140
|
+
bar_value_label.prepare_rendering(@label_formatting, proc_text_metrics) do |x, y, text, _text_width, text_height|
|
141
|
+
draw_value_label(bar_width * @bar_spacing, text_height, x, y, text)
|
127
142
|
end
|
128
143
|
end
|
129
144
|
end
|