technical_graph 0.1.0 → 0.1.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.
data/README.md CHANGED
@@ -114,6 +114,12 @@ Font size:
114
114
  * options[:axis_font_size] - size of font used in axis
115
115
  * options[:axis_label_font_size] - size of font used in options[:x_axis_label] and options[:y_axis_label]
116
116
 
117
+ Sometime because of axis options and large amount of data, axis can be put densely on graph. Turning this option graph
118
+ size will be enlarged to maintain set distanced between axis.
119
+
120
+ * options[:axis_density_enlarge_image] - turn this options on
121
+ * options[:x_axis_min_distance] - minimum distance between X axis, default 30 pixels
122
+ * options[:y_axis_min_distance] - minimum distance between X axis, default 50 pixels
117
123
 
118
124
 
119
125
  Layer options Hash
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -74,6 +74,53 @@ class GraphAxis
74
74
  end
75
75
  end
76
76
 
77
+ # Enlarge image to maintain proper axis density
78
+ def axis_distance_image_enlarge
79
+ if options[:axis_density_enlarge_image]
80
+ x_axis_distance_image_enlarge
81
+ y_axis_distance_image_enlarge
82
+ end
83
+ end
84
+
85
+ # Enlarge image to maintain proper axis density
86
+ def x_axis_distance_image_enlarge
87
+ a = parameter_axis
88
+ # must be at least 2 axis
89
+ return if a.size < 2
90
+
91
+ ax = a[0]
92
+ ax = image_drawer.calc_bitmap_y(ax).round
93
+ bx = a[1]
94
+ bx = image_drawer.calc_bitmap_y(bx).round
95
+
96
+ axis_distance = (bx - ax).abs
97
+
98
+ if axis_distance < options[:x_axis_min_distance]
99
+ # enlarging image
100
+ options[:old_width] = options[:width]
101
+ options[:width] *= (options[:x_axis_min_distance] / axis_distance).ceil
102
+ end
103
+ end
104
+
105
+ # Enlarge image to maintain proper axis density
106
+ def y_axis_distance_image_enlarge
107
+ a = value_axis
108
+ # must be at least 2 axis
109
+ return if a.size < 2
110
+
111
+ ay = a[0]
112
+ ay = image_drawer.calc_bitmap_y(ay).round
113
+ by = a[1]
114
+ by = image_drawer.calc_bitmap_y(by).round
115
+
116
+ axis_distance = (by - ay).abs
117
+
118
+ if axis_distance < options[:y_axis_min_distance]
119
+ # enlarging image
120
+ options[:old_height] = options[:height]
121
+ options[:height] *= (options[:y_axis_min_distance] / axis_distance).ceil
122
+ end
123
+ end
77
124
 
78
125
  # Render axis on image
79
126
  def render_on_image(image)
@@ -43,6 +43,13 @@ class GraphDataProcessor
43
43
  options[:x_axis_fixed_interval] = true if options[:x_axis_fixed_interval].nil?
44
44
  options[:y_axis_fixed_interval] = true if options[:y_axis_fixed_interval].nil?
45
45
 
46
+ # when set enlarge image so axis are located in sensible distance between themselves
47
+ options[:axis_density_enlarge_image] = false if options[:x_axis_fixed_interval].nil?
48
+ # distance in pixels
49
+ options[:x_axis_min_distance] ||= 30
50
+ # distance in pixels
51
+ options[:y_axis_min_distance] ||= 50
52
+
46
53
  # default truncate string used for rendering numbers
47
54
  options[:truncate_string] ||= "%.2f"
48
55
 
@@ -33,6 +33,11 @@ class GraphImageDrawer
33
33
  @technical_graph.data_processor
34
34
  end
35
35
 
36
+ # Axis processing
37
+ def graph_axis
38
+ @technical_graph.axis
39
+ end
40
+
36
41
  def truncate_string
37
42
  options[:truncate_string]
38
43
  end
@@ -103,8 +108,16 @@ class GraphImageDrawer
103
108
  return (offset.to_f * height.to_f) / l.to_f
104
109
  end
105
110
 
111
+ # Everything that must be done before creating image
112
+ def pre_image_create_calculations
113
+ # check axis density and enlarge if this option is on
114
+ graph_axis.axis_distance_image_enlarge
115
+ end
116
+
106
117
  # Create background image
107
118
  def crate_blank_graph_image
119
+ pre_image_create_calculations
120
+
108
121
  @image = Magick::ImageList.new
109
122
  @image.new_image(
110
123
  width,
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{technical_graph}
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Aleksander Kwiatkowski"]
12
- s.date = %q{2011-09-24}
12
+ s.date = %q{2011-10-09}
13
13
  s.description = %q{Purpose of this gem is to create neat, simple, technical graphs. This is alternative to most new libraries which create small, candy graphs using JavaScript.}
14
14
  s.email = %q{bobikx@poczta.fm}
15
15
  s.extra_rdoc_files = [
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
40
40
  "samples/home_io_batt_voltage.png",
41
41
  "technical_graph.gemspec",
42
42
  "test/helper.rb",
43
+ "test/test_technical_axis_enlarge.rb",
43
44
  "test/test_technical_graph.rb",
44
45
  "test/test_technical_graph_axis.rb",
45
46
  "test/test_technical_simple_graph.rb"
@@ -0,0 +1,68 @@
1
+ require 'helper'
2
+
3
+ class TestTechnicalAxisEnlarge < Test::Unit::TestCase
4
+ context 'initial options' do
5
+ should 'enlarge image' do
6
+ @tg = TechnicalGraph.new(
7
+ {
8
+ :truncate_string => "%.1f",
9
+
10
+ :x_axis_label => 'x',
11
+ :y_axis_label => 'y',
12
+
13
+ :axis_antialias => true,
14
+ :layers_antialias => true,
15
+ :font_antialias => true,
16
+
17
+ :layers_font_size => 8,
18
+ :axis_font_size => 8,
19
+ :axis_label_font_size => 20,
20
+
21
+ :x_axis_count => 50,
22
+ :y_axis_count => 50,
23
+ #:x_axis_interval => 1.0,
24
+ #:y_axis_interval => 1.0,
25
+ :x_axis_fixed_interval => false,
26
+ :y_axis_fixed_interval => false,
27
+
28
+ #:x_min => -10.0,
29
+ #:x_max => 10.0,
30
+ #:y_min => -10.0,
31
+ #:y_max => 10.0,
32
+
33
+ :width => 800,
34
+ :height => 600,
35
+
36
+ :axis_density_enlarge_image => true,
37
+ :x_axis_min_distance => 50,
38
+ :y_axis_min_distance => 50,
39
+ }
40
+ )
41
+
42
+ max = 50
43
+
44
+ # adding simple layer
45
+ layer_params = {
46
+ :antialias => false,
47
+ #:color => 'red'
48
+ :color => '#FFFF00'
49
+ }
50
+ layer_data = Array.new
51
+ (0..max).each do |i|
52
+ layer_data << { :x => -10.0 + i.to_f, :y => 10.0 * Math.cos(i.to_f * (4.0 * 3.14 / max.to_f)) }
53
+ end
54
+ @tg.add_layer(layer_data, layer_params)
55
+ # should be added
56
+ @tg.layers.last.data.size.should > 0
57
+ # checking ranger for layer
58
+
59
+ @tg.render
60
+
61
+ @tg.image_drawer.save_to_file('test_axis_enlarge.png')
62
+ @tg.image_drawer.save_to_file('test_axis_enlarge.svg')
63
+ @tg.image_drawer.to_png.class.should == String
64
+
65
+ end
66
+ end
67
+
68
+ end
@@ -1,6 +1,6 @@
1
1
  require 'helper'
2
2
 
3
- class TestTechnicalGraph < Test::Unit::TestCase
3
+ class TestTechnicalSimpleGraph < Test::Unit::TestCase
4
4
  context 'initial options' do
5
5
  should 'draw simple graph' do
6
6
  @tg = TechnicalGraph.new(
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: technical_graph
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Aleksander Kwiatkowski
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-24 00:00:00 +02:00
18
+ date: 2011-10-09 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -151,6 +151,7 @@ files:
151
151
  - samples/home_io_batt_voltage.png
152
152
  - technical_graph.gemspec
153
153
  - test/helper.rb
154
+ - test/test_technical_axis_enlarge.rb
154
155
  - test/test_technical_graph.rb
155
156
  - test/test_technical_graph_axis.rb
156
157
  - test/test_technical_simple_graph.rb