gruff 0.18.0 → 0.19.0
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/.devcontainer/devcontainer.json +26 -0
- data/.github/workflows/ci.yml +5 -5
- data/CHANGELOG.md +6 -0
- data/README.md +1 -1
- data/gruff.gemspec +0 -1
- data/lib/gruff/base.rb +2 -1
- data/lib/gruff/bezier.rb +4 -7
- data/lib/gruff/dot.rb +1 -1
- data/lib/gruff/line.rb +18 -16
- data/lib/gruff/mini/bar.rb +1 -1
- data/lib/gruff/mini/pie.rb +2 -2
- data/lib/gruff/net.rb +10 -2
- data/lib/gruff/renderer/bezier.rb +1 -1
- data/lib/gruff/renderer/circle.rb +3 -3
- data/lib/gruff/renderer/dash_line.rb +1 -1
- data/lib/gruff/renderer/dot.rb +1 -1
- data/lib/gruff/renderer/line.rb +1 -1
- data/lib/gruff/renderer/polygon.rb +1 -1
- data/lib/gruff/renderer/polyline.rb +4 -2
- data/lib/gruff/scatter.rb +3 -3
- data/lib/gruff/stacked_bar.rb +1 -1
- data/lib/gruff/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2f6636a49ad24d67ee6768f20edc4e1143debd5629c09578d94e876d6597438
|
4
|
+
data.tar.gz: 42b5270bb3d229e74a5be1951c6b3b653a6e7a1e9048e8119547ba8317c2a22d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e91c1727af0b81f8ee30caa3b2c04573932bcf6a2571750194d7fe50b92a6c93bc9ca5c44713b188968967911b60b510b0152cfe51446e9388dd52193fcc8db4
|
7
|
+
data.tar.gz: 9d67bdab5440eee69d770df5f4f1ccb8d1e53e2f163af4312237a90d67fd0fe7f8dfea7bd97b373828c957ccfeca09edc853c35c8bf1bfd789e8b9dd3e2bc05d
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
2
|
+
// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.0/containers/docker-existing-dockerfile
|
3
|
+
{
|
4
|
+
"name": "Existing Dockerfile",
|
5
|
+
|
6
|
+
// Sets the run context to one level up instead of the .devcontainer folder.
|
7
|
+
"context": "..",
|
8
|
+
|
9
|
+
// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
|
10
|
+
"dockerFile": "../Dockerfile"
|
11
|
+
|
12
|
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
13
|
+
// "forwardPorts": [],
|
14
|
+
|
15
|
+
// Uncomment the next line to run commands after the container is created - for example installing curl.
|
16
|
+
// "postCreateCommand": "apt-get update && apt-get install -y curl",
|
17
|
+
|
18
|
+
// Uncomment when using a ptrace-based debugger like C++, Go, and Rust
|
19
|
+
// "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
|
20
|
+
|
21
|
+
// Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
|
22
|
+
// "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],
|
23
|
+
|
24
|
+
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
|
25
|
+
// "remoteUser": "vscode"
|
26
|
+
}
|
data/.github/workflows/ci.yml
CHANGED
@@ -11,7 +11,7 @@ permissions:
|
|
11
11
|
|
12
12
|
jobs:
|
13
13
|
lint:
|
14
|
-
runs-on: ubuntu-
|
14
|
+
runs-on: ubuntu-22.04
|
15
15
|
timeout-minutes: 20
|
16
16
|
name: Lint
|
17
17
|
steps:
|
@@ -31,13 +31,13 @@ jobs:
|
|
31
31
|
run: bundle exec rubocop
|
32
32
|
|
33
33
|
test-ruby:
|
34
|
-
runs-on: ubuntu-
|
34
|
+
runs-on: ubuntu-22.04
|
35
35
|
timeout-minutes: 20
|
36
36
|
strategy:
|
37
37
|
matrix:
|
38
38
|
ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1']
|
39
39
|
imagemagick-version:
|
40
|
-
- { full: 7.1.0-
|
40
|
+
- { full: 7.1.0-45, major-minor: '7.0' }
|
41
41
|
name: Ruby ${{ matrix.ruby-version }}
|
42
42
|
steps:
|
43
43
|
- uses: actions/checkout@v3
|
@@ -63,11 +63,11 @@ jobs:
|
|
63
63
|
run: bundle exec rake
|
64
64
|
|
65
65
|
test-jruby:
|
66
|
-
runs-on: ubuntu-
|
66
|
+
runs-on: ubuntu-22.04
|
67
67
|
timeout-minutes: 20
|
68
68
|
strategy:
|
69
69
|
matrix:
|
70
|
-
ruby-version: ['9.2.
|
70
|
+
ruby-version: ['9.2.21.0', '9.3.7.0']
|
71
71
|
name: JRuby ${{ matrix.ruby-version }}
|
72
72
|
steps:
|
73
73
|
- uses: actions/checkout@v3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.19.0
|
4
|
+
- Draw the graph starting from zero point by default (#609)
|
5
|
+
- Improve joints in Gruff::Net using polyline method (#608)
|
6
|
+
- Improve joints in Gruff::Line using polyline method (#607)
|
7
|
+
- Adjust default font size in Gruff::Mini::{Bar, Pie}
|
8
|
+
|
3
9
|
## 0.18.0
|
4
10
|
- Add Gruff::Bubble (#604)
|
5
11
|
- Rename Gruff::BoxPlot to Gruff::Box (#603)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Gruff Graphs
|
2
2
|
|
3
|
-
[](https://github.com/topfunky/gruff/actions/workflows/ci.yml)
|
4
4
|
[](https://badge.fury.io/rb/gruff)
|
5
5
|
|
6
6
|
A library for making beautiful graphs.
|
data/gruff.gemspec
CHANGED
@@ -17,7 +17,6 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.summary = 'Beautiful graphs for one or multiple datasets.'
|
18
18
|
s.license = 'MIT'
|
19
19
|
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
20
|
-
s.specification_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
21
20
|
|
22
21
|
if defined? JRUBY_VERSION
|
23
22
|
s.platform = 'java'
|
data/lib/gruff/base.rb
CHANGED
@@ -469,7 +469,8 @@ module Gruff
|
|
469
469
|
#
|
470
470
|
# Set it after you have given all your data to the graph object.
|
471
471
|
def minimum_value
|
472
|
-
|
472
|
+
min = [0.0, store.min.to_f].min
|
473
|
+
(@minimum_value || min).to_f
|
473
474
|
end
|
474
475
|
attr_writer :minimum_value
|
475
476
|
|
data/lib/gruff/bezier.rb
CHANGED
@@ -24,6 +24,9 @@ private
|
|
24
24
|
def draw_graph
|
25
25
|
x_increment = (@graph_width / (column_count - 1)).to_f
|
26
26
|
|
27
|
+
renderer_class = RUBY_PLATFORM == 'java' ? Gruff::Renderer::Polyline : Gruff::Renderer::Bezier
|
28
|
+
stroke_width = clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
29
|
+
|
27
30
|
store.norm_data.each do |data_row|
|
28
31
|
next if data_row[1].empty?
|
29
32
|
|
@@ -45,13 +48,7 @@ private
|
|
45
48
|
draw_label(new_x, index)
|
46
49
|
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
if RUBY_PLATFORM == 'java'
|
51
|
-
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
52
|
-
else
|
53
|
-
Gruff::Renderer::Bezier.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
54
|
-
end
|
51
|
+
renderer_class.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
55
52
|
end
|
56
53
|
end
|
57
54
|
end
|
data/lib/gruff/dot.rb
CHANGED
@@ -29,7 +29,7 @@ private
|
|
29
29
|
|
30
30
|
items_width = @graph_height / column_count
|
31
31
|
item_width = items_width * spacing_factor / store.length
|
32
|
-
padding = (items_width * (1 - spacing_factor)) / 2
|
32
|
+
padding = (items_width * (1 - spacing_factor)) / 2.0
|
33
33
|
|
34
34
|
store.norm_data.each_with_index do |data_row, row_index|
|
35
35
|
data_row.points.each_with_index do |data_point, point_index|
|
data/lib/gruff/line.rb
CHANGED
@@ -208,12 +208,15 @@ private
|
|
208
208
|
draw_vertical_reference_line(curr_reference_line) if curr_reference_line.key?(:index)
|
209
209
|
end
|
210
210
|
|
211
|
-
store.norm_data.
|
212
|
-
|
211
|
+
stroke_width = @line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 4.0), 5.0)
|
212
|
+
circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
213
213
|
|
214
|
-
|
214
|
+
store.norm_data.each do |data_row|
|
215
|
+
poly_points_group = [[]]
|
215
216
|
|
216
217
|
data_row.coordinates.each_with_index do |(x_data, y_data), index|
|
218
|
+
poly_points = poly_points_group.last
|
219
|
+
|
217
220
|
new_x = begin
|
218
221
|
if x_data.nil?
|
219
222
|
# use the old method: equally spaced points along the x-axis
|
@@ -224,28 +227,27 @@ private
|
|
224
227
|
end
|
225
228
|
draw_label_for_x_data(x_data, new_x, index)
|
226
229
|
|
227
|
-
unless y_data
|
228
|
-
|
230
|
+
unless y_data
|
231
|
+
# we can't draw a line for a null data point, we can still label the axis though.
|
232
|
+
# Split the polygonal line into separate groups of points for polyline.
|
233
|
+
poly_points_group << []
|
229
234
|
next
|
230
235
|
end
|
231
236
|
|
232
237
|
new_y = @graph_top + (@graph_height - (y_data * @graph_height))
|
233
238
|
|
234
|
-
|
235
|
-
|
236
|
-
circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
239
|
+
poly_points << new_x
|
240
|
+
poly_points << new_y
|
237
241
|
|
238
|
-
if
|
239
|
-
Gruff::Renderer::Line.new(renderer, color: data_row.color, width: stroke_width)
|
240
|
-
.render(prev_x, prev_y, new_x, new_y)
|
241
|
-
end
|
242
|
-
|
243
|
-
if one_point || !@hide_dots
|
242
|
+
if contains_one_point_only?(data_row) || !@hide_dots
|
244
243
|
Gruff::Renderer::Dot.new(renderer, @dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius)
|
245
244
|
end
|
245
|
+
end
|
246
246
|
|
247
|
-
|
248
|
-
|
247
|
+
unless @hide_lines
|
248
|
+
poly_points_group.each do |poly_points|
|
249
|
+
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: stroke_width).render(poly_points) unless poly_points.empty?
|
250
|
+
end
|
249
251
|
end
|
250
252
|
end
|
251
253
|
end
|
data/lib/gruff/mini/bar.rb
CHANGED
data/lib/gruff/mini/pie.rb
CHANGED
data/lib/gruff/net.rb
CHANGED
@@ -60,6 +60,8 @@ private
|
|
60
60
|
|
61
61
|
def draw_graph
|
62
62
|
store.norm_data.each do |data_row|
|
63
|
+
poly_points = []
|
64
|
+
|
63
65
|
data_row.points.each_with_index do |data_point, index|
|
64
66
|
next if data_point.nil?
|
65
67
|
|
@@ -67,6 +69,10 @@ private
|
|
67
69
|
point_distance = data_point * @radius
|
68
70
|
start_x = @center_x + (Math.sin(rad_pos) * point_distance)
|
69
71
|
start_y = @center_y - (Math.cos(rad_pos) * point_distance)
|
72
|
+
if poly_points.empty?
|
73
|
+
poly_points << start_x
|
74
|
+
poly_points << start_y
|
75
|
+
end
|
70
76
|
|
71
77
|
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
72
78
|
|
@@ -74,14 +80,16 @@ private
|
|
74
80
|
next_point_distance = data_row.points[next_index] * @radius
|
75
81
|
end_x = @center_x + (Math.sin(next_rad_pos) * next_point_distance)
|
76
82
|
end_y = @center_y - (Math.cos(next_rad_pos) * next_point_distance)
|
77
|
-
|
78
|
-
|
83
|
+
poly_points << end_x
|
84
|
+
poly_points << end_y
|
79
85
|
|
80
86
|
unless @hide_dots
|
81
87
|
circle_renderer = Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: @stroke_width)
|
82
88
|
circle_renderer.render(start_x, start_y, start_x - @circle_radius, start_y)
|
83
89
|
end
|
84
90
|
end
|
91
|
+
|
92
|
+
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: @stroke_width).render(poly_points) unless poly_points.empty?
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
@@ -11,8 +11,8 @@ module Gruff
|
|
11
11
|
|
12
12
|
def render(points)
|
13
13
|
@renderer.draw.push
|
14
|
-
@renderer.draw.stroke(@color)
|
15
14
|
@renderer.draw.stroke_width(@width)
|
15
|
+
@renderer.draw.stroke(@color)
|
16
16
|
@renderer.draw.fill_opacity(0.0)
|
17
17
|
@renderer.draw.bezier(*points)
|
18
18
|
@renderer.draw.pop
|
@@ -12,10 +12,10 @@ module Gruff
|
|
12
12
|
|
13
13
|
def render(origin_x, origin_y, perim_x, perim_y)
|
14
14
|
@renderer.draw.push
|
15
|
-
@renderer.draw.fill(@color)
|
16
|
-
@renderer.draw.fill_opacity(@opacity)
|
17
|
-
@renderer.draw.stroke(@color)
|
18
15
|
@renderer.draw.stroke_width(@width)
|
16
|
+
@renderer.draw.stroke(@color)
|
17
|
+
@renderer.draw.fill_opacity(@opacity)
|
18
|
+
@renderer.draw.fill(@color)
|
19
19
|
@renderer.draw.circle(origin_x, origin_y, perim_x, perim_y)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
@@ -13,9 +13,9 @@ module Gruff
|
|
13
13
|
def render(start_x, start_y, end_x, end_y)
|
14
14
|
@renderer.draw.push
|
15
15
|
@renderer.draw.stroke_color(@color)
|
16
|
-
@renderer.draw.fill_opacity(0.0)
|
17
16
|
@renderer.draw.stroke_dasharray(*@dasharray)
|
18
17
|
@renderer.draw.stroke_width(@width)
|
18
|
+
@renderer.draw.fill_opacity(0.0)
|
19
19
|
@renderer.draw.line(start_x, start_y, end_x, end_y)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -15,8 +15,8 @@ module Gruff
|
|
15
15
|
@renderer.draw.push
|
16
16
|
@renderer.draw.stroke_width(@width)
|
17
17
|
@renderer.draw.stroke(@color)
|
18
|
-
@renderer.draw.fill(@color)
|
19
18
|
@renderer.draw.fill_opacity(@opacity)
|
19
|
+
@renderer.draw.fill(@color)
|
20
20
|
case @style.to_sym
|
21
21
|
when :square
|
22
22
|
square(new_x, new_y, radius)
|
data/lib/gruff/renderer/line.rb
CHANGED
@@ -30,9 +30,9 @@ module Gruff
|
|
30
30
|
end
|
31
31
|
|
32
32
|
@renderer.draw.push
|
33
|
+
@renderer.draw.stroke_width(@width) if @width
|
33
34
|
@renderer.draw.stroke(color)
|
34
35
|
@renderer.draw.fill(color)
|
35
|
-
@renderer.draw.stroke_width(@width) if @width
|
36
36
|
@renderer.draw.line(start_x, start_y, end_x, end_y)
|
37
37
|
@renderer.draw.pop
|
38
38
|
end
|
@@ -14,8 +14,8 @@ module Gruff
|
|
14
14
|
@renderer.draw.push
|
15
15
|
@renderer.draw.stroke_width(@width)
|
16
16
|
@renderer.draw.stroke(@color)
|
17
|
-
@renderer.draw.fill(@color)
|
18
17
|
@renderer.draw.fill_opacity(@opacity)
|
18
|
+
@renderer.draw.fill(@color)
|
19
19
|
@renderer.draw.polygon(*points)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
@@ -3,17 +3,19 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::Polyline
|
6
|
-
def initialize(renderer, color:, width:)
|
6
|
+
def initialize(renderer, color:, width: 1.0, linejoin: 'bevel')
|
7
7
|
@renderer = renderer
|
8
8
|
@color = color
|
9
9
|
@width = width
|
10
|
+
@linejoin = linejoin
|
10
11
|
end
|
11
12
|
|
12
13
|
def render(points)
|
13
14
|
@renderer.draw.push
|
15
|
+
@renderer.draw.stroke_linejoin(@linejoin)
|
16
|
+
@renderer.draw.stroke_width(@width)
|
14
17
|
@renderer.draw.stroke(@color)
|
15
18
|
@renderer.draw.fill('transparent')
|
16
|
-
@renderer.draw.stroke_width(@width)
|
17
19
|
@renderer.draw.polyline(*points)
|
18
20
|
@renderer.draw.pop
|
19
21
|
end
|
data/lib/gruff/scatter.rb
CHANGED
@@ -142,6 +142,9 @@ private
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def draw_graph
|
145
|
+
stroke_width = @stroke_width || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
146
|
+
circle_radius = @circle_radius || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 2.5), 5.0)
|
147
|
+
|
145
148
|
store.norm_data.each do |data_row|
|
146
149
|
data_row.coordinates.each do |x_value, y_value|
|
147
150
|
next if y_value.nil? || x_value.nil?
|
@@ -149,9 +152,6 @@ private
|
|
149
152
|
new_x = @graph_left + (x_value * @graph_width)
|
150
153
|
new_y = @graph_bottom - (y_value * @graph_height)
|
151
154
|
|
152
|
-
# Reset each time to avoid thin-line errors
|
153
|
-
stroke_width = @stroke_width || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
154
|
-
circle_radius = @circle_radius || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 2.5), 5.0)
|
155
155
|
Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: stroke_width).render(new_x, new_y, new_x - circle_radius, new_y)
|
156
156
|
end
|
157
157
|
end
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -78,7 +78,7 @@ private
|
|
78
78
|
#
|
79
79
|
# Columns sit stacked.
|
80
80
|
bar_width = @graph_width / column_count
|
81
|
-
padding = (bar_width * (1 - @bar_spacing)) / 2
|
81
|
+
padding = (bar_width * (1 - @bar_spacing)) / 2.0
|
82
82
|
|
83
83
|
# Setup the BarConversion Object
|
84
84
|
conversion = Gruff::BarConversion.new(
|
data/lib/gruff/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoffrey Grosenbach
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-08-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rmagick
|
@@ -144,6 +144,7 @@ executables: []
|
|
144
144
|
extensions: []
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
|
+
- ".devcontainer/devcontainer.json"
|
147
148
|
- ".editorconfig"
|
148
149
|
- ".github/ISSUE_TEMPLATE.md"
|
149
150
|
- ".github/workflows/ci.yml"
|