graphkit 0.1.0.1 → 0.2.0
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.
- data/.document +5 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +20 -0
- data/README.md +4 -0
- data/README.rdoc +19 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/graphkit.gemspec +64 -0
- data/lib/graphkit/csv.rb +140 -0
- data/lib/graphkit/gnuplot.rb +364 -245
- data/lib/graphkit/mm.rb +43 -0
- data/lib/graphkit/vtk_legacy_ruby.rb +550 -0
- data/lib/graphkit.rb +135 -11
- data/test/helper.rb +18 -0
- data/test/test_graphkit.rb +7 -0
- metadata +114 -51
data/lib/graphkit.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
script_folder = File.dirname(File.expand_path(__FILE__))
|
2
2
|
|
3
3
|
require 'pp'
|
4
|
-
require script_folder + '/box_of_tricks.rb'
|
5
|
-
require script_folder + '/gnuplot.rb'
|
4
|
+
#require script_folder + '/box_of_tricks.rb'
|
5
|
+
#require script_folder + '/gnuplot.rb'
|
6
6
|
|
7
7
|
class Matrix
|
8
8
|
def shape
|
@@ -47,6 +47,7 @@ class SparseTensor < Hash
|
|
47
47
|
|
48
48
|
|
49
49
|
attr_reader :rank, :shape
|
50
|
+
#attr_accessor :default_val
|
50
51
|
|
51
52
|
# Create a new tensor.
|
52
53
|
|
@@ -78,7 +79,16 @@ class SparseTensor < Hash
|
|
78
79
|
# p args
|
79
80
|
|
80
81
|
raise RankError.new("Rank is #@rank, not #{args.size}") unless args.size == @rank
|
81
|
-
return
|
82
|
+
return nil unless keys.include? args
|
83
|
+
#if self.keys.include?(args) or @default_val == nil
|
84
|
+
#eputs args.pretty_inspect
|
85
|
+
#eputs self.pretty_inspect
|
86
|
+
#eputs self.class, self.class.ancestors
|
87
|
+
super(args)
|
88
|
+
#else
|
89
|
+
#return @default_val
|
90
|
+
#end
|
91
|
+
|
82
92
|
end
|
83
93
|
|
84
94
|
# Set an element of the tensor. E.g. for a rank 2 tensor
|
@@ -142,6 +152,21 @@ class SparseTensor < Hash
|
|
142
152
|
|
143
153
|
|
144
154
|
|
155
|
+
def alter!(&block)
|
156
|
+
self.keys.each do |k|
|
157
|
+
self[k] = yield(self[k])
|
158
|
+
end
|
159
|
+
end
|
160
|
+
def self.from_hash(hash)
|
161
|
+
st = new(hash.keys[0].size)
|
162
|
+
hash.each{|k,v| st[k] = v}
|
163
|
+
st
|
164
|
+
end
|
165
|
+
def inspect
|
166
|
+
"SparseTensor.from_hash(#{super})"
|
167
|
+
end
|
168
|
+
|
169
|
+
|
145
170
|
end
|
146
171
|
|
147
172
|
|
@@ -253,6 +278,12 @@ class GraphKit < KitHash
|
|
253
278
|
include Kit
|
254
279
|
include Log
|
255
280
|
AXES = [:x, :y, :z, :f]
|
281
|
+
DEFAULT_COLOURS = {0 => "#df0000", 1 => "#00df00", 2 => "#0000df", 3 => "#a000a0", 4 => "#0090a0", 5 => "#e59500", 7 => "#82c290", 8 => "#f76dba", 9 => "#c20f00", 10 => "#4f1099"}
|
282
|
+
DEFAULT_COLOURS_GNUPLOT = DEFAULT_COLOURS
|
283
|
+
DEFAULT_COLOURS_MATHEMATICA = DEFAULT_COLOURS.inject({}) do |hash, (i, coll)|
|
284
|
+
hash[i] = coll.sub(/#/, '').scan(/.{2}/).map{|str| (eval("0x#{str}").to_f / 255.0).round(2)}
|
285
|
+
hash
|
286
|
+
end
|
256
287
|
|
257
288
|
# attr_reader :gnuplot_options
|
258
289
|
|
@@ -383,8 +414,9 @@ class GraphKit < KitHash
|
|
383
414
|
# Duplicate the graphkit.
|
384
415
|
|
385
416
|
def dup
|
386
|
-
logf :dup
|
387
|
-
self.class.new(naxes, self)
|
417
|
+
#logf :dup
|
418
|
+
#self.class.new(naxes, self)
|
419
|
+
eval(inspect)
|
388
420
|
end
|
389
421
|
|
390
422
|
# Combine with another graph; titles and labels from the first graph will override the second.
|
@@ -441,16 +473,83 @@ class GraphKit < KitHash
|
|
441
473
|
self.xrange, self.yrange = xrange, yrange
|
442
474
|
end
|
443
475
|
|
476
|
+
def convert(&block)
|
477
|
+
#ep 'Converting graph...'
|
478
|
+
kit = self.dup
|
479
|
+
#p kit
|
480
|
+
|
481
|
+
kit.data.map! do |dk|
|
482
|
+
dk.convert(&block)
|
483
|
+
end
|
484
|
+
kit
|
485
|
+
end
|
444
486
|
# end #class GraphKit
|
445
487
|
|
488
|
+
|
489
|
+
# Convert the rank of the data from from_to[0] to from_to[1].
|
490
|
+
# E.g. convert a line of values of [x, y, z] with rank [1,1,2]
|
491
|
+
# to a matrix of values [x, y, z] with rank [1, 1, 2]
|
492
|
+
# convert_rank!([[1,1,1], [1,1,2]])
|
493
|
+
|
494
|
+
def convert_rank!(from_to, options={})
|
495
|
+
ep "Converting Rank"
|
496
|
+
case from_to
|
497
|
+
when [[1,1,1], [1,1,2]]
|
498
|
+
dependent_dimension = options[:dd] || options[:dependent_dimension] || 2
|
499
|
+
other_dims = [0,1,2] - [dependent_dimension]
|
500
|
+
od0 = other_dims[0]
|
501
|
+
od1 = other_dims[1]
|
502
|
+
data.each do |dk|
|
503
|
+
new_data = SparseTensor.new(2)
|
504
|
+
od0_data = dk.axes[AXES[od0]].data.to_a.uniq.sort
|
505
|
+
od1_data = dk.axes[AXES[od1]].data.to_a.uniq.sort
|
506
|
+
|
507
|
+
for i in 0...dk.axes[:x].data.size
|
508
|
+
od0_index = od0_data.index(dk.axes[AXES[od0]].data[i])
|
509
|
+
od1_index = od1_data.index(dk.axes[AXES[od1]].data[i])
|
510
|
+
new_data[[od0_index, od1_index]] = dk.axes[AXES[dependent_dimension]].data[i]
|
511
|
+
end
|
512
|
+
dk.axes[AXES[od0]].data = od0_data
|
513
|
+
dk.axes[AXES[od1]].data = od1_data
|
514
|
+
dk.axes[AXES[dependent_dimension]].data = new_data
|
515
|
+
end
|
516
|
+
|
517
|
+
else
|
518
|
+
raise "Converting from #{from_to[0].inspect} to #{from_to[1].inspect} is not implemented yet."
|
519
|
+
end
|
520
|
+
eputs self.pretty_inspect
|
521
|
+
end
|
522
|
+
|
446
523
|
class DataKit < KitHash
|
524
|
+
def convert(&block)
|
525
|
+
|
526
|
+
xdat = self.axes[:x].data.to_gslv
|
527
|
+
ydat = self.axes[:y].data.to_gslv
|
528
|
+
xnew = GSL::Vector.alloc(xdat.size)
|
529
|
+
ynew = GSL::Vector.alloc(xdat.size)
|
530
|
+
|
531
|
+
for i in 0...xdat.size
|
532
|
+
xnew[i], ynew[i] = yield(xdat[i], ydat[i])
|
533
|
+
end
|
534
|
+
self.axes[:x].data=xnew
|
535
|
+
self.axes[:y].data=ynew
|
536
|
+
#p 'dk', self
|
537
|
+
self
|
538
|
+
|
539
|
+
end
|
447
540
|
|
448
541
|
# include Kit
|
449
542
|
include Log
|
450
543
|
AXES = GraphKit::AXES
|
544
|
+
AXES.each{|ax| define_method(ax){self.axes[ax]}}
|
545
|
+
AXES.each{|ax| define_method(ax + "=".to_sym){|val| self.axes[ax] = val}}
|
451
546
|
|
452
547
|
# attr_accessor :labels, :ranges, :has_legend, :units, :dimensions
|
453
548
|
|
549
|
+
|
550
|
+
def axes_array
|
551
|
+
self.axes.values_at(*AXES).compact
|
552
|
+
end
|
454
553
|
def initialize(options = {})
|
455
554
|
super()
|
456
555
|
self[:axes] = {}
|
@@ -499,7 +598,6 @@ class DataKit < KitHash
|
|
499
598
|
|
500
599
|
# shape = f.shape
|
501
600
|
log 'checking ranks'
|
502
|
-
allowed_ranks = [[1], [1,1], [1,1,1], [1,1,2], [1,1,1,1], [1,1,2,2], [1,1,1,3]]
|
503
601
|
rnks = ranks
|
504
602
|
log rnks
|
505
603
|
raise IntegrityError.new("The combination of ranks of your data cannot be plotted. Your data has a set of axes with ranks #{rnks.inspect}. (NB, rank 1 corresponds to a vector, rank 2 to a matrix and 3 to a third rank tensor). The only possible sets of types are #{allowed_ranks.inspect}") unless allowed_ranks.include? rnks
|
@@ -516,10 +614,10 @@ class DataKit < KitHash
|
|
516
614
|
passed = false unless axes[:z].shape == [axes[:x].shape[0], axes[:y].shape[0]]
|
517
615
|
passed = false unless axes[:z].shape == axes[:f].shape if axes[:f]
|
518
616
|
when [1,1,1,3]
|
519
|
-
axes.values_at(:x, :y, :z).map{|axiskit| axiskit.shape}.inject do |old, new|
|
520
|
-
passed = false unless new == old
|
521
|
-
old
|
522
|
-
end
|
617
|
+
#axes.values_at(:x, :y, :z).map{|axiskit| axiskit.shape}.inject do |old, new|
|
618
|
+
#passed = false unless new == old
|
619
|
+
#old
|
620
|
+
#end
|
523
621
|
passed = false unless axes[:f].shape == [axes[:x].shape[0], axes[:y].shape[0], axes[:z].shape[0]]
|
524
622
|
end
|
525
623
|
raise IntegrityError.new(%[The dimensions of this data do not match: \n#{axes.inject(""){|str, (axis, axiskit)| str + "#{axis}: #{axiskit.shape}\n"}}\nranks: #{rnks}]) unless passed
|
@@ -529,6 +627,20 @@ class DataKit < KitHash
|
|
529
627
|
return true
|
530
628
|
end
|
531
629
|
|
630
|
+
#ALLOWED_RANKS = [[1], [1,1], [1,1,1], [1,1,2], [1,1,1,1], [1,1,2,2], [1,1,1,3]]
|
631
|
+
ALLOWED_RANKS = [[1], [1,1], [1,1,1], [1,1,2], [2,2,2], [2,2,2,2], [1,1,1,1], [1,1,2,2], [1,1,1,3], [3,3,3,3]]
|
632
|
+
|
633
|
+
def allowed_ranks
|
634
|
+
ALLOWED_RANKS
|
635
|
+
end
|
636
|
+
#def ranks_c_switch_hash
|
637
|
+
#hash = {}
|
638
|
+
#allowed_ranks.each_with_index do |rank,i|
|
639
|
+
#hash[rank] = i
|
640
|
+
#end
|
641
|
+
#p hash
|
642
|
+
#hash
|
643
|
+
#end
|
532
644
|
def shapes
|
533
645
|
logf :shapes
|
534
646
|
ans = axes.values_at(*AXES).compact.inject([]){|arr, axis| arr.push axis.shape}
|
@@ -536,6 +648,13 @@ class DataKit < KitHash
|
|
536
648
|
return ans
|
537
649
|
end
|
538
650
|
|
651
|
+
def rank_c_switch
|
652
|
+
#i = -1
|
653
|
+
#puts ALLOWED_RANKS.map{|r| i+=1;"#{i} --> #{r}"}
|
654
|
+
switch = ALLOWED_RANKS.index(ranks)
|
655
|
+
switch
|
656
|
+
|
657
|
+
end
|
539
658
|
def ranks
|
540
659
|
logf :ranks
|
541
660
|
ans = shapes.map{|shape| shape.size}
|
@@ -619,6 +738,7 @@ class DataKit < KitHash
|
|
619
738
|
# p data[0].axes[key]
|
620
739
|
axdata = axiskit.data #(key == :f) ? data[0].f.data : (next unless data[0].axes[key]; data[0].axes[key].data)
|
621
740
|
next unless axdata
|
741
|
+
#p 'axdatamin', axdata.min
|
622
742
|
ans.push [axdata.min, axdata.max]
|
623
743
|
end
|
624
744
|
end
|
@@ -775,6 +895,10 @@ end
|
|
775
895
|
|
776
896
|
end # class GraphKit
|
777
897
|
|
898
|
+
require 'graphkit/gnuplot.rb'
|
899
|
+
require 'graphkit/mm.rb'
|
900
|
+
require 'graphkit/csv.rb'
|
901
|
+
require 'graphkit/vtk_legacy_ruby.rb'
|
778
902
|
# end #class CodeRunner
|
779
903
|
|
780
904
|
|
@@ -849,4 +973,4 @@ end
|
|
849
973
|
|
850
974
|
|
851
975
|
# A graph kit is 'everything you need..
|
852
|
-
#A graph kit is, in fact, a very intelligent hash
|
976
|
+
#A graph kit is, in fact, a very intelligent hash
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'graphkit'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|
metadata
CHANGED
@@ -1,71 +1,134 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphkit
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
- 1
|
11
|
-
version: 0.1.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
12
6
|
platform: ruby
|
13
|
-
authors:
|
7
|
+
authors:
|
14
8
|
- Edmund Highcock
|
15
9
|
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
12
|
+
date: 2012-10-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: shoulda
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rdoc
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.12'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.12'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: bundler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>'
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.0.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>'
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: jeweler
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.8.4
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.8.4
|
78
|
+
description: ! 'A GraphKit is a device independent intelligent data container that
|
79
|
+
allows the easy sharing, combining and plotting of graphic data representations.
|
80
|
+
Easily created from data, they can be output in a variety of formats using packages
|
81
|
+
such as gnuplot. '
|
82
|
+
email: edmundhighcock@sourceforge.net
|
25
83
|
executables: []
|
26
|
-
|
27
84
|
extensions: []
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
85
|
+
extra_rdoc_files:
|
86
|
+
- LICENSE.txt
|
87
|
+
- README.md
|
88
|
+
- README.rdoc
|
89
|
+
files:
|
90
|
+
- .document
|
91
|
+
- Gemfile
|
92
|
+
- LICENSE.txt
|
93
|
+
- README.md
|
94
|
+
- README.rdoc
|
95
|
+
- Rakefile
|
96
|
+
- VERSION
|
97
|
+
- graphkit.gemspec
|
32
98
|
- lib/graphkit.rb
|
99
|
+
- lib/graphkit/csv.rb
|
33
100
|
- lib/graphkit/gnuplot.rb
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
101
|
+
- lib/graphkit/mm.rb
|
102
|
+
- lib/graphkit/vtk_legacy_ruby.rb
|
103
|
+
- test/helper.rb
|
104
|
+
- test/test_graphkit.rb
|
105
|
+
homepage: http://github.com/edmundhighcock/graphkit
|
106
|
+
licenses:
|
107
|
+
- GPLv3
|
38
108
|
post_install_message:
|
39
109
|
rdoc_options: []
|
40
|
-
|
41
|
-
require_paths:
|
110
|
+
require_paths:
|
42
111
|
- lib
|
43
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
113
|
none: false
|
45
|
-
requirements:
|
46
|
-
- -
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
|
49
|
-
segments:
|
50
|
-
- 1
|
51
|
-
- 9
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
segments:
|
52
119
|
- 0
|
53
|
-
|
54
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
hash: 4377792926943609585
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
122
|
none: false
|
56
|
-
requirements:
|
57
|
-
- -
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
63
127
|
requirements: []
|
64
|
-
|
65
|
-
|
66
|
-
rubygems_version: 1.3.7
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 1.8.24
|
67
130
|
signing_key:
|
68
131
|
specification_version: 3
|
69
|
-
summary:
|
132
|
+
summary: A GraphKit is a device independent intelligent data container for generating
|
133
|
+
and plotting graphs.
|
70
134
|
test_files: []
|
71
|
-
|