numo-gnuplot 0.2.0 → 0.2.1

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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -4
  3. data/ToDo +5 -0
  4. data/examples/Rakefile +4 -0
  5. data/lib/numo/gnuplot.rb +175 -21
  6. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e8bcac7c2ba2e8b6312acd20b52748afd86ddeb2
4
- data.tar.gz: c246dfd861b0a58a83a0b3a41f5868de6b4b4c29
3
+ metadata.gz: c624c33da64f76b0b4f072f55918c6e1b5ae7a2d
4
+ data.tar.gz: 8209e3093a40fcf2219cc71be057022fc329eac1
5
5
  SHA512:
6
- metadata.gz: 16c972884c66c7ea7e85714ea53eb2482f4907eeed485d6287c1f251c06dd4031adf7bfc76d10ff059d8242ef15d63ad961e9d66c140d996b3cdb85c8e4e8080
7
- data.tar.gz: a9408c167e56b22303cc77bb9b363be2b672f09031ea5465077918c8a40f3607f7153c02db739b390aad61ad62cf76888b20a98a0a98b9e831d06c886a0ab673
6
+ metadata.gz: eb122b78463ec953a1a9fea7a3957c4724c7ba7fed987b2c68bfa5368c85468e20ee244f75ad60ad587f13625e823ad835aa202c3916113a1832dc4340399132
7
+ data.tar.gz: c0061a69f0d39943c8e2eb2d83bc2ee71429d702f87d67edecc63174d32de7ef6b7ce8c13aa6704fc58b0ad6a875858bb19361c86e7edf75847bb0689b54679b
data/README.md CHANGED
@@ -1,11 +1,13 @@
1
1
  # Numo::Gnuplot : Gnuplot interface for Ruby
2
2
 
3
- * Alpha version under development.
3
+ Alpha version under development.
4
+
4
5
  * [GitHub site](https://github.com/ruby-numo/gnuplot)
5
6
  * [RubyGems site](https://rubygems.org/gems/numo-gnuplot)
6
- * [API doc](http://www.rubydoc.info/gems/numo-gnuplot/Numo/Gnuplot)
7
+ * [Demo repository](https://github.com/ruby-numo/numo-gnuplot-demo)
7
8
 
8
- * Visit [Demo page](https://github.com/ruby-numo/numo-gnuplot-demo).
9
+ * [API doc](http://www.rubydoc.info/gems/numo-gnuplot/Numo/Gnuplot)
10
+ * [Introduction.ja](https://github.com/ruby-numo/gnuplot/wiki/Introduction.ja) (in Japanese)
9
11
 
10
12
  Although there are many [other Gnuplot interface libraries for Ruby](https://github.com/ruby-numo/gnuplot#related-work),
11
13
  none of them have so simple interface as to show an XY data plot by just typing:
@@ -32,7 +34,7 @@ Or install it yourself as:
32
34
 
33
35
  $ gem install numo-gnuplot
34
36
 
35
- ## Demo page
37
+ ## Demo
36
38
 
37
39
  * [Ruby/Numo::Gnuplot Demo](https://github.com/ruby-numo/numo-gnuplot-demo)
38
40
 
data/ToDo ADDED
@@ -0,0 +1,5 @@
1
+ * allow rgbimage, rgbalpha -- done
2
+ * allow timefmt data
3
+
4
+ * more examples
5
+ * all style catalog
data/examples/Rakefile CHANGED
@@ -1,3 +1,7 @@
1
1
  require "rake/clean"
2
2
 
3
3
  CLEAN.include %w[*.png tmp.dat]
4
+
5
+ task :default do
6
+ sh "ruby all.rb"
7
+ end
data/lib/numo/gnuplot.rb CHANGED
@@ -18,7 +18,7 @@ module Numo
18
18
 
19
19
  class Gnuplot
20
20
 
21
- VERSION = "0.2.0"
21
+ VERSION = "0.2.1"
22
22
  POOL = []
23
23
  DATA_FORMAT = "%.7g"
24
24
 
@@ -89,7 +89,7 @@ class Gnuplot
89
89
 
90
90
  def _plot_splot(cmd,contents)
91
91
  r = contents.shift.map{|x| "#{x} "}.join
92
- c = contents.map{|x| x.cmd_str}.join(",")
92
+ c = contents.map{|x| x.cmd_str}.join(", ")
93
93
  d = contents.map{|x| x.data_str}.join
94
94
  run "#{cmd} #{r}#{c}", d
95
95
  nil
@@ -230,7 +230,8 @@ class Gnuplot
230
230
 
231
231
  # output current plot to file with terminal setting from extension
232
232
  # (not Gnuplot command)
233
- def output(filename,term=nil,*opts)
233
+ def output(filename,**opts)
234
+ term = opts.delete(:term) || opts.delete(:terminal)
234
235
  if term.nil? && /\.(\w+)$/ =~ filename
235
236
  term = $1
236
237
  end
@@ -238,7 +239,7 @@ class Gnuplot
238
239
  if term.nil?
239
240
  kernel_raise GnuplotError,"file extension is not given"
240
241
  end
241
- set terminal:[term,*opts]
242
+ set :terminal, term, *opts
242
243
  set output:filename
243
244
  refresh
244
245
  unset :terminal
@@ -305,7 +306,53 @@ class Gnuplot
305
306
  end
306
307
 
307
308
  def send_cmd(s,data=nil)
308
- puts "<"+s if @debug
309
+ if @debug
310
+ puts "<"+s
311
+ if data && !data.empty?
312
+ if data.size > 144
313
+ s1 = data[0..71]
314
+ s2 = data[-72..-1]
315
+ if s1.force_encoding("UTF-8").ascii_only? &&
316
+ s2.force_encoding("UTF-8").ascii_only?
317
+ a = [nil]*6
318
+ if /\A(.+?)$(.+)?/m =~ s1
319
+ a[0..1] = $1,$2
320
+ if a[1] && /\A(.+?)?$(.+)?/m =~ a[1].strip
321
+ a[1..2] = $1,$2
322
+ a[1] = a[1]+"..." if !a[2]
323
+ else
324
+ a[0] = a[0]+"..."
325
+ end
326
+ end
327
+ if /(.+)?^(.+?)\z/m =~ s2
328
+ a[4..5] = $1,$2
329
+ if a[4] && /(.+)?^(.+?)?\z/m =~ a[4].strip
330
+ a[3..4] = $1,$2
331
+ a[4] = "..."+a[4] if !a[3]
332
+ else
333
+ a[5] = "..."+a[5]
334
+ end
335
+ end
336
+ if a[2] || a[3]
337
+ a[2..3] = ["...",nil]
338
+ end
339
+ a.each{|l| puts "<"+l if l}
340
+ else
341
+ c = data[0..31].inspect
342
+ c += "..." if data.size > 32
343
+ puts "<"+c
344
+ end
345
+ else
346
+ if data.force_encoding("UTF-8").ascii_only?
347
+ data.split(/\n/).each{|l| puts "<"+l}
348
+ else
349
+ c = data[0..31].inspect
350
+ c += "..." if data.size > 32
351
+ puts "<"+c
352
+ end
353
+ end
354
+ end
355
+ end
309
356
  @iow.puts s
310
357
  @iow.puts data
311
358
  @iow.flush
@@ -670,6 +717,13 @@ class Gnuplot
670
717
  data << x
671
718
  else
672
719
  @options << x
720
+ if x.kind_of? Hash
721
+ x.each do |k,v|
722
+ if /^#{k}/ =~ "with"
723
+ @style = v; break;
724
+ end
725
+ end
726
+ end
673
727
  end
674
728
  end
675
729
  if data.empty?
@@ -681,8 +735,21 @@ class Gnuplot
681
735
  end
682
736
  end
683
737
 
738
+ def parse_data_style(data)
739
+ if @style
740
+ re = /^#{@style}/
741
+ if re =~ "image"
742
+ return ImageData.new(*data)
743
+ elsif re =~ "rgbimage"
744
+ return RgbImageData.new(*data)
745
+ elsif re =~ "rgbalpha"
746
+ return RgbAlphaData.new(*data)
747
+ end
748
+ end
749
+ end
750
+
684
751
  def parse_data(data)
685
- PlotData.new(*data)
752
+ parse_data_style(data) || PlotData.new(*data)
686
753
  end
687
754
 
688
755
  def cmd_str
@@ -730,21 +797,17 @@ class Gnuplot
730
797
  # @private
731
798
  class SPlotItem < PlotItem # :nodoc: all
732
799
  def parse_data(data)
733
- if data.size == 1
734
- if data[0].respond_to?(:shape)
735
- SPlotArray.new(*data)
736
- else
737
- PlotData.new(*data)
738
- end
739
- else
800
+ parse_data_style(data) ||
801
+ (data.size == 1) ?
802
+ ImageData.new(data.first) :
740
803
  SPlotRecord.new(*data)
741
- end
742
804
  end
743
805
  end
744
806
 
745
807
 
746
808
  # @private
747
809
  class PlotData # :nodoc: all
810
+
748
811
  def data_format
749
812
  @data_format || DATA_FORMAT
750
813
  end
@@ -866,17 +929,60 @@ class Gnuplot
866
929
  end
867
930
 
868
931
  # @private
869
- class SPlotArray < PlotData # :nodoc: all
932
+ class ImageData < PlotData # :nodoc: all
933
+
934
+ def check_shape
935
+ if @data.shape.size != 2
936
+ raise IndexError,"array should be 2-dimensional"
937
+ end
938
+ @shape = @data.shape
939
+ end
940
+
870
941
  def initialize(data)
871
- @data = data
942
+ @text = false
943
+ if data.respond_to?(:shape)
944
+ @data = data
945
+ check_shape
946
+ if defined? Numo::NArray
947
+ @format =
948
+ case @data
949
+ when Numo::DFloat; "%float64"
950
+ when Numo::SFloat; "%float32"
951
+ when Numo::Int8; "%int8"
952
+ when Numo::UInt8; "%uint8"
953
+ when Numo::Int16; "%int16"
954
+ when Numo::UInt16; "%uint16"
955
+ when Numo::Int32; "%int32"
956
+ when Numo::UInt32; "%uint32"
957
+ when Numo::Int64; "%int64"
958
+ when Numo::UInt64; "%uint64"
959
+ else
960
+ raise ArgumentError,"not supported NArray type"
961
+ end
962
+ end
963
+ elsif data.kind_of? Array
964
+ n = nil
965
+ @data = []
966
+ data.each do |a|
967
+ @data.concat(a)
968
+ m = a.size
969
+ if n && n != m
970
+ raise IndexError,"element size differs (%d should be %d)"%[m, n]
971
+ end
972
+ n = m
973
+ end
974
+ @shape = [data.size,n]
975
+ @format = "%float64"
976
+ else
977
+ raise ArgumentError,"argument should be data array"
978
+ end
872
979
  end
873
980
 
874
981
  def cmd_str
875
982
  if @text
876
983
  "'-' matrix"
877
984
  else
878
- s = @data.shape
879
- "'-' binary array=(#{s[1]},#{s[0]}) format='%float64'"
985
+ "'-' binary array=(#{@shape[1]},#{@shape[0]}) format='#{@format}'"
880
986
  end
881
987
  end
882
988
 
@@ -884,15 +990,63 @@ class Gnuplot
884
990
  if @text
885
991
  f = data_format
886
992
  s = ""
887
- a.each do |b|
993
+ @data.to_a.each do |b|
888
994
  s << b.map{|e| f%e}.join(" ")+"\n"
889
995
  end
890
996
  s+"\ne"
891
997
  elsif defined? Numo::NArray
892
- Numo::DFloat.cast(@data).to_string
998
+ if @data.kind_of?(Numo::NArray)
999
+ @data.to_string
1000
+ else
1001
+ Numo::DFloat.cast(@data).to_string
1002
+ end
893
1003
  else
894
- @data.to_a.flatten.pack("d*")
1004
+ @data.pack("d*")
1005
+ end
1006
+ end
1007
+ end
1008
+
1009
+ # @private
1010
+ class RgbImageData < ImageData # :nodoc: all
1011
+
1012
+ def initialize(data)
1013
+ if data.kind_of?(Numo::NArray)
1014
+ super(data)
1015
+ else
1016
+ super(Numo::NArray[*data])
1017
+ end
1018
+ end
1019
+
1020
+ def check_shape
1021
+ if @data.shape.size != 3
1022
+ raise IndexError,"array should be 2-dimensional"
1023
+ end
1024
+ if @data.shape[2] != 3
1025
+ raise IndexError,"shape[2] (last dimension size) must be 3"
1026
+ end
1027
+ @shape = @data.shape
1028
+ end
1029
+ end
1030
+
1031
+ # @private
1032
+ class RgbAlphaData < ImageData # :nodoc: all
1033
+
1034
+ def initialize(data)
1035
+ if data.kind_of?(Numo::NArray)
1036
+ super(data)
1037
+ else
1038
+ super(Numo::NArray[*data])
1039
+ end
1040
+ end
1041
+
1042
+ def check_shape
1043
+ if @data.shape.size != 3
1044
+ raise IndexError,"array should be 2-dimensional"
1045
+ end
1046
+ if @data.shape[2] != 4
1047
+ raise IndexError,"shape[2] (last dimension size) must be 4"
895
1048
  end
1049
+ @shape = @data.shape
896
1050
  end
897
1051
  end
898
1052
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numo-gnuplot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro TANAKA
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-14 00:00:00.000000000 Z
11
+ date: 2017-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -50,6 +50,7 @@ files:
50
50
  - LICENSE
51
51
  - README.md
52
52
  - Rakefile
53
+ - ToDo
53
54
  - examples/Rakefile
54
55
  - examples/all.rb
55
56
  - examples/ex001.rb