minichart 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +54 -8
- data/lib/minichart.rb +3 -0
- data/lib/minichart/base.rb +13 -4
- data/lib/minichart/charts/area_chart.rb +8 -4
- data/lib/minichart/charts/bar_chart.rb +4 -3
- data/lib/minichart/charts/line_chart.rb +3 -2
- data/lib/minichart/leds/horizontal_status_leds.rb +43 -0
- data/lib/minichart/leds/leds.rb +17 -0
- data/lib/minichart/leds/vertical_status_leds.rb +49 -0
- data/lib/minichart/meters/horizontal_bar_meter.rb +6 -5
- data/lib/minichart/meters/meter.rb +3 -4
- data/lib/minichart/meters/vertical_bar_meter.rb +6 -5
- data/lib/minichart/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 133646d3a37d8994e640a03eebd3a631f608e1decfd7c5666271dc07c4acbbc0
|
4
|
+
data.tar.gz: b4dd484bd550a26b8ef2f7be811a79a1cefe79dd0c6b13e5ebbe5d13a2bc1f63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f7e5d813fc8cccf069494ef14ac4b4c0db59147b3f1467e064b33d411833387da6589484a7bbba578846e632161a944063ce87f5f1225ee020629473b89ec2f
|
7
|
+
data.tar.gz: 37cc2233dae92905239c27ee4ae70c6d18b15b9fd0813f0ee9d6d99a894553cb501da3f3f321dbbcfa032d1e2c0e4442bba72fe87d42c7c0c5aebc06560366f6
|
data/README.md
CHANGED
@@ -16,6 +16,8 @@ Create SVG mini charts with Ruby
|
|
16
16
|
* [Area Chart](#area-chart)
|
17
17
|
* [Horizontal Bar Meter](#horizontal-bar-meter)
|
18
18
|
* [Vertical Bar Meter](#vertical-bar-meter)
|
19
|
+
* [Horizontal Status Leds](#horizontal-status-leds)
|
20
|
+
* [Vertical Status Leds](#vertical-status-leds)
|
19
21
|
* [Configuration](#configuration)
|
20
22
|
* [Class-level default options](#class-level-default-options)
|
21
23
|
* [Instance initialization options](#instance-initialization-options)
|
@@ -23,6 +25,7 @@ Create SVG mini charts with Ruby
|
|
23
25
|
* [Options Reference](#options-reference)
|
24
26
|
* [Basic Options](#basic-options)
|
25
27
|
* [Meter Options](#meter-options)
|
28
|
+
* [Leds Options](#leds-options)
|
26
29
|
* [Examples](#examples)
|
27
30
|
|
28
31
|
|
@@ -87,8 +90,8 @@ The objects returned from all the mini chart classes are [Victor::SVG][2] object
|
|
87
90
|
<img src='examples/line_chart.svg' align='right' width=300>
|
88
91
|
|
89
92
|
```ruby
|
90
|
-
LineChart.new
|
91
|
-
|
93
|
+
LineChart.new [10, 30, 20, 40, 30], background: '#eee',
|
94
|
+
height: 50, width: 250, color: 'green'
|
92
95
|
```
|
93
96
|
|
94
97
|
### Bar Chart
|
@@ -96,8 +99,8 @@ LineChart.new data, height: 50, background: '#eee',
|
|
96
99
|
<img src='examples/bar_chart.svg' align='right' width=300>
|
97
100
|
|
98
101
|
```ruby
|
99
|
-
BarChart.new
|
100
|
-
|
102
|
+
BarChart.new [10, 30, 20, 40, 30], background: '#eee',
|
103
|
+
height: 50, width: 250, color: 'green'
|
101
104
|
```
|
102
105
|
|
103
106
|
### Area Chart
|
@@ -105,8 +108,8 @@ BarChart.new data, height: 50, background: '#eee',
|
|
105
108
|
<img src='examples/area_chart.svg' align='right' width=300>
|
106
109
|
|
107
110
|
```ruby
|
108
|
-
AreaChart.new
|
109
|
-
|
111
|
+
AreaChart.new [10, 30, 20, 40, 30], background: '#eee',
|
112
|
+
height: 50, width: 250, color: 'green'
|
110
113
|
```
|
111
114
|
|
112
115
|
### Horizontal Bar Meter
|
@@ -122,7 +125,7 @@ negative = HorizontalBarMeter.new -80,
|
|
122
125
|
|
123
126
|
dual = HorizontalBarMeter.new 80,
|
124
127
|
height: 20, width: 250, background: '#99f', color: 'blue',
|
125
|
-
mode: :dual,
|
128
|
+
mode: :dual, notches: [0]
|
126
129
|
```
|
127
130
|
|
128
131
|
Meter charts support [additional options](#meter-options).
|
@@ -140,11 +143,33 @@ negative = VerticalBarMeter.new -80,
|
|
140
143
|
|
141
144
|
dual = VerticalBarMeter.new 80,
|
142
145
|
width: 20, height: 250, background: '#99f', color: 'blue',
|
143
|
-
mode: :dual,
|
146
|
+
mode: :dual, notches: [0]
|
144
147
|
```
|
145
148
|
|
146
149
|
Meter charts support [additional options](#meter-options).
|
147
150
|
|
151
|
+
### Horizontal Status Leds
|
152
|
+
|
153
|
+
<img src='examples/horizontal_status_leds.svg' align='right' width=150>
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
HorizontalStatusLeds.new [1,1,-1,0,1,1,1,1,1,-1,-1,1],
|
157
|
+
background: '#ccc'
|
158
|
+
```
|
159
|
+
|
160
|
+
Led charts support [additional options](#leds-options).
|
161
|
+
|
162
|
+
### Vertical Status Leds
|
163
|
+
|
164
|
+
<img src='examples/vertical_status_leds.svg' align='right' width=25>
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
VerticalStatusLeds.new [1,1,1,1,-1,1,-1,1,0,1],
|
168
|
+
background: '#ccc'
|
169
|
+
```
|
170
|
+
|
171
|
+
Led charts support [additional options](#leds-options).
|
172
|
+
|
148
173
|
|
149
174
|
## Configuration
|
150
175
|
|
@@ -211,6 +236,10 @@ Line stroke width. This has a different effect in different chart types.
|
|
211
236
|
|
212
237
|
CSS Style hash to apply to the entire SVG.
|
213
238
|
|
239
|
+
#### padding
|
240
|
+
|
241
|
+
Chart padding in pixels.
|
242
|
+
|
214
243
|
|
215
244
|
### Meter Options
|
216
245
|
|
@@ -253,6 +282,23 @@ Thickness of the clipping indicator.
|
|
253
282
|
|
254
283
|
Color of the clipping indicator.
|
255
284
|
|
285
|
+
### Leds Options
|
286
|
+
|
287
|
+
Leds charts support these options in additon to the basic options (excluding
|
288
|
+
the `color` option):
|
289
|
+
|
290
|
+
#### positive_color
|
291
|
+
|
292
|
+
Color to use when the value is greater than 0.
|
293
|
+
|
294
|
+
#### negative_color
|
295
|
+
|
296
|
+
Color to use when the value is less than 0.
|
297
|
+
|
298
|
+
#### neutral_color
|
299
|
+
|
300
|
+
Color to use when the value is 0 or nil.
|
301
|
+
|
256
302
|
## Examples
|
257
303
|
|
258
304
|
See more examples (code and SVG output) in the [examples folder][1].
|
data/lib/minichart.rb
CHANGED
@@ -8,5 +8,8 @@ require 'minichart/charts/area_chart'
|
|
8
8
|
require 'minichart/meters/meter'
|
9
9
|
require 'minichart/meters/vertical_bar_meter'
|
10
10
|
require 'minichart/meters/horizontal_bar_meter'
|
11
|
+
require 'minichart/leds/leds'
|
12
|
+
require 'minichart/leds/horizontal_status_leds'
|
13
|
+
require 'minichart/leds/vertical_status_leds'
|
11
14
|
|
12
15
|
require 'byebug' if ENV['BYEBUG']
|
data/lib/minichart/base.rb
CHANGED
@@ -11,7 +11,8 @@ module Minichart
|
|
11
11
|
width: 300,
|
12
12
|
stroke: 2,
|
13
13
|
style: {},
|
14
|
-
color: '#66f'
|
14
|
+
color: '#66f',
|
15
|
+
padding: 10,
|
15
16
|
}
|
16
17
|
end
|
17
18
|
|
@@ -33,7 +34,7 @@ module Minichart
|
|
33
34
|
|
34
35
|
super viewBox: viewbox, style: options[:style]
|
35
36
|
element :rect, x: 0, y: 0,
|
36
|
-
width:
|
37
|
+
width: full_width, height: full_height,
|
37
38
|
fill: options[:background], stroke_width: 0
|
38
39
|
|
39
40
|
clip_path_id = IDGenerator.next
|
@@ -47,13 +48,21 @@ module Minichart
|
|
47
48
|
def setup_clip_path(id)
|
48
49
|
element :defs do
|
49
50
|
element :clipPath, id: id do
|
50
|
-
element :rect, width:
|
51
|
+
element :rect, width: full_width, height: full_height
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
56
|
def viewbox
|
56
|
-
"0 0 #{
|
57
|
+
"0 0 #{full_width} #{full_height}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def full_height
|
61
|
+
options[:height] + options[:padding] * 2
|
62
|
+
end
|
63
|
+
|
64
|
+
def full_width
|
65
|
+
options[:width] + options[:padding] * 2
|
57
66
|
end
|
58
67
|
|
59
68
|
def build
|
@@ -5,21 +5,25 @@ module Minichart
|
|
5
5
|
stroke: options[:color],
|
6
6
|
stroke_width: options[:stroke],
|
7
7
|
stroke_linejoin: :round,
|
8
|
+
stroke_linecap: :round,
|
8
9
|
points: points
|
9
10
|
end
|
10
11
|
|
11
12
|
protected
|
12
13
|
|
13
14
|
def points
|
14
|
-
|
15
|
+
first_point = "#{options[:padding]},#{options[:height] + options[:padding]}"
|
16
|
+
result = [first_point]
|
15
17
|
|
16
18
|
inverted_points.each do |point|
|
17
|
-
x = options[:width] *point[0]
|
18
|
-
y = options[:height] * point[1]
|
19
|
+
x = options[:width] * point[0] + options[:padding]
|
20
|
+
y = options[:height] * point[1] + options[:padding]
|
19
21
|
result << "#{x},#{y}"
|
20
22
|
end
|
21
23
|
|
22
|
-
result << "#{options[:width]},#{options[:height]}"
|
24
|
+
result << "#{options[:width] + options[:padding]},#{options[:height] + options[:padding]}"
|
25
|
+
result << first_point
|
26
|
+
|
23
27
|
|
24
28
|
result
|
25
29
|
end
|
@@ -15,10 +15,11 @@ module Minichart
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def bar_options(x, y)
|
18
|
-
y = y * options[:height]
|
19
|
-
|
18
|
+
y = y * options[:height] + options[:padding]
|
19
|
+
|
20
|
+
bar_height = options[:height] - y + options[:padding]
|
20
21
|
{
|
21
|
-
x: x * options[:width],
|
22
|
+
x: x * options[:width] + options[:padding],
|
22
23
|
y: y,
|
23
24
|
width: bar_width,
|
24
25
|
height: bar_height,
|
@@ -5,6 +5,7 @@ module Minichart
|
|
5
5
|
stroke: options[:color],
|
6
6
|
stroke_width: options[:stroke],
|
7
7
|
stroke_linejoin: :round,
|
8
|
+
stroke_linecap: :round,
|
8
9
|
points: points
|
9
10
|
end
|
10
11
|
|
@@ -13,8 +14,8 @@ module Minichart
|
|
13
14
|
def points
|
14
15
|
result = []
|
15
16
|
inverted_points.each do |point|
|
16
|
-
x = options[:width] * point[0]
|
17
|
-
y = options[:height] * point[1]
|
17
|
+
x = options[:width] * point[0] + options[:padding]
|
18
|
+
y = options[:height] * point[1] + options[:padding]
|
18
19
|
result << "#{x},#{y}"
|
19
20
|
end
|
20
21
|
result
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Minichart
|
2
|
+
class HorizontalStatusLeds < Leds
|
3
|
+
class << self
|
4
|
+
def defaults
|
5
|
+
leds_defaults.merge width: 300, height: 50
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def build
|
10
|
+
data.each_with_index do |value, i|
|
11
|
+
element :rect, bar_options(value, i)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def bar_width
|
18
|
+
@bar_width ||= options[:width] / data.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def bar_options(value, i)
|
22
|
+
color = if value == 0 or !value
|
23
|
+
:neutral_color
|
24
|
+
elsif value > 0
|
25
|
+
:positive_color
|
26
|
+
else
|
27
|
+
:negative_color
|
28
|
+
end
|
29
|
+
|
30
|
+
{
|
31
|
+
x: (options[:padding] + i * bar_width),
|
32
|
+
y: options[:padding],
|
33
|
+
width: bar_width,
|
34
|
+
height: options[:height],
|
35
|
+
style: {
|
36
|
+
fill: options[color],
|
37
|
+
stroke_width: options[:stroke],
|
38
|
+
stroke: options[:background]
|
39
|
+
}
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Minichart
|
2
|
+
# Base class for led charts
|
3
|
+
class Leds < Base
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def leds_defaults
|
7
|
+
@meter_defaults ||= {
|
8
|
+
positive_color: '#6f6',
|
9
|
+
negative_color: '#f66',
|
10
|
+
neutral_color: '#eee',
|
11
|
+
padding: 2,
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Minichart
|
2
|
+
class VerticalStatusLeds < Leds
|
3
|
+
class << self
|
4
|
+
def defaults
|
5
|
+
leds_defaults.merge width: 50, height: 300
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def build
|
10
|
+
data.each_with_index do |value, i|
|
11
|
+
element :rect, bar_options(value, i)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def points
|
18
|
+
@points ||= data.size
|
19
|
+
end
|
20
|
+
|
21
|
+
def bar_height
|
22
|
+
@bar_height ||= options[:height] / points
|
23
|
+
end
|
24
|
+
|
25
|
+
def bar_options(value, i)
|
26
|
+
y = options[:padding] + (points - i - 1) * bar_height
|
27
|
+
|
28
|
+
color = if value == 0 or !value
|
29
|
+
:neutral_color
|
30
|
+
elsif value > 0
|
31
|
+
:positive_color
|
32
|
+
else
|
33
|
+
:negative_color
|
34
|
+
end
|
35
|
+
|
36
|
+
{
|
37
|
+
x: options[:padding],
|
38
|
+
y: y,
|
39
|
+
width: options[:width],
|
40
|
+
height: bar_height,
|
41
|
+
style: {
|
42
|
+
fill: options[color],
|
43
|
+
stroke_width: options[:stroke],
|
44
|
+
stroke: options[:background]
|
45
|
+
}
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -19,7 +19,7 @@ module Minichart
|
|
19
19
|
x2 = x_for clamped_value
|
20
20
|
x = [x1, x2].min
|
21
21
|
|
22
|
-
element :rect, x: x, y:
|
22
|
+
element :rect, x: x, y: options[:padding], height: options[:height],
|
23
23
|
width: bar_width, style: style
|
24
24
|
end
|
25
25
|
|
@@ -44,7 +44,8 @@ module Minichart
|
|
44
44
|
def draw_vertical_line(target_value, color:, stroke:)
|
45
45
|
x = x_for target_value
|
46
46
|
|
47
|
-
element :line, x1: x, x2: x,
|
47
|
+
element :line, x1: x, x2: x,
|
48
|
+
y1: options[:padding], y2: options[:height] + options[:padding],
|
48
49
|
stroke: color, stroke_width: stroke
|
49
50
|
end
|
50
51
|
|
@@ -65,15 +66,15 @@ module Minichart
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def x_for(target_value)
|
68
|
-
result = target_value.abs / options[:max].to_f * options[:width]
|
69
|
+
result = target_value.abs / options[:max].to_f * options[:width] + options[:padding]
|
69
70
|
|
70
71
|
case mode
|
71
72
|
when :positive
|
72
73
|
result
|
73
74
|
when :negative
|
74
|
-
|
75
|
+
full_width - result
|
75
76
|
when :dual
|
76
|
-
target_value / options[:max].to_f * half_width + half_width
|
77
|
+
target_value / options[:max].to_f * half_width + half_width + options[:padding]
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
@@ -5,19 +5,18 @@ module Minichart
|
|
5
5
|
class << self
|
6
6
|
def meter_defaults
|
7
7
|
@meter_defaults ||= {
|
8
|
-
height: 50,
|
9
8
|
max: 100,
|
10
9
|
notches: [],
|
11
|
-
notch_thickness:
|
10
|
+
notch_thickness: 4,
|
12
11
|
notch_color: 'black',
|
13
12
|
clipping_indicator: false,
|
14
|
-
clipping_indicator_thickness:
|
13
|
+
clipping_indicator_thickness: 4,
|
15
14
|
clipping_indicator_color: 'yellow',
|
15
|
+
padding: 2,
|
16
16
|
}
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
20
|
protected
|
22
21
|
|
23
22
|
def value
|
@@ -19,7 +19,7 @@ module Minichart
|
|
19
19
|
y2 = y_for clamped_value
|
20
20
|
y = [y1, y2].min
|
21
21
|
|
22
|
-
element :rect, x:
|
22
|
+
element :rect, x: options[:padding], y: y, height: bar_height,
|
23
23
|
width: options[:width], style: style
|
24
24
|
end
|
25
25
|
|
@@ -44,7 +44,8 @@ module Minichart
|
|
44
44
|
def draw_horizontal_line(target_value, color:, stroke:)
|
45
45
|
y = y_for target_value
|
46
46
|
|
47
|
-
element :line, x1:
|
47
|
+
element :line, x1: options[:padding], x2: options[:width] + options[:padding],
|
48
|
+
y1: y, y2: y,
|
48
49
|
stroke: color, stroke_width: stroke
|
49
50
|
end
|
50
51
|
|
@@ -65,15 +66,15 @@ module Minichart
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def y_for(target_value)
|
68
|
-
result = target_value.abs / options[:max].to_f * options[:height]
|
69
|
+
result = target_value.abs / options[:max].to_f * options[:height] + options[:padding]
|
69
70
|
|
70
71
|
case mode
|
71
72
|
when :positive
|
72
|
-
|
73
|
+
full_height - result
|
73
74
|
when :negative
|
74
75
|
result
|
75
76
|
when :dual
|
76
|
-
options[:height] - (target_value / options[:max].to_f * half_height + half_height)
|
77
|
+
options[:height] - (target_value / options[:max].to_f * half_height + half_height) + options[:padding]
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
data/lib/minichart/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minichart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: victor
|
@@ -38,6 +38,9 @@ files:
|
|
38
38
|
- lib/minichart/charts/chart.rb
|
39
39
|
- lib/minichart/charts/line_chart.rb
|
40
40
|
- lib/minichart/id_generator.rb
|
41
|
+
- lib/minichart/leds/horizontal_status_leds.rb
|
42
|
+
- lib/minichart/leds/leds.rb
|
43
|
+
- lib/minichart/leds/vertical_status_leds.rb
|
41
44
|
- lib/minichart/meters/horizontal_bar_meter.rb
|
42
45
|
- lib/minichart/meters/meter.rb
|
43
46
|
- lib/minichart/meters/vertical_bar_meter.rb
|