From 8536abc0619a842617c073735355d9456ceab0f2 Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Thu, 30 Jul 2020 15:08:09 +0900 Subject: [PATCH] Use headers as series name --- lib/uplot/command.rb | 46 +++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/lib/uplot/command.rb b/lib/uplot/command.rb index 20e5e73..fe64ae5 100644 --- a/lib/uplot/command.rb +++ b/lib/uplot/command.rb @@ -6,13 +6,17 @@ module Uplot def initialize(argv) @params = {} @ptype = nil + @headers = nil + @delimiter = "\t" + @output = false parse_options(argv) end def opt_new - OptionParser.new do |opt| + opt = OptionParser.new do |opt| opt.on('-o', '--output', TrueClass) { |v| @output = v } - opt.on('-d', '--delimiter', String) { |v| @delimiter = v } + opt.on('-d', '--delimiter VAL', String) { |v| @delimiter = v } + opt.on('-H', '--headers', TrueClass) { |v| @headers = v } opt.on('-t', '--title VAL', String) { |v| @params[:title] = v } opt.on('-w', '--width VAL', Numeric) { |v| @params[:width] = v } opt.on('-h', '--height VAL', Numeric) { |v| @params[:height] = v } @@ -51,33 +55,45 @@ module Uplot # Sometimes the input file does not end with a newline code. while input = Kernel.gets(nil) input.freeze - @delimiter ||= "\t" - @headers ||= false - data = CSV.parse(input, headers: @headers, col_sep: @delimiter) + data, headers = preprocess(input) case @ptype when 'hist', 'histogram' - histogram(data) + histogram(data, headers) when 'line', 'lineplot' - line(data) + line(data, headers) when 'lines' - lines(data) + lines(data, headers) end.render($stderr) print input if @output end end - def histogram(data) - series = data.map { |r| r[0].to_f } + def preprocess(input) + data = CSV.parse(input, col_sep: @delimiter) + if @headers + headers = data.shift + data = data.transpose + [data, headers] + else + data = data.transpose + [data, nil] + end + end + + def histogram(data, headers) + @params[:title] ||= headers[0] if headers # labels? + series = data[0].map(&:to_f) UnicodePlot.histogram(series, **@params.compact) end - def line(data) - data = data.transpose + def line(data, headers) if data.size == 1 + @params[:name] ||= headers[0] if headers y = data[0] x = (1..y.size).to_a else + @params[:name] ||= headers[1] if headers x = data[0] y = data[1] end @@ -86,12 +102,12 @@ module Uplot UnicodePlot.lineplot(x, y, **@params.compact) end - def lines(_input_lines) - data = data.transpose + def lines(data, headers) data.map { |series| series.map(&:to_f) } + @params[:name] ||= headers[1] if headers plot = UnicodePlot.lineplot(data[0], data[1], **@params.compact) 2.upto(data.size - 1) do |i| - UnicodePlot.lineplot!(plot, data[0], data[i]) + UnicodePlot.lineplot!(plot, data[0], data[i], name: headers[i]) end plot end