gnutemplate 0.2.0.3 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94953b69a84fb220e788041a6294ea3b9f7fdbc1993e991bacb444a3d79e8039
4
- data.tar.gz: b17b4f40c87e76fa3c3f8e594d7608f4766af565b83cb14473ae1788f1888046
3
+ metadata.gz: b8702141a60cf55e1469b1dc3c614c61ae4e186b82528499b68539f8d26e5e99
4
+ data.tar.gz: d9e37d34538eff71b66ee6606792dc97a4a6b1af3d8f6f5c23ad156b4651a61c
5
5
  SHA512:
6
- metadata.gz: fd219a38376881c79437af60cd3c8f15b186b8b294f49f9c96bce1c9b53fbd46f4f87d31c6cb294586a220fecd6f16b78e4cc2adc781d2972b1e15c00c1f1424
7
- data.tar.gz: c810af85e9d96939f6b6110629b38209cb3392d945978a9bf13e8a441a06ef8e5e2cc4f4d48991a8c55b1b0ed02e7e1533e95a96020d54a0a880041c1958b9e1
6
+ metadata.gz: ee061e613587ab79811aaf9b3aa44841c4073963b0da073791e944696d0a582cba3ff4f985a7dea3d44ddd40e274f6d7b7b87dab1839da1192ddbb11cda9f742
7
+ data.tar.gz: 4a70f90c8c570cf6ba0bcb3bae0a85701feaab3b3dc829c0edf00c5758c4c15aea55f788df0e77ba4b9caa0e89c5d7e45cf109f5ba72cc831e8098b03e079aae
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gnutemplate
4
- VERSION = "0.2.0.3"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/gnutemplate.rb CHANGED
@@ -31,6 +31,24 @@ end
31
31
  module Gnutemplate
32
32
  class Error < StandardError; end
33
33
 
34
+
35
+ # settingはむずい
36
+ # ・全体はハッシュ
37
+ # ・基本は次のような指定
38
+ # settings[:style] = "fill solid"
39
+ # ・ハッシュを使う場合も。以下は、set :xtic, :rotate, by: rotate_xtics, scale: 0の表現怜
40
+ # settings[:xtic] = {rotate: nil, by: rotate_xtics, scale: 0}
41
+ # ・同じキー(例えばxtics)に複数指定たいときはリストにして渡す
42
+ # settings[:xtics] = ["#{xmin-xticinterval}, #{xticinterval}, #{xmax+xticinterval}" ,
43
+ # "rotate by #{rotate_xtics}"]
44
+ # ・リストの中を更にハッシュにすることも可能
45
+ # settings[:style] = [{data: nil, histogram: nil}, # set :style, :data, :histogram を表現
46
+ # {histogram: nil, cluster: nil, gap: 1}, # set :histogram, :cluster, gap: 1 を表現
47
+ # {fill: nil, solid: 1.0 - (alpha/100.0), border: -1}]
48
+
49
+
50
+ SubPlot = Struct.new(:args, :settings)
51
+
34
52
  def note_line(data)
35
53
  Numo.noteplot do
36
54
  set xtics: xtics
@@ -104,42 +122,40 @@ module Gnutemplate
104
122
  # 列データをmin, maxごとに分離する
105
123
  rows_min = (0...(rows.length)).to_a.map {|i| rows[i] if i % 2 == 0}.compact
106
124
  rows_max = (0...(rows.length)).to_a.map {|i| rows[i] if i % 2 == 1}.compact
107
-
108
- Numo.gnuplot do
109
- if !file.nil?
110
- set terminal: "gif"
111
- set output: file
112
- end
113
125
 
114
- if !xtics.nil?
115
- set xtics: xtics
116
- set :xtics, "rotate by 90"
117
- end
118
-
119
- xrange ||= (rows_min.map(&:to_a).flatten.compact.min)..(rows_max.map(&:to_a).flatten.compact.max)
120
- set xrange: xrange
121
- set :grid
122
- set style: :fill_solid
123
- set title: title if title
124
-
125
- ### キャンドルスティックを応用する
126
- # X軸, 太い所の最大値, 最大値, 最小値, 太い所の最小値
127
- # 今回は細い箇所は不要
128
- # X軸はこの場合配列にしなきゃだめ(to_a) これは癖をつけたほうが安全
126
+ settings = {}
127
+ args = []
129
128
 
130
- args = rows_min.zip(rows_max, titlenames).each.with_index.inject([]) do |result, ((mi, ma, t), i)|
131
- result += [xrange.to_a, mi.to_a, mi.to_a, ma.to_a, ma.to_a, {with: "candlesticks", fc_rgb: colors[i % 4], title: t} ]
132
- end
129
+ if !xtics.nil?
130
+ set[:xtics] = [xtics]
131
+ set[:xtics].push "rotate by 90"
132
+ end
133
133
 
134
- plot *args
134
+ xrange ||= (rows_min.map(&:to_a).flatten.compact.min)..(rows_max.map(&:to_a).flatten.compact.max)
135
+
136
+ set[:xrange] = xrange
137
+ set[:grid] = nil
138
+ set[:style] = :fill_solid
139
+ set[:title] = title if title
140
+
141
+ ### キャンドルスティックを応用する
142
+ # X軸, 太い所の最大値, 最大値, 最小値, 太い所の最小値
143
+ # 今回は細い箇所は不要
144
+ # X軸はこの場合配列にしなきゃだめ(to_a) これは癖をつけたほうが安全
145
+
146
+ args = rows_min.zip(rows_max, titlenames).each.with_index.inject([]) do |result, ((mi, ma, t), i)|
147
+ result += [xrange.to_a, mi.to_a, mi.to_a, ma.to_a, ma.to_a, {with: "candlesticks", fc_rgb: colors[i % 4], title: t} ]
135
148
  end
149
+
150
+ plot *args
151
+
136
152
  end
137
153
 
138
- # いずれかはここからargsを返せるようにする
154
+ # ここからsettings, argsを返せるようにする
139
155
  # set terminal部の扱いは考えなければならない(多分、_drow, _noteにif...set...end だけ残せばいい)
140
156
  def histogram(data, labels: nil, pileup: true,
141
157
  xmin: nil, xmax: nil, ymin: 0, ymax: nil, bins: 10,
142
- figsize: 1.0, rotate_xtics: 45,
158
+ plotsize: nil, rotate_xtics: 45,
143
159
  fill: true, alpha: 33, background: nil,
144
160
  file: nil)
145
161
 
@@ -154,21 +170,24 @@ module Gnutemplate
154
170
  ymax ||= freqs.map{ _1[1] }.flatten.max * 1.1
155
171
 
156
172
  if pileup
157
- ###########
158
- ###
159
- ###########
160
-
161
- set size: "#{figsize},#{figsize}"
162
- set style: "fill solid" if fill
163
173
 
164
174
  xticinterval = (xmax-xmin).to_f / bins
165
- set xtics: "#{xmin-xticinterval}, #{xticinterval}, #{xmax+xticinterval}"
166
- set(:xtics, "rotate by #{rotate_xtics}") if rotate_xtics
167
175
 
168
- set xrange: (xmin-xticinterval)..(xmax+xticinterval)
169
- set yrange: ymin..ymax
176
+ settings = {}
177
+ settings[:size] = "#{plotsize[0]},#{plotsize[1]}" if plotsize
178
+ settings[:style] = "fill solid" if fill
170
179
 
171
- args = background ? ["[#{xmin}:#{xmax}] #{ymax} with filledc above y=#{ymin} fc \"##{background}\" notitle", {}] : []
180
+ settings[:xtics] = ["#{xmin-xticinterval}, #{xticinterval}, #{xmax+xticinterval}"]
181
+ settings[:xtics].push("rotate by #{rotate_xtics}") if rotate_xtics
182
+
183
+ settings[:xrange] = (xmin-xticinterval)..(xmax+xticinterval)
184
+ settings[:yrange] = ymin..ymax
185
+
186
+ args = if background
187
+ ["[#{xmin}:#{xmax}] #{ymax} with filledc above y=#{ymin} fc \"##{background}\" notitle", {}]
188
+ else
189
+ []
190
+ end
172
191
 
173
192
  freqs.each_with_index do |f, i|
174
193
  args.push f[0], f[1]
@@ -180,29 +199,27 @@ module Gnutemplate
180
199
  end
181
200
  end
182
201
 
183
- return args
202
+ return SubPlot.new(args, settings)
184
203
 
185
204
  else
186
205
 
187
- ###########
188
- ###
189
- ###########
190
206
  # set title:"Temperature"
191
- set auto:"x"
192
- set :style, :data, :histogram
193
- set :style, :histogram, :cluster, gap:1
194
- set :style, :fill, solid: 1.0 - (alpha/100.0), border:-1
195
- set boxwidth:0.9
196
- set :xtic, :rotate, by: rotate_xtics, scale: 0
207
+ settings = {}
208
+ settings[:auto] = "x"
209
+ settings[:style] = [{data: nil, histogram: nil}, # set :style, :data, :histogram を表現
210
+ {histogram: nil, cluster: nil, gap: 1}, # set :histogram, :cluster, gap: 1 を表現
211
+ {fill: nil, solid: 1.0 - (alpha/100.0), border: -1}]
212
+ settings[:boxwidth] = 0.9
213
+ settings[:xtic] = {rotate: nil, by: rotate_xtics, scale: 0}
197
214
 
198
215
  xticinterval = (xmax-xmin).to_f / bins
199
- set xrange: 0..((xmax-xmin) / xticinterval).to_i
216
+ settings[:xrange] = 0..((xmax-xmin) / xticinterval).to_i
200
217
 
201
218
  xtics = freqs[0][0]
202
219
  .each.with_index
203
220
  .inject("(") { |result, (x, i)| result += "'#{x-xticinterval/2}-#{x+xticinterval/2}' #{i}," }
204
221
  .gsub(/,$/, ")")
205
- set xtics: xtics
222
+ settings[:xtics] = xtics
206
223
 
207
224
  labels ||= (0...(freqs.length)).map(&:to_s)
208
225
 
@@ -210,200 +227,197 @@ module Gnutemplate
210
227
  [*f, using: 2, w: :histogram, t: labels[i], fillcolor: "rgb \"#{colors[i % 4]}\""]
211
228
  end
212
229
 
213
- return args
230
+ return SubPlot.new(args, settings)
214
231
 
215
232
  end # Of if pileup..else
216
233
  end
217
- module_function :histogram
218
234
 
219
235
  def note_histogram(data, labels: nil, pileup: true,
220
236
  xmin: nil, xmax: nil, ymin: 0, ymax: nil, bins: 10,
221
- figsize: 1.0, rotate_xtics: 45,
237
+ plotsize: nil, rotate_xtics: 45,
222
238
  fill: true, alpha: 33, background: nil,
223
239
  file: nil)
224
240
 
225
- Numo.noteplot do
226
-
227
- if !file.nil?
228
- set terminal: "gif"
229
- set output: file
230
- end
231
-
232
- args = Gnutemplate.histogram(data, labels: labels, pileup: pileup,
233
- xmin: xmin, xmax: xmax, ymin: ymin, ymax: ymax, bins: bins,
234
- figsize: figsize, rotate_xtics: rotate_xtics,
235
- fill: fill, alpha: alpha, background: background)
236
-
237
- plot *args
238
-
239
- # data = [data] if data[0].kind_of?(Numeric) || data[0].nil?
240
-
241
- # alpha_hex = (alpha * 256 / 100).to_s(16).upcase
242
- # colors = ["##{alpha_hex}CC0000", "##{alpha_hex}00CC00", "##{alpha_hex}0000CC", "##{alpha_hex}888800"]
243
-
244
- # xmax ||= data.map(&:to_a).flatten.compact.max
245
- # xmin ||= data.map(&:to_a).flatten.compact.min
246
- # freqs = data.map {|d| d.to_a.compact.histogram(bins, min: xmin, max: xmax) }
247
- # ymax ||= freqs.map{ _1[1] }.flatten.max * 1.1
248
-
249
-
250
- # if pileup
251
- # ###########
252
- # ###
253
- # ###########
254
-
255
- # set size: "#{figsize},#{figsize}"
256
- # set style: "fill solid" if fill
257
-
258
- # xticinterval = (xmax-xmin).to_f / bins
259
- # set xtics: "#{xmin-xticinterval}, #{xticinterval}, #{xmax+xticinterval}"
260
- # set(:xtics, "rotate by #{rotate_xtics}") if rotate_xtics
261
-
262
- # set xrange: (xmin-xticinterval)..(xmax+xticinterval)
263
- # set yrange: ymin..ymax
264
-
265
- # args = background ? ["[#{xmin}:#{xmax}] #{ymax} with filledc above y=#{ymin} fc \"##{background}\" notitle", {}] : []
266
-
267
- # freqs.each_with_index do |f, i|
268
- # args.push f[0], f[1]
269
-
270
- # if labels
271
- # args.push({:with => :boxes, :title => labels[i], :fillcolor => "rgb \"#{colors[i % 4]}\""})
272
- # else
273
- # args.push({:with => :boxes, :fillcolor => "rgb \"#{colors[i % 4]}\""})
274
- # end
275
- # end
276
-
277
- # plot *args
278
-
279
- # else
280
-
281
- # ###########
282
- # ###
283
- # ###########
284
- # # set title:"Temperature"
285
- # set auto:"x"
286
- # set :style, :data, :histogram
287
- # set :style, :histogram, :cluster, gap:1
288
- # set :style, :fill, solid: 1.0 - (alpha/100.0), border:-1
289
- # set boxwidth:0.9
290
- # set :xtic, :rotate, by: rotate_xtics, scale: 0
291
-
292
- # xticinterval = (xmax-xmin).to_f / bins
293
- # set xrange: 0..((xmax-xmin) / xticinterval).to_i
294
-
295
- # xtics = freqs[0][0]
296
- # .each.with_index
297
- # .inject("(") { |result, (x, i)| result += "'#{x-xticinterval/2}-#{x+xticinterval/2}' #{i}," }
298
- # .gsub(/,$/, ")")
299
- # set xtics: xtics
300
-
301
- # labels ||= (0...(freqs.length)).map(&:to_s)
302
-
303
- # args = freqs.zip(labels).each_with_index.map do |(f, l), i|
304
- # [*f, using: 2, w: :histogram, t: labels[i], fillcolor: "rgb \"#{colors[i % 4]}\""]
305
- # end
306
-
307
- # plot *args
308
-
309
- # end # Of if pileup..else
310
-
311
- end # Of Numo.noteplot do
312
-
241
+ as = Gnutemplate.histogram(data, labels: labels, pileup: pileup,
242
+ xmin: xmin, xmax: xmax, ymin: ymin, ymax: ymax, bins: bins,
243
+ plotsize: plotsize, rotate_xtics: rotate_xtics,
244
+ fill: fill, alpha: alpha, background: background)
245
+
246
+ note as, file: file
247
+
313
248
  end # Of def function
314
249
 
315
250
  def draw_histogram(data, labels: nil, pileup: true,
316
251
  xmin: nil, xmax: nil, ymin: 0, ymax: nil, bins: 10,
317
- figsize: 1.0, rotate_xtics: 45,
252
+ plotsize: nil, rotate_xtics: 45,
318
253
  fill: true, alpha: 33, background: nil,
319
254
  file: nil)
320
255
 
321
- Numo.gnuplot do
322
-
323
- if !file.nil?
324
- set terminal: "gif"
325
- set output: file
326
- end
327
-
328
- args = Gnutemplate.histogram(data, labels: labels, pileup: pileup,
329
- xmin: xmin, xmax: xmax, ymin: ymin, ymax: ymax, bins: bins,
330
- figsize: figsize, rotate_xtics: rotate_xtics,
331
- fill: fill, alpha: alpha, background: background)
332
-
333
- plot *args
334
-
335
- # data = [data] if data[0].kind_of?(Numeric) || data[0].nil?
256
+ as = Gnutemplate.histogram(data, labels: labels, pileup: pileup,
257
+ xmin: xmin, xmax: xmax, ymin: ymin, ymax: ymax, bins: bins,
258
+ plotsize: plotsize, rotate_xtics: rotate_xtics,
259
+ fill: fill, alpha: alpha, background: background)
260
+
261
+ draw as, file: file
336
262
 
337
- # alpha_hex = (alpha * 256 / 100).to_s(16).upcase
338
- # colors = ["##{alpha_hex}CC0000", "##{alpha_hex}00CC00", "##{alpha_hex}0000CC", "##{alpha_hex}888800"]
263
+ end # Of def function
339
264
 
340
- # xmax ||= data.map(&:to_a).flatten.compact.max
341
- # xmin ||= data.map(&:to_a).flatten.compact.min
342
- # freqs = data.map {|d| d.to_a.compact.histogram(bins, min: xmin, max: xmax) }
343
- # ymax ||= freqs.map{ _1[1] }.flatten.max * 1.1
344
-
345
- # if pileup
346
- # ###########
347
- # ###
348
- # ###########
349
-
350
- # set size: "#{figsize},#{figsize}"
351
- # set style: "fill solid" if fill
352
-
353
- # xticinterval = (xmax-xmin).to_f / bins
354
- # set xtics: "#{xmin-xticinterval}, #{xticinterval}, #{xmax+xticinterval}"
355
- # set(:xtics, "rotate by #{rotate_xtics}") if rotate_xtics
356
-
357
- # set xrange: (xmin-xticinterval)..(xmax+xticinterval)
358
- # set yrange: ymin..ymax
359
-
360
- # args = background ? ["[#{xmin}:#{xmax}] #{ymax} with filledc above y=#{ymin} fc \"##{background}\" notitle", {}] : []
361
265
 
362
- # freqs.each_with_index do |f, i|
363
- # args.push f[0], f[1]
364
-
365
- # if labels
366
- # args.push({:with => :boxes, :title => labels[i], :fillcolor => "rgb \"#{colors[i % 4]}\""})
367
- # else
368
- # args.push({:with => :boxes, :fillcolor => "rgb \"#{colors[i % 4]}\""})
369
- # end
370
- # end
371
-
372
- # plot *args # ,xs, ys, { with: :lines , title: "STD"}
373
-
374
- # else
375
-
376
- # ###########
377
- # ###
378
- # ###########
379
- # set auto:"x"
380
- # set :style, :data, :histogram
381
- # set :style, :histogram, :cluster, gap:1
382
- # set :style, :fill, solid: 1.0 - (alpha/100.0), border:-1
383
- # set boxwidth:0.9
384
- # set :xtic, :rotate, by: rotate_xtics, scale: 0
385
-
386
- # xticinterval = (xmax-xmin).to_f / bins
387
- # set xrange: 0..((xmax-xmin) / xticinterval).to_i
388
-
389
- # xtics = freqs[0][0]
390
- # .each.with_index
391
- # .inject("(") { |result, (x, i)| result += "'#{x-xticinterval/2}-#{x+xticinterval/2}' #{i}," }
392
- # .gsub(/,$/, ")")
393
- # set xtics: xtics
394
-
395
- # labels ||= (0...(freqs.length)).map(&:to_s)
396
-
397
- # args = freqs.zip(labels).each_with_index.map do |(f, l), i|
398
- # [*f, using: 2, w: :histogram, t: labels[i], fillcolor: "rgb \"#{colors[i % 4]}\""]
399
- # end
400
-
401
- # plot *args
402
-
403
- # end # Of if pileup..else
404
- end # Of Numo.gnuplot do
405
-
406
- end # Of def function
266
+ def note(subplot, file: nil, campus_size: nil, multicolumn: 1) # for any plot function
267
+
268
+ subplot = [subplot] if !subplot.is_a?(Array)
269
+
270
+ Numo.noteplot do
271
+
272
+ if file
273
+ if campus_size
274
+ set termnal: "png", size: campus_size
275
+ else
276
+ set terminal: "png"
277
+ end
278
+ set output: file
279
+ end
280
+
281
+ # マルチプロット調整
282
+ multiline = (subplot.length.to_f / multicolumn).ceil
283
+ set :multiplot, layout: "#{multiline},#{multicolumn}"
284
+
285
+ # subplot一つ一つを描画
286
+ subplot.each do |sp|
287
+
288
+ # こういうのがパターンマッチでできるの?
289
+ sp.settings.each do |k, v|
290
+ if v.kind_of?(Hash)
291
+ sargs = []
292
+ skwargs = {}
293
+
294
+ v.map do |vk, vv|
295
+ if vv.nil?
296
+ sargs.push vk
297
+ else
298
+ skwargs[vk] = vv
299
+ end
300
+ end
301
+
302
+ set k, *sargs, **skwargs
303
+
304
+ elsif v.kind_of?(Array)
305
+
306
+ v.each do |vi|
307
+ if vi.kind_of?(Hash)
308
+ sargs = []
309
+ skwargs = {}
310
+ vi.map do |vk, vv|
311
+ if vv.nil?
312
+ sargs.push vk
313
+ else
314
+ skwargs[vk] = vv
315
+ end
316
+ end
317
+ set k, *sargs, **skwargs
318
+ else
319
+ set k, vi
320
+ end
321
+ end
322
+
323
+ else
324
+
325
+ if v.nil?
326
+ set k
327
+ else
328
+ set k, v
329
+ end
330
+
331
+ end
332
+ end
333
+
334
+ plot *(sp.args)
335
+ end # of subplot.each
336
+
337
+ unset :multiplot
338
+
339
+ end # of Numo.noteplot
340
+ end # of def draw
341
+
342
+ def draw(subplot, settings, campus_size: nil, file: nil, multicolumn: 1) # for any plot function
343
+
344
+ subplot = [subplot] if !subplot.is_a?(Array)
345
+
346
+ Numo.gnuplot do
347
+
348
+ if file
349
+ if campus_size
350
+ set termnal: "png", size: campus_size
351
+ else
352
+ set terminal: "png"
353
+ end
354
+ set output: file
355
+ end
356
+
357
+ multiline = (subplot.length.to_f / multicolumn).ceil
358
+ set :multiplot, layout: "#{multiline},#{multicolumn}"
359
+
360
+ subplot.each do |sp|
361
+
362
+ # こういうのがパターンマッチでできるの?
363
+ sp.settings.each do |k, v|
364
+ if v.kind_of?(Hash)
365
+ sargs = []
366
+ skwargs = {}
367
+
368
+ v.map do |vk, vv|
369
+ if vv.nil?
370
+ sargs.push vk
371
+ else
372
+ skwargs[vk] = vv
373
+ end
374
+ end
375
+
376
+ set k, *sargs, **skwargs
377
+
378
+ elsif v.kind_of?(Array)
379
+
380
+ v.each do |vi|
381
+ if vi.kind_of?(Hash)
382
+ sargs = []
383
+ skwargs = {}
384
+ vi.map do |vk, vv|
385
+ if vv.nil?
386
+ sargs.push vk
387
+ else
388
+ skwargs[vk] = vv
389
+ end
390
+ end
391
+ set k, *sargs, **skwargs
392
+ else
393
+ set k, vi
394
+ end
395
+ end
396
+
397
+ else
398
+
399
+ if v.nil?
400
+ set k
401
+ else
402
+ set k, v
403
+ end
404
+
405
+ end
406
+ end
407
+
408
+ plot *(sp.args)
409
+
410
+ end # of subplot.each
411
+
412
+ unset :multiplot
413
+
414
+ end # of Numo.gnuplot
415
+ end # of def draw
416
+
417
+ module_function :histogram
418
+ module_function :note_line, :draw_line
419
+ module_function :note_box, :draw_box
420
+ module_function :note_histogram, :draw_histogram
421
+ module_function :note, :draw
407
422
 
408
- module_function :note_line, :draw_line, :note_box, :draw_box, :note_histogram, :draw_histogram
409
423
  end # Of module
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnutemplate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.3
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - showata
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-24 00:00:00.000000000 Z
11
+ date: 2023-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-gnuplot