summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJoe Kain <[email protected]>2012-03-16 20:29:35 -0700
committerJoe Kain <[email protected]>2012-03-22 21:55:47 -0700
commit8a0f840313df5ab5543b491d475650b1b63b558e (patch)
tree7bcace32256656a13afe8649bcf02a97bb66747b
parent7881ee37e08d7768f8ba7c9270f2f07ea8b78cd0 (diff)
downloadcaxlsx-8a0f840313df5ab5543b491d475650b1b63b558e.tar.gz
caxlsx-8a0f840313df5ab5543b491d475650b1b63b558e.zip
Add Scatter charts
-rw-r--r--lib/axlsx/drawing/drawing.rb3
-rw-r--r--lib/axlsx/drawing/named_axis_data.rb31
-rw-r--r--lib/axlsx/drawing/scatter_chart.rb50
-rw-r--r--lib/axlsx/drawing/scatter_series.rb31
-rw-r--r--test/drawing/tc_scatter_chart.rb33
-rw-r--r--test/drawing/tc_scatter_series.rb21
6 files changed, 169 insertions, 0 deletions
diff --git a/lib/axlsx/drawing/drawing.rb b/lib/axlsx/drawing/drawing.rb
index b9a31150..93068a23 100644
--- a/lib/axlsx/drawing/drawing.rb
+++ b/lib/axlsx/drawing/drawing.rb
@@ -6,6 +6,7 @@ module Axlsx
require 'axlsx/drawing/pie_series.rb'
require 'axlsx/drawing/bar_series.rb'
require 'axlsx/drawing/line_series.rb'
+ require 'axlsx/drawing/scatter_series.rb'
require 'axlsx/drawing/scaling.rb'
require 'axlsx/drawing/axis.rb'
@@ -15,6 +16,7 @@ module Axlsx
require 'axlsx/drawing/cat_axis_data.rb'
require 'axlsx/drawing/val_axis_data.rb'
+ require 'axlsx/drawing/named_axis_data.rb'
require 'axlsx/drawing/marker.rb'
@@ -27,6 +29,7 @@ module Axlsx
require 'axlsx/drawing/pie_3D_chart.rb'
require 'axlsx/drawing/bar_3D_chart.rb'
require 'axlsx/drawing/line_3D_chart.rb'
+ require 'axlsx/drawing/scatter_chart.rb'
require 'axlsx/drawing/picture_locking.rb'
require 'axlsx/drawing/pic.rb'
diff --git a/lib/axlsx/drawing/named_axis_data.rb b/lib/axlsx/drawing/named_axis_data.rb
new file mode 100644
index 00000000..b249196f
--- /dev/null
+++ b/lib/axlsx/drawing/named_axis_data.rb
@@ -0,0 +1,31 @@
+# encoding: UTF-8
+module Axlsx
+ # The ValAxisData class manages the values for a chart value series.
+ class NamedAxisData < CatAxisData
+
+ def initialize(name, data=[])
+ super(data)
+ @name = name
+ end
+
+ # Serializes the value axis data
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
+ # @return [String]
+ def to_xml(xml)
+ xml.send(@name) {
+ xml.numRef {
+ xml.f Axlsx::cell_range(@list)
+ xml.numCache {
+ xml.formatCode 'General'
+ xml.ptCount :val=>size
+ each_with_index do |item, index|
+ v = item.is_a?(Cell) ? item.value : item
+ xml.pt(:idx=>index) { xml.v v }
+ end
+ }
+ }
+ }
+ end
+ end
+
+end
diff --git a/lib/axlsx/drawing/scatter_chart.rb b/lib/axlsx/drawing/scatter_chart.rb
new file mode 100644
index 00000000..f257303a
--- /dev/null
+++ b/lib/axlsx/drawing/scatter_chart.rb
@@ -0,0 +1,50 @@
+# encoding: UTF-8
+module Axlsx
+ class ScatterChart < Chart
+ attr_reader :scatterStyle
+
+ # the x value axis
+ # @return [ValAxis]
+ attr_reader :xValAxis
+
+ # the y value axis
+ # @return [ValAxis]
+ attr_reader :yValAxis
+
+ def initialize(frame, options={})
+ @scatterStyle = :lineMarker
+ @xValAxId = rand(8 ** 8)
+ @yValAxId = rand(8 ** 8)
+ @xValAxis = ValAxis.new(@xValAxId, @yValAxId)
+ @yValAxis = ValAxis.new(@yValAxId, @xValAxId)
+ super(frame, options)
+ @series_type = ScatterSeries
+ end
+
+ # Serializes the bar chart
+ # @return [String]
+ def to_xml
+ super() do |xml|
+ xml.scatterChart {
+ xml.scatterStyle :val=>scatterStyle
+
+ # This is all repeated from line_3D_chart.rb!
+ xml.varyColors :val=>1
+ @series.each { |ser| ser.to_xml(xml) }
+ xml.dLbls {
+ xml.showLegendKey :val=>0
+ xml.showVal :val=>0
+ xml.showCatName :val=>0
+ xml.showSerName :val=>0
+ xml.showPercent :val=>0
+ xml.showBubbleSize :val=>0
+ }
+ xml.axId :val=>@xValAxId
+ xml.axId :val=>@yValAxId
+ }
+ @xValAxis.to_xml(xml)
+ @yValAxis.to_xml(xml)
+ end
+ end
+ end
+end
diff --git a/lib/axlsx/drawing/scatter_series.rb b/lib/axlsx/drawing/scatter_series.rb
new file mode 100644
index 00000000..52145cd1
--- /dev/null
+++ b/lib/axlsx/drawing/scatter_series.rb
@@ -0,0 +1,31 @@
+# encoding: UTF-8
+module Axlsx
+ class ScatterSeries < Series
+ # The x data for this series.
+ # @return [NamedAxisData]
+ attr_reader :xData
+
+ # The y data for this series.
+ # @return [NamedAxisData]
+ attr_reader :yData
+
+ def initialize(chart, options={})
+ @xData, @yData = nil
+ super(chart, options)
+
+ @xData = NamedAxisData.new("xVal", options[:xData]) unless options[:xData].nil?
+ @yData = NamedAxisData.new("yVal", options[:yData]) unless options[:yData].nil?
+ end
+
+ # Serializes the series
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
+ # @return [String]
+ def to_xml(xml)
+ super(xml) do |xml_inner|
+ @xData.to_xml(xml_inner) unless @xData.nil?
+ @yData.to_xml(xml_inner) unless @yData.nil?
+ end
+ end
+
+ end
+end
diff --git a/test/drawing/tc_scatter_chart.rb b/test/drawing/tc_scatter_chart.rb
new file mode 100644
index 00000000..478fbf49
--- /dev/null
+++ b/test/drawing/tc_scatter_chart.rb
@@ -0,0 +1,33 @@
+require 'test/unit'
+require 'axlsx.rb'
+
+class TestScatterChart < Test::Unit::TestCase
+ def setup
+ @p = Axlsx::Package.new
+ ws = @p.workbook.add_worksheet
+ @row = ws.add_row ["one", 1, Time.now]
+ @chart = ws.add_chart Axlsx::ScatterChart, :title => "A Title"
+ end
+
+ def teardown
+ end
+
+ def test_initialization
+ assert_equal(@chart.scatterStyle, :lineMarker, "scatterStyle defualt incorrect")
+ assert_equal(@chart.series_type, Axlsx::ScatterSeries, "series type incorrect")
+ assert(@chart.xValAxis.is_a?(Axlsx::ValAxis), "independant value axis not created")
+ assert(@chart.yValAxis.is_a?(Axlsx::ValAxis), "dependant value axis not created")
+ end
+
+ def test_to_xml
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
+ doc = Nokogiri::XML(@chart.to_xml)
+ errors = []
+ schema.validate(doc).each do |error|
+ errors.push error
+ puts error.message
+ end
+ assert(errors.empty?, "error free validation")
+ end
+
+end
diff --git a/test/drawing/tc_scatter_series.rb b/test/drawing/tc_scatter_series.rb
new file mode 100644
index 00000000..37ef4949
--- /dev/null
+++ b/test/drawing/tc_scatter_series.rb
@@ -0,0 +1,21 @@
+require 'test/unit'
+require 'axlsx.rb'
+
+class TestScatterSeries < Test::Unit::TestCase
+
+ def setup
+ p = Axlsx::Package.new
+ @ws = p.workbook.add_worksheet :name=>"hmmm"
+ chart = @ws.drawing.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
+ @series = chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents"
+ end
+
+ def test_initialize
+ assert_equal(@series.title.text, "exponents", "series title has been applied")
+ end
+
+ def test_data
+ assert_equal(@series.xData, [1,2,4])
+ assert_equal(@series.yData, [1,3,9])
+ end
+end