scruffy 0.2.6 → 0.3.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/{History.txt → CHANGES.txt} +15 -12
  2. data/README.txt +25 -25
  3. data/lib/scruffy.rb +0 -5
  4. data/lib/scruffy/components.rb +1 -0
  5. data/lib/scruffy/components/axes.rb +23 -0
  6. data/lib/scruffy/components/background.rb +3 -3
  7. data/lib/scruffy/components/base.rb +3 -0
  8. data/lib/scruffy/components/data_markers.rb +23 -8
  9. data/lib/scruffy/components/graphs.rb +4 -0
  10. data/lib/scruffy/components/grid.rb +45 -4
  11. data/lib/scruffy/components/legend.rb +63 -21
  12. data/lib/scruffy/components/title.rb +1 -1
  13. data/lib/scruffy/components/value_markers.rb +9 -16
  14. data/lib/scruffy/formatters.rb +41 -3
  15. data/lib/scruffy/graph.rb +27 -11
  16. data/lib/scruffy/graph_state.rb +5 -0
  17. data/lib/scruffy/helpers.rb +1 -0
  18. data/lib/scruffy/helpers/layer_container.rb +28 -4
  19. data/lib/scruffy/helpers/marker_helper.rb +25 -0
  20. data/lib/scruffy/helpers/point_container.rb +46 -17
  21. data/lib/scruffy/layers.rb +6 -1
  22. data/lib/scruffy/layers/bar.rb +35 -14
  23. data/lib/scruffy/layers/base.rb +51 -21
  24. data/lib/scruffy/layers/box.rb +114 -0
  25. data/lib/scruffy/layers/line.rb +31 -14
  26. data/lib/scruffy/layers/multi.rb +74 -0
  27. data/lib/scruffy/layers/multi_area.rb +119 -0
  28. data/lib/scruffy/layers/multi_bar.rb +51 -0
  29. data/lib/scruffy/layers/scatter.rb +13 -5
  30. data/lib/scruffy/layers/stacked.rb +2 -1
  31. data/lib/scruffy/rasterizers.rb +1 -0
  32. data/lib/scruffy/rasterizers/mini_magick_rasterizer.rb +24 -0
  33. data/lib/scruffy/rasterizers/rmagick_rasterizer.rb +8 -2
  34. data/lib/scruffy/renderers.rb +2 -0
  35. data/lib/scruffy/renderers/axis_legend.rb +41 -0
  36. data/lib/scruffy/renderers/base.rb +6 -4
  37. data/lib/scruffy/renderers/basic.rb +20 -0
  38. data/lib/scruffy/renderers/standard.rb +7 -6
  39. data/lib/scruffy/themes.rb +37 -1
  40. data/lib/scruffy/version.rb +1 -7
  41. data/spec/output/array.svg +55 -0
  42. data/spec/output/hash.svg +55 -0
  43. data/spec/scruffy/graph_spec.rb +4 -4
  44. data/spec/scruffy/layers/base_spec.rb +15 -10
  45. metadata +84 -96
  46. data/CHANGES +0 -104
  47. data/License.txt +0 -20
  48. data/MIT-LICENSE +0 -20
  49. data/Manifest.txt +0 -104
  50. data/PostInstall.txt +0 -6
  51. data/README +0 -9
  52. data/Rakefile +0 -108
  53. data/config/hoe.rb +0 -78
  54. data/config/requirements.rb +0 -15
  55. data/script/console +0 -10
  56. data/script/destroy +0 -14
  57. data/script/generate +0 -14
  58. data/script/txt2html +0 -82
  59. data/setup.rb +0 -1585
  60. data/spec/scruffy/layers/line_spec.rb +0 -10
  61. data/tasks/deployment.rake +0 -34
  62. data/tasks/environment.rake +0 -7
  63. data/tasks/website.rake +0 -17
  64. data/test/graph_creation_test.rb +0 -101
  65. data/test/test_helper.rb +0 -2
  66. data/website/images/blank.gif.html +0 -7
  67. data/website/images/graphs/all_smiles.png +0 -0
  68. data/website/images/graphs/bar_test.png +0 -0
  69. data/website/images/graphs/bar_test.svg +0 -71
  70. data/website/images/graphs/line_test.png +0 -0
  71. data/website/images/graphs/line_test.svg +0 -60
  72. data/website/images/graphs/multi_test.png +0 -0
  73. data/website/images/graphs/multi_test.svg +0 -296
  74. data/website/images/graphs/pie_test.png +0 -0
  75. data/website/images/graphs/pie_test.svg +0 -40
  76. data/website/images/graphs/split_test.png +0 -0
  77. data/website/images/graphs/split_test.svg +0 -295
  78. data/website/images/graphs/stacking_test.png +0 -0
  79. data/website/images/graphs/stacking_test.svg +0 -146
  80. data/website/images/header.png +0 -0
  81. data/website/images/header_gradient.png +0 -0
  82. data/website/images/overlay.png +0 -0
  83. data/website/images/scruffy.png +0 -0
  84. data/website/index.html +0 -225
  85. data/website/index.txt +0 -204
  86. data/website/javascripts/application.js +0 -2
  87. data/website/javascripts/controls.js +0 -815
  88. data/website/javascripts/dragdrop.js +0 -913
  89. data/website/javascripts/effects.js +0 -958
  90. data/website/javascripts/lightbox.js +0 -437
  91. data/website/javascripts/prototype.js +0 -2006
  92. data/website/javascripts/rounded_corners_lite.inc.js +0 -285
  93. data/website/stylesheets/lightbox.css +0 -27
  94. data/website/stylesheets/screen.css +0 -147
  95. data/website/stylesheets/scruffy.css +0 -227
  96. data/website/template.html.erb +0 -47
@@ -0,0 +1,51 @@
1
+ module Scruffy::Layers
2
+ # ==Scruffy::Layers::MultiBar
3
+ #
4
+ # Author:: Jeremy Green
5
+ # Date:: July 29th, 2009
6
+ #
7
+ # Based on:: Scruffy::Layers::Bar by
8
+ # Author:: Brasten Sager
9
+ # Date:: August 6th, 2006
10
+ #
11
+ # Standard multi_bar graph.
12
+ class MultiBar < Bar
13
+
14
+
15
+
16
+ protected
17
+
18
+ # Due to the size of the bar graph, X-axis coords must
19
+ # be squeezed so that the bars do not hang off the ends
20
+ # of the graph.
21
+ #
22
+ # Unfortunately this just mean that bar-graphs and most other graphs
23
+ # end up on different points. Maybe adding a padding to the coordinates
24
+ # should be a graph-wide thing?
25
+ #
26
+ # Update : x-axis coords for lines and area charts should now line
27
+ # up with the center of bar charts.
28
+
29
+ def generate_coordinates(options = {})
30
+ @point_width = (width / points.size)
31
+ @point_space = @point_width * 0.1
32
+ @point_width = @point_width - @point_space
33
+ @bar_width = @point_width/options[:num_bars]
34
+ @bar_space = @bar_width * 0.1
35
+ @bar_width = @bar_width * 0.9
36
+
37
+ #options[:point_distance] = (width - (width / points.size)) / (points.size - 1).to_f
38
+
39
+ #TODO more array work with index, try to rework to be accepting of hashes
40
+ coords = (0...points.size).map do |idx|
41
+
42
+ x_coord = (@point_width * idx) + @point_space/2 + @point_space*idx + @bar_width * options[:position] + @bar_space*(options[:position].to_f - 0.5)
43
+
44
+ relative_percent = ((points[idx] == min_value) ? 0 : ((points[idx] - min_value) / (max_value - min_value).to_f))
45
+ y_coord = (height - (height * relative_percent))
46
+ [x_coord, y_coord]
47
+ end
48
+ coords
49
+ end
50
+ end
51
+ end
@@ -7,15 +7,23 @@ module Scruffy::Layers
7
7
  # Simple scatter graph
8
8
  class Scatter < Base
9
9
 
10
+ include Scruffy::Helpers::Marker
11
+
10
12
  # Renders scatter graph.
11
13
  def draw(svg, coords, options={})
12
- svg.g(:class => 'shadow', :transform => "translate(#{relative(0.5)}, #{relative(0.5)})") {
13
- coords.each { |coord| svg.circle( :cx => coord.first, :cy => coord.last + relative(0.9), :r => relative(2),
14
- :style => "stroke-width: #{relative(2)}; stroke: black; opacity: 0.35;" ) }
15
- }
14
+
15
+ options.merge!(@options)
16
+
17
+ if options[:shadow]
18
+ svg.g(:class => 'shadow', :transform => "translate(#{relative(0.5)}, #{relative(0.5)})") {
19
+ coords.each { |coord| svg.circle( :cx => coord.first, :cy => coord.last + relative(0.9), :r => relative(2),
20
+ :style => "stroke-width: #{relative(2)}; stroke: black; opacity: 0.35;" ) }
21
+ }
22
+ end
16
23
 
17
24
  coords.each { |coord| svg.circle( :cx => coord.first, :cy => coord.last, :r => relative(2),
18
25
  :style => "stroke-width: #{relative(2)}; stroke: #{color.to_s}; fill: #{color.to_s}" ) }
19
26
  end
20
27
  end
21
- end
28
+ end
29
+
@@ -31,7 +31,7 @@ module Scruffy::Layers
31
31
  # Overrides Base#render to fiddle with layers' points to achieve a stacked effect.
32
32
  def render(svg, options = {})
33
33
  #TODO ensure this works with new points
34
- current_points = points.dup
34
+ current_points = points
35
35
 
36
36
  layers.each do |layer|
37
37
  real_points = layer.points
@@ -63,6 +63,7 @@ module Scruffy::Layers
63
63
  def points
64
64
  longest_arr = layers.inject(nil) do |longest, layer|
65
65
  longest = layer.points if (longest.nil? || longest.size < layer.points.size)
66
+ longest
66
67
  end
67
68
 
68
69
  summed_points = (0...longest_arr.size).map do |idx|
@@ -11,4 +11,5 @@
11
11
  module Scruffy::Rasterizers; end
12
12
 
13
13
  require 'scruffy/rasterizers/rmagick_rasterizer.rb'
14
+ require 'scruffy/rasterizers/mini_magick_rasterizer.rb'
14
15
  require 'scruffy/rasterizers/batik_rasterizer.rb'
@@ -0,0 +1,24 @@
1
+ module Scruffy::Rasterizers
2
+
3
+ # == MiniMagickRasterizer
4
+ #
5
+ # Author:: Tim Connor
6
+ # Date:: Feb 9th, 2010
7
+ #
8
+ # The MiniMagickRasterizer converts SVG graphs to images using MiniMagick.
9
+ class MiniMagickRasterizer
10
+ def rasterize(svg, options={})
11
+ require 'mini_magick'
12
+
13
+ image = MiniMagick::Image::from_blob(svg)
14
+
15
+ image.format(options[:as]) do |cmd|
16
+ cmd.background "#0000" # Transparent background
17
+ end if options[:as]
18
+
19
+ image.write(options[:to]) if options[:to]
20
+ image.to_blob
21
+
22
+ end
23
+ end
24
+ end
@@ -10,7 +10,13 @@ module Scruffy::Rasterizers
10
10
  def rasterize(svg, options={})
11
11
  # I know this seems weird, I'm open to suggestions.
12
12
  # I didn't want RMagick required unless absolutely necessary.
13
- require 'RMagick'
13
+ unless defined? Magick
14
+ begin
15
+ require 'rmagick'
16
+ rescue LoadError
17
+ require 'RMagick'
18
+ end
19
+ end
14
20
 
15
21
  image = Magick::Image::from_blob(svg)[0]
16
22
 
@@ -24,4 +30,4 @@ module Scruffy::Rasterizers
24
30
  image.to_blob { self.format = options[:as] }
25
31
  end
26
32
  end
27
- end
33
+ end
@@ -13,8 +13,10 @@
13
13
  module Scruffy::Renderers; end
14
14
 
15
15
  require 'scruffy/renderers/base'
16
+ require 'scruffy/renderers/basic'
16
17
  require 'scruffy/renderers/empty'
17
18
  require 'scruffy/renderers/standard'
19
+ require 'scruffy/renderers/axis_legend'
18
20
  require 'scruffy/renderers/reversed'
19
21
  require 'scruffy/renderers/cubed'
20
22
  require 'scruffy/renderers/split'
@@ -0,0 +1,41 @@
1
+ module Scruffy::Renderers
2
+ class AxisLegend < Empty
3
+
4
+ def define_layout
5
+ super do |components|
6
+ components << Scruffy::Components::Title.new(:title, :position => [5, 2], :size => [90, 7])
7
+
8
+
9
+ components << Scruffy::Components::Viewport.new(:view, :position => [6, 22], :size => [90, 66]) do |graph|
10
+ graph << Scruffy::Components::ValueMarkers.new(:values, :position => [0, 2], :size => [8, 89])
11
+ graph << Scruffy::Components::Grid.new(:grid, :position => [10, 0], :size => [90, 89], :stroke_width => 1)
12
+ graph << Scruffy::Components::VGrid.new(:vgrid, :position => [10, 0], :size => [90, 89], :stroke_width => 1)
13
+ graph << Scruffy::Components::DataMarkers.new(:labels, :position => [10, 92], :size => [90, 8])
14
+ graph << Scruffy::Components::Graphs.new(:graphs, :position => [10, 0], :size => [90, 89])
15
+ end
16
+ components << Scruffy::Components::YLegend.new(:y_legend, :position => [1, 26], :size => [5, 66])
17
+ components << Scruffy::Components::XLegend.new(:x_legend, :position => [5, 92], :size => [90, 6])
18
+ components << Scruffy::Components::Legend.new(:legend, :position => [5, 13], :size => [90, 6])
19
+ end
20
+ end
21
+
22
+ protected
23
+ def hide_values
24
+ super
25
+ component(:view).position[0] = -10
26
+ component(:view).size[0] = 100
27
+ end
28
+
29
+ def labels
30
+ [component(:view).component(:labels)]
31
+ end
32
+
33
+ def values
34
+ [component(:view).component(:values)]
35
+ end
36
+
37
+ def grids
38
+ [component(:view).component(:grid),component(:view).component(:vgrid)]
39
+ end
40
+ end
41
+ end
@@ -30,9 +30,11 @@ module Scruffy::Renderers
30
30
  rendertime_renderer.instance_eval { before_render if respond_to?(:before_render) }
31
31
 
32
32
  svg = Builder::XmlMarkup.new(:indent => 2)
33
- svg.instruct!
34
- svg.declare!(:DOCTYPE, :svg, :PUBLIC, "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd")
35
- svg.svg(:xmlns => "http://www.w3.org/2000/svg", 'xmlns:xlink' => "http://www.w3.org/1999/xlink", :viewBox => "#{options[:size].first} 100 #{options[:size].last} 200") {
33
+ unless options[:no_doctype_header]
34
+ svg.instruct!
35
+ svg.declare! :DOCTYPE, :svg, :PUBLIC, "-//W3C//DTD SVG 1.0//EN", "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
36
+ end
37
+ svg.svg(:xmlns => "http://www.w3.org/2000/svg", 'xmlns:xlink' => "http://www.w3.org/1999/xlink", :width => options[:size].first, :height => options[:size].last) {
36
38
  svg.g(:id => options[:graph_id]) {
37
39
  rendertime_renderer.components.each do |component|
38
40
  component.render(svg,
@@ -90,4 +92,4 @@ module Scruffy::Renderers
90
92
  end
91
93
  end
92
94
  end # base
93
- end
95
+ end
@@ -0,0 +1,20 @@
1
+ module Scruffy::Renderers
2
+ # ===Scruffy::Renderers::Basic
3
+ #
4
+ # Author:: Martyn Taylor
5
+ # Date:: July 30th 2010
6
+ #
7
+ # The Basic Renderer Creates a Blank Graph with everything ready for adding components
8
+ class Basic < Base
9
+
10
+ def define_layout
11
+ components << Scruffy::Components::Background.new(:background, :position => [0,0], :size =>[100, 100])
12
+ components << Scruffy::Components::Viewport.new(:view, :position => [2, 26], :size => [89, 66]) do |graph|
13
+ graph << Scruffy::Components::Graphs.new(:graphs, :position => [3, 0], :size => [80, 89])
14
+ graph << Scruffy::Components::ValueMarkers.new(:values, :position => [0, 0], :size => [1, 89])
15
+ graph << Scruffy::Components::Axis.new(:values, :position => [3, 0], :size => [80, 89])
16
+ end
17
+ yield(self.components) if block_given?
18
+ end
19
+ end
20
+ end
@@ -4,11 +4,12 @@ module Scruffy::Renderers
4
4
  def define_layout
5
5
  super do |components|
6
6
  components << Scruffy::Components::Title.new(:title, :position => [5, 2], :size => [90, 7])
7
- components << Scruffy::Components::Viewport.new(:view, :position => [2, 26], :size => [89, 66]) do |graph|
8
- graph << Scruffy::Components::ValueMarkers.new(:values, :position => [0, 2], :size => [18, 89])
9
- graph << Scruffy::Components::Grid.new(:grid, :position => [20, 0], :size => [80, 89])
10
- graph << Scruffy::Components::DataMarkers.new(:labels, :position => [20, 92], :size => [80, 8])
11
- graph << Scruffy::Components::Graphs.new(:graphs, :position => [20, 0], :size => [80, 89])
7
+ components << Scruffy::Components::Viewport.new(:view, :position => [2, 26], :size => [90, 66]) do |graph|
8
+ graph << Scruffy::Components::ValueMarkers.new(:values, :position => [0, 2], :size => [8, 89])
9
+ graph << Scruffy::Components::Grid.new(:grid, :position => [10, 0], :size => [90, 89], :stroke_width => 1)
10
+ graph << Scruffy::Components::VGrid.new(:vgrid, :position => [10, 0], :size => [90, 89], :stroke_width => 1)
11
+ graph << Scruffy::Components::DataMarkers.new(:labels, :position => [10, 92], :size => [90, 8])
12
+ graph << Scruffy::Components::Graphs.new(:graphs, :position => [10, 0], :size => [90, 89])
12
13
  end
13
14
  components << Scruffy::Components::Legend.new(:legend, :position => [5, 13], :size => [90, 6])
14
15
  end
@@ -30,7 +31,7 @@ module Scruffy::Renderers
30
31
  end
31
32
 
32
33
  def grids
33
- [component(:view).component(:grid)]
34
+ [component(:view).component(:grid),component(:view).component(:vgrid)]
34
35
  end
35
36
  end
36
37
  end
@@ -19,8 +19,13 @@ module Scruffy::Themes
19
19
  class Base
20
20
  attr_accessor :background # Background color or array of two colors
21
21
  attr_accessor :colors # Array of colors for data graphs
22
+ attr_accessor :outlines # Array of colors for outlines of elements for data graphs
23
+ attr_accessor :grid # Marker color for grid lines, etc.
22
24
  attr_accessor :marker # Marker color for grid lines, values, etc.
23
25
  attr_accessor :font_family # Font family: Not really supported. Maybe in the future.
26
+ attr_accessor :marker_font_size # Marker Font Size:
27
+ attr_accessor :title_font_size # Title Font Size:
28
+ attr_accessor :legend_font_size # Legend Font Size:
24
29
 
25
30
  # Returns a new Scruffy::Themes::Base object.
26
31
  #
@@ -34,17 +39,33 @@ module Scruffy::Themes
34
39
  def initialize(descriptor)
35
40
  self.background = descriptor[:background]
36
41
  self.colors = descriptor[:colors]
42
+ self.outlines = descriptor[:outlines]
43
+ self.grid = descriptor[:grid]
37
44
  self.marker = descriptor[:marker]
38
45
  self.font_family = descriptor[:font_family]
46
+ self.marker_font_size = descriptor[:marker_font_size]
47
+ self.title_font_size = descriptor[:title_font_size]
48
+ self.legend_font_size = descriptor[:legend_font_size]
39
49
  end
40
50
 
41
51
  # Returns the next available color in the color array.
42
52
  def next_color
43
- @previous_color ||= 0
53
+ @previous_color = 0 if @previous_color.nil?
44
54
  @previous_color += 1
45
55
 
46
56
  self.colors[(@previous_color-1) % self.colors.size]
47
57
  end
58
+
59
+
60
+ # Returns the next available outline in the outline array.
61
+ def next_outline
62
+ @previous_outline = 0 if @previous_outline.nil?
63
+ @previous_outline += 1
64
+ if self.outlines.nil?
65
+ return "#000000"
66
+ end
67
+ self.outlines[(@previous_outline-1) % self.outlines.size]
68
+ end
48
69
 
49
70
  # todo: Implement darken function.
50
71
  def darken(color, shift=20); end
@@ -54,6 +75,21 @@ module Scruffy::Themes
54
75
 
55
76
  end
56
77
 
78
+
79
+
80
+ # A basic default theme
81
+ # Based on http://www.wellstyled.com/tools/colorscheme2/index-en.html?tetrad;50;0;255;1;-1;1;-0.6;0.1;1;0.6;1;1;-1;1;-0.6;0.1;1;0.6;1;1;-1;1;-0.6;0.1;1;0.6;1;1;-1;1;-0.6;0.1;1;0.6;1;0
82
+ class Standard < Base
83
+ def initialize
84
+ super({
85
+ :background => ['#FFFFFF', '#FFFFFF'],
86
+ :marker => '#999999',
87
+ :colors => %w(#1919B3 #FFB200 #FFFF00 #660099 #E9E9FF #FFF7E6 #FFFFE6 #F7E6FF #0F0F6B #996B00 #999900 #3D005C)
88
+ })
89
+
90
+ end
91
+ end
92
+
57
93
  # Keynote theme, based on Apple's Keynote presentation software.
58
94
  #
59
95
  # Color values used from Gruff's default theme.
@@ -1,9 +1,3 @@
1
1
  module Scruffy
2
- module VERSION #:nodoc:
3
- MAJOR = 0
4
- MINOR = 2
5
- TINY = 6
6
-
7
- STRING = [MAJOR, MINOR, TINY].join('.')
8
- end
2
+ VERSION = '0.3.0.beta1'
9
3
  end
@@ -0,0 +1,55 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" type>
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="360">
4
+ <g id="scruffy_graph">
5
+ <g id="background" transform="translate(0.0, 0.0)">
6
+ <defs>
7
+ <linearGradient id="BackgroundGradient" x1="0%" y1="0%" x2="0%" y2="100%">
8
+ <stop offset="5%" stop-color="#FFFFFF"/>
9
+ <stop offset="95%" stop-color="#FFFFFF"/>
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="600.0" height="360.0" x="0" y="0" fill="url(#BackgroundGradient) #FFFFFF"/>
13
+ </g>
14
+ <g id="title" transform="translate(30.0, 7.2)">
15
+ <text class="title" x="270.0" y="25.200000000000003" font-size="25.200000000000003" font-family="" fill="#999999" stroke="none" stroke-width="0" text-anchor="middle">Graph</text>
16
+ </g>
17
+ <g id="view" transform="translate(12.0, 93.60000000000001)">
18
+ <g>
19
+ <g id="values" transform="translate(0.0, 4.752000000000001)">
20
+ <text x="43.2" y="211.46400000000003" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">0</text>
21
+ <text x="43.2" y="158.598" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">1</text>
22
+ <text x="43.2" y="105.73200000000001" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">2</text>
23
+ <text x="43.2" y="52.866000000000014" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">3</text>
24
+ <text x="43.2" y="0.0" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">4</text>
25
+ </g>
26
+ <g id="grid" transform="translate(54.0, 0.0)">
27
+ <line x1="0" y1="0.0" x2="486.0" y2="0.0" style="stroke: #999999; stroke-width: 1;"/>
28
+ <line x1="0" y1="52.86600000000001" x2="486.0" y2="52.86600000000001" style="stroke: #999999; stroke-width: 1;"/>
29
+ <line x1="0" y1="105.73200000000001" x2="486.0" y2="105.73200000000001" style="stroke: #999999; stroke-width: 1;"/>
30
+ <line x1="0" y1="158.598" x2="486.0" y2="158.598" style="stroke: #999999; stroke-width: 1;"/>
31
+ <line x1="0" y1="211.46400000000003" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
32
+ <line x1="0" y1="211.46400000000003" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
33
+ </g>
34
+ <g id="vgrid" transform="translate(54.0, 0.0)">
35
+ <line x1="0.0" y1="0" x2="0.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
36
+ <line x1="121.5" y1="0" x2="121.5" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
37
+ <line x1="243.0" y1="0" x2="243.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
38
+ <line x1="364.5" y1="0" x2="364.5" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
39
+ <line x1="486.0" y1="0" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
40
+ </g>
41
+ <g id="labels" transform="translate(54.0, 218.59200000000004)">
42
+ </g>
43
+ <g id="graphs" transform="translate(54.0, 0.0)">
44
+ <g id="component_graphs_graph_0" class="graph_layer">
45
+ <polyline points="60.75,158.598 182.25,105.73200000000001 425.25,0.0" fill="none" stroke="#1919B3" stroke-width="1" style=""/>
46
+ </g>
47
+ </g>
48
+ </g>
49
+ </g>
50
+ <g id="legend" transform="translate(30.0, 46.800000000000004)">
51
+ <rect x="243.0" y="0" width="10.799999999999999" height="10.799999999999999" fill="#1919B3"/>
52
+ <text x="262.44" y="11.663999999999998" font-size="15.551999999999998" font-family="" style="color: #999999" fill="#999999">Data</text>
53
+ </g>
54
+ </g>
55
+ </svg>
@@ -0,0 +1,55 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" type>
3
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="360">
4
+ <g id="scruffy_graph">
5
+ <g id="background" transform="translate(0.0, 0.0)">
6
+ <defs>
7
+ <linearGradient id="BackgroundGradient" x1="0%" y1="0%" x2="0%" y2="100%">
8
+ <stop offset="5%" stop-color="#FFFFFF"/>
9
+ <stop offset="95%" stop-color="#FFFFFF"/>
10
+ </linearGradient>
11
+ </defs>
12
+ <rect width="600.0" height="360.0" x="0" y="0" fill="url(#BackgroundGradient) #FFFFFF"/>
13
+ </g>
14
+ <g id="title" transform="translate(30.0, 7.2)">
15
+ <text class="title" x="270.0" y="25.200000000000003" font-size="25.200000000000003" font-family="" fill="#999999" stroke="none" stroke-width="0" text-anchor="middle">Graph</text>
16
+ </g>
17
+ <g id="view" transform="translate(12.0, 93.60000000000001)">
18
+ <g>
19
+ <g id="values" transform="translate(0.0, 4.752000000000001)">
20
+ <text x="43.2" y="211.46400000000003" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">0</text>
21
+ <text x="43.2" y="158.598" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">1</text>
22
+ <text x="43.2" y="105.73200000000001" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">2</text>
23
+ <text x="43.2" y="52.866000000000014" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">3</text>
24
+ <text x="43.2" y="0.0" font-size="16.917120000000004" font-family="" fill="#999999" text-anchor="end">4</text>
25
+ </g>
26
+ <g id="grid" transform="translate(54.0, 0.0)">
27
+ <line x1="0" y1="0.0" x2="486.0" y2="0.0" style="stroke: #999999; stroke-width: 1;"/>
28
+ <line x1="0" y1="52.86600000000001" x2="486.0" y2="52.86600000000001" style="stroke: #999999; stroke-width: 1;"/>
29
+ <line x1="0" y1="105.73200000000001" x2="486.0" y2="105.73200000000001" style="stroke: #999999; stroke-width: 1;"/>
30
+ <line x1="0" y1="158.598" x2="486.0" y2="158.598" style="stroke: #999999; stroke-width: 1;"/>
31
+ <line x1="0" y1="211.46400000000003" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
32
+ <line x1="0" y1="211.46400000000003" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
33
+ </g>
34
+ <g id="vgrid" transform="translate(54.0, 0.0)">
35
+ <line x1="0.0" y1="0" x2="0.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
36
+ <line x1="121.5" y1="0" x2="121.5" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
37
+ <line x1="243.0" y1="0" x2="243.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
38
+ <line x1="364.5" y1="0" x2="364.5" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
39
+ <line x1="486.0" y1="0" x2="486.0" y2="211.46400000000003" style="stroke: #999999; stroke-width: 1;"/>
40
+ </g>
41
+ <g id="labels" transform="translate(54.0, 218.59200000000004)">
42
+ </g>
43
+ <g id="graphs" transform="translate(54.0, 0.0)">
44
+ <g id="component_graphs_graph_0" class="graph_layer">
45
+ <polyline points="60.75,158.598 182.25,105.73200000000001 425.25,0.0" fill="none" stroke="#1919B3" stroke-width="1" style=""/>
46
+ </g>
47
+ </g>
48
+ </g>
49
+ </g>
50
+ <g id="legend" transform="translate(30.0, 46.800000000000004)">
51
+ <rect x="243.0" y="0" width="10.799999999999999" height="10.799999999999999" fill="#1919B3"/>
52
+ <text x="262.44" y="11.663999999999998" font-size="15.551999999999998" font-family="" style="color: #999999" fill="#999999">Data</text>
53
+ </g>
54
+ </g>
55
+ </svg>