Skip to content

Commit

Permalink
Fix for column/bar gap/overlap on y2 axis.
Browse files Browse the repository at this point in the history
Issue #177
  • Loading branch information
jmcnamara committed Nov 9, 2014
1 parent 9d9817c commit 7bbdec0
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 16 deletions.
24 changes: 16 additions & 8 deletions xlsxwriter/chart.py
Expand Up @@ -78,8 +78,10 @@ def __init__(self, options=None):
self.table = None
self.cross_between = 'between'
self.default_marker = None
self.series_gap = None
self.series_overlap = None
self.series_gap_1 = None
self.series_gap_2 = None
self.series_overlap_1 = None
self.series_overlap_2 = None
self.drop_lines = None
self.hi_low_lines = None
self.up_down_bars = None
Expand Down Expand Up @@ -168,17 +170,23 @@ def add_series(self, options):
# Set the "invert if negative" fill property.
invert_if_neg = options.get('invert_if_negative', False)

# Set the secondary axis properties.
x2_axis = options.get('x2_axis')
y2_axis = options.get('y2_axis')

# Set the gap for Bar/Column charts.
if options.get('gap') is not None:
self.series_gap = options['gap']
if y2_axis:
self.series_gap_2 = options['gap']
else:
self.series_gap_1 = options['gap']

# Set the overlap for Bar/Column charts.
if options.get('overlap'):
self.series_overlap = options['overlap']

# Set the secondary axis properties.
x2_axis = options.get('x2_axis')
y2_axis = options.get('y2_axis')
if y2_axis:
self.series_overlap_2 = options['overlap']
else:
self.series_overlap_1 = options['overlap']

# Add the user supplied data to the internal structures.
series = {
Expand Down
14 changes: 10 additions & 4 deletions xlsxwriter/chart_bar.py
Expand Up @@ -97,8 +97,8 @@ def _write_bar_chart(self, args):

# Set a default overlap for stacked charts.
if 'stacked' in self.subtype:
if self.series_overlap is None:
self.series_overlap = 100
if self.series_overlap_1 is None:
self.series_overlap_1 = 100

self._xml_start_tag('c:barChart')

Expand All @@ -116,10 +116,16 @@ def _write_bar_chart(self, args):
self._write_marker_value()

# Write the c:gapWidth element.
self._write_gap_width(self.series_gap)
if args['primary_axes']:
self._write_gap_width(self.series_gap_1)
else:
self._write_gap_width(self.series_gap_2)

# Write the c:overlap element.
self._write_overlap(self.series_overlap)
if args['primary_axes']:
self._write_overlap(self.series_overlap_1)
else:
self._write_overlap(self.series_overlap_2)

# Write the c:axId elements
self._write_axis_ids(args)
Expand Down
14 changes: 10 additions & 4 deletions xlsxwriter/chart_column.py
Expand Up @@ -80,8 +80,8 @@ def _write_bar_chart(self, args):

# Set a default overlap for stacked charts.
if 'stacked' in self.subtype:
if self.series_overlap is None:
self.series_overlap = 100
if self.series_overlap_1 is None:
self.series_overlap_1 = 100

self._xml_start_tag('c:barChart')

Expand All @@ -99,10 +99,16 @@ def _write_bar_chart(self, args):
self._write_marker_value()

# Write the c:gapWidth element.
self._write_gap_width(self.series_gap)
if args['primary_axes']:
self._write_gap_width(self.series_gap_1)
else:
self._write_gap_width(self.series_gap_2)

# Write the c:overlap element.
self._write_overlap(self.series_overlap)
if args['primary_axes']:
self._write_overlap(self.series_overlap_1)
else:
self._write_overlap(self.series_overlap_2)

# Write the c:axId elements
self._write_axis_ids(args)
Expand Down
59 changes: 59 additions & 0 deletions xlsxwriter/test/comparison/test_chart_gap04.py
@@ -0,0 +1,59 @@
###############################################################################
#
# Tests for XlsxWriter.
#
# Copyright (c), 2013-2014, John McNamara, jmcnamara@cpan.org
#

from ..excel_comparsion_test import ExcelComparisonTest
from ...workbook import Workbook


class TestCompareXLSXFiles(ExcelComparisonTest):
"""
Test file created by XlsxWriter against a file created by Excel.
"""

def setUp(self):
self.maxDiff = None

filename = 'chart_gap04.xlsx'

test_dir = 'xlsxwriter/test/comparison/'
self.got_filename = test_dir + '_test_' + filename
self.exp_filename = test_dir + 'xlsx_files/' + filename

self.ignore_files = []
self.ignore_elements = {}

def test_create_file(self):
"""Test the creation of a simple XlsxWriter file."""

workbook = Workbook(self.got_filename)

worksheet = workbook.add_worksheet()
chart = workbook.add_chart({'type': 'column'})

chart.axis_ids = [45938176, 59715584]
chart.axis2_ids = [62526208, 59718272]

data = [[1, 2, 3, 4, 5],
[6, 8, 6, 4, 2]]

worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])

chart.add_series({'values': '=Sheet1!$A$1:$A$5',
'gap': 51,
'overlap': 12})
chart.add_series({'values': '=Sheet1!$B$1:$B$5',
'y2_axis': 1,
'gap': 251,
'overlap': -27})

worksheet.insert_chart('E9', chart)

workbook.close()

self.assertExcelEqual()
61 changes: 61 additions & 0 deletions xlsxwriter/test/comparison/test_chart_gap05.py
@@ -0,0 +1,61 @@
###############################################################################
#
# Tests for XlsxWriter.
#
# Copyright (c), 2013-2014, John McNamara, jmcnamara@cpan.org
#

from ..excel_comparsion_test import ExcelComparisonTest
from ...workbook import Workbook


class TestCompareXLSXFiles(ExcelComparisonTest):
"""
Test file created by XlsxWriter against a file created by Excel.
"""

def setUp(self):
self.maxDiff = None

filename = 'chart_gap05.xlsx'

test_dir = 'xlsxwriter/test/comparison/'
self.got_filename = test_dir + '_test_' + filename
self.exp_filename = test_dir + 'xlsx_files/' + filename

self.ignore_files = []
self.ignore_elements = {}

def test_create_file(self):
"""Test the creation of a simple XlsxWriter file."""

workbook = Workbook(self.got_filename)

worksheet = workbook.add_worksheet()
chart = workbook.add_chart({'type': 'bar'})

chart.axis_ids = [45938176, 59715584]
chart.axis2_ids = [70848512, 54519680]

data = [[1, 2, 3, 4, 5],
[6, 8, 6, 4, 2]]

worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])

chart.add_series({'values': '=Sheet1!$A$1:$A$5',
'gap': 51,
'overlap': 12})
chart.add_series({'values': '=Sheet1!$B$1:$B$5',
'y2_axis': 1,
'gap': 251,
'overlap': -27})

chart.set_x2_axis({'label_position': 'next_to'})

worksheet.insert_chart('E9', chart)

workbook.close()

self.assertExcelEqual()
Binary file not shown.
Binary file not shown.

0 comments on commit 7bbdec0

Please sign in to comment.