scruffy 0.2.6 → 0.3.0.beta1

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 (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>