p5rb 0.0.2 → 0.0.3
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/lib/p5rb.rb +52 -6
- data/p5rb.gemspec +3 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b79ebfd6c7fa06d28955e916d1dd8c40f550eac344f03b7eaf65f6281c3bed2f
|
4
|
+
data.tar.gz: f2b2555f10efd15b009e146dc232a3b947514960cb81c81487bc0c8d39e205e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f7ccdcb0a16223887864366aeb2957adb705d8a96bbb60f51195bda826acad9e4a7a67ae925e82f5e7f35c4fdfca2641fac32eb560e8c7d01c9ae280760e008
|
7
|
+
data.tar.gz: ee31129a27f4073937c6bb5c2bdffbcc41c9b1ae29ccb425ee7d49b1bbcca391747461899544e21bd30557d0c1fa51d5f4460d5b62f410de580fa3b01909cc72
|
data/lib/p5rb.rb
CHANGED
@@ -34,7 +34,7 @@ module P5
|
|
34
34
|
@buffer.push "ellipse(#{args.join ?,})"
|
35
35
|
end
|
36
36
|
def fill color, alpha = nil
|
37
|
-
@buffer.push "fill(#{color
|
37
|
+
@buffer.push "fill(#{color}#{", #{alpha}" if alpha})"
|
38
38
|
end
|
39
39
|
def rect x, y, w, h, fill: nil
|
40
40
|
(@buffer.push "push()"; fill fill) if fill
|
@@ -50,6 +50,12 @@ module P5
|
|
50
50
|
def textAlign *args
|
51
51
|
@buffer.push "textAlign(#{args.join ", "})"
|
52
52
|
end
|
53
|
+
def textWidth text
|
54
|
+
@buffer.push "textWidth(#{text.inspect})"
|
55
|
+
end
|
56
|
+
def textAscent text
|
57
|
+
@buffer.push "textAscent(#{text.inspect})"
|
58
|
+
end
|
53
59
|
def text text, x, y, fill: nil
|
54
60
|
(@buffer.push "push()"; fill fill) if fill
|
55
61
|
@buffer.push "text(#{text.inspect}, #{x}, #{y})"
|
@@ -106,7 +112,8 @@ module P5
|
|
106
112
|
end
|
107
113
|
end
|
108
114
|
end
|
109
|
-
def
|
115
|
+
def plot_bar_grouped data
|
116
|
+
# TODO: this is currently pretty much hardcoded for a time dates charting
|
110
117
|
cls = data.values.flat_map(&:keys).uniq.sort
|
111
118
|
size = cls.size + 1
|
112
119
|
from, to = data.keys.minmax
|
@@ -115,15 +122,53 @@ module P5
|
|
115
122
|
setup do
|
116
123
|
noStroke
|
117
124
|
textAlign :CENTER
|
118
|
-
cls.each_with_index{ |_, i| text _, 50+400/(size-2)*i, 25, fill: %w{ red green blue }[i] }
|
125
|
+
cls.each_with_index{ |_, i| text _, 50+400/(size-2)*i, 25, fill: %w{ 'red' 'green' 'blue' }[i] }
|
119
126
|
textAlign :RIGHT, :TOP
|
120
127
|
(from..to).each do |date|
|
121
128
|
y = map date.ajd.to_i, from.ajd.to_i, to.ajd.to_i, 50, 450
|
122
129
|
text date.strftime("%m-%d"), 45, y
|
123
|
-
rect 50, y, map(data.fetch(date,{})[cls[0]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "red"
|
124
|
-
rect 50, "#{y}+#{400/(to-from)/size}", map(data.fetch(date,{})[cls[1]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "green"
|
125
|
-
rect 50, "#{y}+#{800/(to-from)/size}", map(data.fetch(date,{})[cls[2]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "blue"
|
130
|
+
rect 50, y, map(data.fetch(date,{})[cls[0]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "'red'"
|
131
|
+
rect 50, "#{y}+#{400/(to-from)/size}", map(data.fetch(date,{})[cls[1]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "'green'"
|
132
|
+
rect 50, "#{y}+#{800/(to-from)/size}", map(data.fetch(date,{})[cls[2]]||0, 0, max, 0, 400), 400/(to-from)/size, fill: "'blue'"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
def plot_bar_stacked data, names, colorize
|
138
|
+
count = {}
|
139
|
+
max = data.map do |_, day|
|
140
|
+
day.each{ |k,v| count[k] ||= 0; count[k] += v }.map(&:last).reduce :+
|
141
|
+
end.max
|
142
|
+
pairs = {}
|
143
|
+
data.each_cons(2) do |(_, day1), (_, day2)|
|
144
|
+
(day1.map(&:first) & day2.map(&:first)).each{ |_| pairs[_] ||= 0; pairs[_] += 1 }
|
145
|
+
end
|
146
|
+
require "pcbr"
|
147
|
+
require "set"
|
148
|
+
pcbr = PCBR.new
|
149
|
+
count.max_by(colorize){ |k,v| v }.each{ |k,v| pcbr.store k, [-v, pairs[k]||0] }
|
150
|
+
top = pcbr.sorted
|
151
|
+
size = 500
|
152
|
+
P5 size, size do
|
153
|
+
setup do
|
154
|
+
noStroke
|
155
|
+
textAlign :RIGHT, :TOP
|
156
|
+
border = 25
|
157
|
+
left = "#{border} + textWidth(\"00-00 - 00-00\") + 5"
|
158
|
+
data.each_with_index do |(bin, day), i|
|
159
|
+
y1 = map i, 0, data.size, border, size-border
|
160
|
+
y2 = map i+1, 0, data.size, border, size-border
|
161
|
+
text bin, "#{left} - 5", y1
|
162
|
+
pos = 0
|
163
|
+
day.sort_by{ |k,| top.index(k) || top.size }.each do |k, v|
|
164
|
+
rect \
|
165
|
+
map(pos, 0, max, left, size-border), y1,
|
166
|
+
map(v, 0, max, 0, "#{size}-#{border}-(#{left})"), "#{y2}-#{y1}",
|
167
|
+
fill: top.include?(k) ? "color('hsl(#{(((3-Math.sqrt(5))*180 * top.index(k)) % 360).round}, 75%, 75%)')" : "color('hsl(0, 0%, 75%)')"
|
168
|
+
pos += v
|
169
|
+
end
|
126
170
|
end
|
171
|
+
top.each_with_index{ |id, i| text names[id].inspect[1..-2], size-border, "#{border} + textAscent('X') * #{i}", fill: "color('hsl(#{(((3-Math.sqrt(5))*180 * top.index(id)) % 360).round}, 75%, 75%)')" }
|
127
172
|
end
|
128
173
|
end
|
129
174
|
end
|
@@ -135,6 +180,7 @@ def P5 width, height, &block
|
|
135
180
|
<<~HEREDOC
|
136
181
|
<html>
|
137
182
|
<head>
|
183
|
+
<meta charset="UTF-8">
|
138
184
|
<script src="https://github.com/processing/p5.js/releases/download/v1.4.2/p5.min.js"></script>
|
139
185
|
<script>
|
140
186
|
function setup() {
|
data/p5rb.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "p5rb"
|
3
|
-
spec.version = "0.0.
|
3
|
+
spec.version = "0.0.3"
|
4
4
|
spec.summary = "Ruby DSL for p5.js"
|
5
5
|
|
6
6
|
spec.author = "Victor Maslov aka Nakilon"
|
@@ -8,5 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.license = "MIT"
|
9
9
|
spec.metadata = {"source_code_uri" => "https://github.com/nakilon/p5rb"}
|
10
10
|
|
11
|
+
spec.add_dependency "pcbr"
|
12
|
+
|
11
13
|
spec.files = %w{ LICENSE p5rb.gemspec lib/p5rb.rb }
|
12
14
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p5rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Maslov aka Nakilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
12
|
-
dependencies:
|
11
|
+
date: 2022-12-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pcbr
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description:
|
14
28
|
email: nakilon@gmail.com
|
15
29
|
executables: []
|