youplot 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/lib/youplot.rb +1 -1
- data/lib/youplot/backends/processing.rb +24 -0
- data/lib/youplot/backends/unicode_plot_backend.rb +34 -13
- data/lib/youplot/command.rb +25 -15
- data/lib/youplot/command/parser.rb +19 -3
- data/lib/youplot/{preprocessing.rb → dsv_reader.rb} +2 -15
- data/lib/youplot/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9b1c58784cb37da38b1c2bb24ed86961a8d7ddded67899027f9ed725ece7ea8
|
4
|
+
data.tar.gz: 1f6050c3707ecaa29997ee1af65b440ba016f0eacb47d4dc9c38a15ac59afe9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d62aeed65f6a4692f115453b085cb926d54a8efe184e7e39250a720235f8d13ecf8ec2026099ae2d6a3ab17385e607a9281fff1b12e81914314c991bf471ca4
|
7
|
+
data.tar.gz: 1e3ad16f26c8287385fdee2a4f13626b369a58c63f2d488678b02bdc15dfb7e22a8b8ed0f31c1d6324537c59aa86c4367187f01e6080f6bf51f3bedade3905f4
|
data/lib/youplot.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module YouPlot
|
4
|
+
# plotting functions.
|
5
|
+
module Backends
|
6
|
+
module Processing
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def count_values(arr)
|
10
|
+
# tally was added in Ruby 2.7
|
11
|
+
if Enumerable.method_defined? :tally
|
12
|
+
arr.tally
|
13
|
+
else
|
14
|
+
# https://github.com/marcandre/backports
|
15
|
+
arr.each_with_object(Hash.new(0)) { |item, res| res[item] += 1 }
|
16
|
+
.tap { |h| h.default = nil }
|
17
|
+
end
|
18
|
+
.sort { |a, b| a[1] <=> b[1] }
|
19
|
+
.reverse
|
20
|
+
.transpose
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'processing'
|
3
4
|
require 'unicode_plot'
|
4
5
|
|
5
6
|
module YouPlot
|
@@ -8,23 +9,33 @@ module YouPlot
|
|
8
9
|
module UnicodePlotBackend
|
9
10
|
module_function
|
10
11
|
|
11
|
-
def barplot(data, params, count: false)
|
12
|
+
def barplot(data, params, fmt = nil, count: false)
|
12
13
|
headers = data.headers
|
13
14
|
series = data.series
|
14
15
|
# `uplot count`
|
15
16
|
if count
|
16
|
-
series =
|
17
|
+
series = Processing.count_values(series[0])
|
17
18
|
params.title = headers[0] if headers
|
18
19
|
end
|
19
20
|
if series.size == 1
|
20
|
-
# If there is only one series
|
21
|
+
# If there is only one series.use the line number for label.
|
21
22
|
params.title ||= headers[0] if headers
|
22
23
|
labels = Array.new(series[0].size) { |i| (i + 1).to_s }
|
23
24
|
values = series[0].map(&:to_f)
|
24
25
|
else
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
# If there are 2 or more series...
|
27
|
+
if fmt == 'yx'
|
28
|
+
# assume that the first 2 series are the y and x series respectively.
|
29
|
+
x_col = 1
|
30
|
+
y_col = 0
|
31
|
+
else
|
32
|
+
# assume that the first 2 series are the x and y series respectively.
|
33
|
+
x_col = 0
|
34
|
+
y_col = 1
|
35
|
+
end
|
36
|
+
params.title ||= headers[y_col] if headers
|
37
|
+
labels = series[x_col]
|
38
|
+
values = series[y_col].map(&:to_f)
|
28
39
|
end
|
29
40
|
UnicodePlot.barplot(labels, values, **params.to_hc)
|
30
41
|
end
|
@@ -37,7 +48,7 @@ module YouPlot
|
|
37
48
|
UnicodePlot.histogram(values, **params.to_hc)
|
38
49
|
end
|
39
50
|
|
40
|
-
def line(data, params)
|
51
|
+
def line(data, params, fmt = nil)
|
41
52
|
headers = data.headers
|
42
53
|
series = data.series
|
43
54
|
if series.size == 1
|
@@ -46,14 +57,22 @@ module YouPlot
|
|
46
57
|
y = series[0].map(&:to_f)
|
47
58
|
UnicodePlot.lineplot(y, **params.to_hc)
|
48
59
|
else
|
49
|
-
# If there are 2 or more series
|
50
|
-
|
60
|
+
# If there are 2 or more series...
|
61
|
+
if fmt == 'yx'
|
62
|
+
# assume that the first 2 series are the y and x series respectively.
|
63
|
+
x_col = 1
|
64
|
+
y_col = 0
|
65
|
+
else
|
66
|
+
# assume that the first 2 series are the x and y series respectively.
|
67
|
+
x_col = 0
|
68
|
+
y_col = 1
|
69
|
+
end
|
51
70
|
if headers
|
52
|
-
params.xlabel ||= headers[
|
53
|
-
params.ylabel ||= headers[
|
71
|
+
params.xlabel ||= headers[x_col]
|
72
|
+
params.ylabel ||= headers[y_col]
|
54
73
|
end
|
55
|
-
x = series[
|
56
|
-
y = series[
|
74
|
+
x = series[x_col].map(&:to_f)
|
75
|
+
y = series[y_col].map(&:to_f)
|
57
76
|
UnicodePlot.lineplot(x, y, **params.to_hc)
|
58
77
|
end
|
59
78
|
end
|
@@ -102,6 +121,8 @@ module YouPlot
|
|
102
121
|
plot_xyy(data, method1, params)
|
103
122
|
when 'xyxy'
|
104
123
|
plot_xyxy(data, method1, params)
|
124
|
+
when 'yx'
|
125
|
+
raise "Incorrect format: #{fmt}"
|
105
126
|
else
|
106
127
|
raise "Unknown format: #{fmt}"
|
107
128
|
end
|
data/lib/youplot/command.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
3
|
+
require_relative 'dsv_reader'
|
4
4
|
require_relative 'command/parser'
|
5
5
|
|
6
6
|
# FIXME
|
@@ -30,6 +30,7 @@ module YouPlot
|
|
30
30
|
pass = parser.pass
|
31
31
|
output = parser.output
|
32
32
|
fmt = parser.fmt
|
33
|
+
@encoding = parser.encoding
|
33
34
|
@debug = parser.debug
|
34
35
|
|
35
36
|
if command == :colors
|
@@ -39,18 +40,37 @@ module YouPlot
|
|
39
40
|
|
40
41
|
# Sometimes the input file does not end with a newline code.
|
41
42
|
while (input = Kernel.gets(nil))
|
42
|
-
|
43
|
-
|
43
|
+
|
44
|
+
# Pass the input to subsequent pipelines
|
45
|
+
case pass
|
46
|
+
when IO
|
47
|
+
pass.print(input)
|
48
|
+
else
|
49
|
+
if pass
|
50
|
+
File.open(pass, 'w') do |f|
|
51
|
+
f.print(input)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
@data = if @encoding
|
57
|
+
input2 = input.dup.force_encoding(@encoding).encode('utf-8')
|
58
|
+
DSVReader.input(input2, delimiter, headers, transpose)
|
59
|
+
else
|
60
|
+
DSVReader.input(input, delimiter, headers, transpose)
|
61
|
+
end
|
62
|
+
|
44
63
|
pp @data if @debug
|
64
|
+
|
45
65
|
plot = case command
|
46
66
|
when :bar, :barplot
|
47
|
-
@backend.barplot(data, params)
|
67
|
+
@backend.barplot(data, params, fmt)
|
48
68
|
when :count, :c
|
49
69
|
@backend.barplot(data, params, count: true)
|
50
70
|
when :hist, :histogram
|
51
71
|
@backend.histogram(data, params)
|
52
72
|
when :line, :lineplot
|
53
|
-
@backend.line(data, params)
|
73
|
+
@backend.line(data, params, fmt)
|
54
74
|
when :lines, :lineplots
|
55
75
|
@backend.lines(data, params, fmt)
|
56
76
|
when :scatter, :s
|
@@ -72,16 +92,6 @@ module YouPlot
|
|
72
92
|
end
|
73
93
|
end
|
74
94
|
|
75
|
-
case pass
|
76
|
-
when IO
|
77
|
-
pass.print(input)
|
78
|
-
else
|
79
|
-
if pass
|
80
|
-
File.open(pass, 'w') do |f|
|
81
|
-
f.print(input)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
95
|
end
|
86
96
|
end
|
87
97
|
end
|
@@ -8,7 +8,7 @@ module YouPlot
|
|
8
8
|
class Parser
|
9
9
|
attr_reader :command, :params,
|
10
10
|
:delimiter, :transpose, :headers, :pass, :output, :fmt,
|
11
|
-
:color_names, :debug
|
11
|
+
:color_names, :encoding, :debug
|
12
12
|
|
13
13
|
def initialize
|
14
14
|
@command = nil
|
@@ -20,6 +20,7 @@ module YouPlot
|
|
20
20
|
@pass = false
|
21
21
|
@output = $stderr
|
22
22
|
@fmt = 'xyy'
|
23
|
+
@encoding = nil
|
23
24
|
@debug = false
|
24
25
|
@color_names = false
|
25
26
|
end
|
@@ -78,8 +79,8 @@ module YouPlot
|
|
78
79
|
opt.on('--[no-]labels', TrueClass, 'hide the labels') do |v|
|
79
80
|
params.labels = v
|
80
81
|
end
|
81
|
-
opt.on('--
|
82
|
-
@
|
82
|
+
opt.on('--encoding VAL', String, 'Specify the input encoding') do |v|
|
83
|
+
@encoding = v
|
83
84
|
end
|
84
85
|
# Optparse adds the help option, but it doesn't show up in usage.
|
85
86
|
# This is why you need the code below.
|
@@ -161,6 +162,9 @@ module YouPlot
|
|
161
162
|
parser.on_head('--xscale VAL', String, 'axis scaling') do |v|
|
162
163
|
params.xscale = v
|
163
164
|
end
|
165
|
+
parser.on_head('--fmt VAL', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
|
166
|
+
@fmt = v
|
167
|
+
end
|
164
168
|
|
165
169
|
when :count, :c
|
166
170
|
parser.on_head('--symbol VAL', String, 'character to be used to plot the bars') do |v|
|
@@ -188,6 +192,9 @@ module YouPlot
|
|
188
192
|
parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
|
189
193
|
params.ylim = v.take(2)
|
190
194
|
end
|
195
|
+
parser.on_head('--fmt VAL', String, 'xy : header is like x, y...', 'yx : header is like y, x...') do |v|
|
196
|
+
@fmt = v
|
197
|
+
end
|
191
198
|
|
192
199
|
when :lineplots, :lines
|
193
200
|
parser.on_head('--canvas VAL', String) do |v|
|
@@ -199,6 +206,9 @@ module YouPlot
|
|
199
206
|
parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
|
200
207
|
params.ylim = v.take(2)
|
201
208
|
end
|
209
|
+
parser.on_head('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...', 'xyy : header is like x, y1, y2, y2, y3...') do |v|
|
210
|
+
@fmt = v
|
211
|
+
end
|
202
212
|
|
203
213
|
when :scatter, :s
|
204
214
|
parser.on_head('--canvas VAL', String) do |v|
|
@@ -210,6 +220,9 @@ module YouPlot
|
|
210
220
|
parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
|
211
221
|
params.ylim = v.take(2)
|
212
222
|
end
|
223
|
+
parser.on_head('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...', 'xyy : header is like x, y1, y2, y2, y3...') do |v|
|
224
|
+
@fmt = v
|
225
|
+
end
|
213
226
|
|
214
227
|
when :density, :d
|
215
228
|
parser.on_head('--grid', TrueClass) do |v|
|
@@ -221,6 +234,9 @@ module YouPlot
|
|
221
234
|
parser.on_head('--ylim VAL', Array, 'plotting range for the y coordinate') do |v|
|
222
235
|
params.ylim = v.take(2)
|
223
236
|
end
|
237
|
+
parser.on('--fmt VAL', String, 'xyxy : header is like x1, y1, x2, y2, x3, y3...', 'xyy : header is like x, y1, y2, y2, y3...') do |v|
|
238
|
+
@fmt = v
|
239
|
+
end
|
224
240
|
|
225
241
|
when :boxplot, :box
|
226
242
|
parser.on_head('--xlim VAL', Array, 'plotting range for the x coordinate') do |v|
|
@@ -3,7 +3,8 @@
|
|
3
3
|
require 'csv'
|
4
4
|
|
5
5
|
module YouPlot
|
6
|
-
|
6
|
+
# Read and interpret Delimiter-separated values format file or stream.
|
7
|
+
module DSVReader
|
7
8
|
module_function
|
8
9
|
|
9
10
|
def input(input, delimiter, headers, transpose)
|
@@ -68,19 +69,5 @@ module YouPlot
|
|
68
69
|
transpose2(arr)
|
69
70
|
end
|
70
71
|
end
|
71
|
-
|
72
|
-
def count_values(arr)
|
73
|
-
# tally was added in Ruby 2.7
|
74
|
-
if Enumerable.method_defined? :tally
|
75
|
-
arr.tally
|
76
|
-
else
|
77
|
-
# https://github.com/marcandre/backports
|
78
|
-
arr.each_with_object(Hash.new(0)) { |item, res| res[item] += 1 }
|
79
|
-
.tap { |h| h.default = nil }
|
80
|
-
end
|
81
|
-
.sort { |a, b| a[1] <=> b[1] }
|
82
|
-
.reverse
|
83
|
-
.transpose
|
84
|
-
end
|
85
72
|
end
|
86
73
|
end
|
data/lib/youplot/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: youplot
|
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
|
- kojix2
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: unicode_plot
|
@@ -109,11 +109,12 @@ files:
|
|
109
109
|
- exe/uplot
|
110
110
|
- exe/youplot
|
111
111
|
- lib/youplot.rb
|
112
|
+
- lib/youplot/backends/processing.rb
|
112
113
|
- lib/youplot/backends/unicode_plot_backend.rb
|
113
114
|
- lib/youplot/command.rb
|
114
115
|
- lib/youplot/command/params.rb
|
115
116
|
- lib/youplot/command/parser.rb
|
116
|
-
- lib/youplot/
|
117
|
+
- lib/youplot/dsv_reader.rb
|
117
118
|
- lib/youplot/version.rb
|
118
119
|
homepage: https://github.com/kojix2/youplot
|
119
120
|
licenses:
|