gruff 0.13.0-java → 0.16.0-java
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/.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 +15 -32
- 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: 03a1c8455536dad68e5d325a51416807d32595aee6e4be75ef214c1b00e0df06
|
4
|
+
data.tar.gz: fa90b50b714c8464f6b82260f3ec9598edb57cf4b03ffcb8b451083e9bd1a307
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 180bb66623c99daf3b89febea4059ed0d1f655b5fdee1da046e78174d0ea2efdf26e3fbc1de8bc18765cf9ab5cbe8bc52cb22fd01deeb25c377210340506bcfb
|
7
|
+
data.tar.gz: 05e9d6c86ee5ccee8bafc37fe1843f041f2a91f82aa7bbfb77c11fd05c9d64b2192d4b56dfaff0bc3f5d5db925e13ba057179843e0265873d2e1c7659582235d
|
@@ -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
|

|
128
128
|
|
129
|
+
### Box plot
|
130
|
+
|
131
|
+

|
132
|
+
|
133
|
+
### Candlestick
|
134
|
+
|
135
|
+

|
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
|