From ad1fa66beecd42c38b528ceb9bbcba61e16d28a9 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Sun, 8 Jan 2017 01:04:34 +0000 Subject: [PATCH] Added option to set chart axis horizontal position. --- .indent.pro | 1 + docs/images/chart_axis_set_position.png | Bin 0 -> 54471 bytes include/xlsxwriter/chart.h | 43 +++++++++++++++--- src/chart.c | 29 +++++++++--- test/functional/src/test_chart_axis30.c | 44 +++++++++++++++++++ test/functional/src/test_chart_axis31.c | 44 +++++++++++++++++++ test/functional/src/test_chart_axis32.c | 44 +++++++++++++++++++ test/functional/test_chart_axis.py | 9 +++- test/functional/xlsx_files/chart_axis30.xlsx | Bin 0 -> 9281 bytes test/functional/xlsx_files/chart_axis31.xlsx | Bin 0 -> 9266 bytes test/functional/xlsx_files/chart_axis32.xlsx | Bin 0 -> 9251 bytes 11 files changed, 202 insertions(+), 12 deletions(-) create mode 100644 docs/images/chart_axis_set_position.png create mode 100644 test/functional/src/test_chart_axis30.c create mode 100644 test/functional/src/test_chart_axis31.c create mode 100644 test/functional/src/test_chart_axis32.c create mode 100644 test/functional/xlsx_files/chart_axis30.xlsx create mode 100644 test/functional/xlsx_files/chart_axis31.xlsx create mode 100644 test/functional/xlsx_files/chart_axis32.xlsx diff --git a/.indent.pro b/.indent.pro index 2c59caf9..92c4a90f 100644 --- a/.indent.pro +++ b/.indent.pro @@ -49,6 +49,7 @@ -T lxw_cell -T lxw_chart -T lxw_chart_axis +-T lxw_chart_axis_tick_position -T lxw_chart_fill -T lxw_chart_font -T lxw_chart_gridline diff --git a/docs/images/chart_axis_set_position.png b/docs/images/chart_axis_set_position.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6f55e074cdbed31e02ffe6a82a5751ebf1d9f3 GIT binary patch literal 54471 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 literal 0 HcmV?d00001 diff --git a/include/xlsxwriter/chart.h b/include/xlsxwriter/chart.h index 01f0e19d..3fc709e3 100644 --- a/include/xlsxwriter/chart.h +++ b/include/xlsxwriter/chart.h @@ -422,10 +422,18 @@ enum lxw_chart_grouping { LXW_GROUPING_STACKED }; -enum lxw_chart_axis_tick_position { - LXW_CHART_AXIS_POSITION_BETWEEN, - LXW_CHART_AXIS_POSITION_ON_TICK -}; +/** + * @brief Axis positions for category axes. + */ +typedef enum lxw_chart_axis_tick_position { + LXW_CHART_AXIS_POSITION_DEFAULT, + + /** Position category axis on tick marks. */ + LXW_CHART_AXIS_POSITION_ON_TICK, + + /** Position category axis between tick marks. */ + LXW_CHART_AXIS_POSITION_BETWEEN +} lxw_chart_axis_tick_position; enum lxw_chart_position { LXW_CHART_AXIS_RIGHT, @@ -653,6 +661,8 @@ typedef struct lxw_chart_axis { lxw_chart_fill *fill; lxw_chart_pattern *pattern; + uint8_t is_category; + uint8_t position_axis; uint8_t hidden; uint8_t reverse; uint8_t has_min; @@ -716,7 +726,7 @@ typedef struct lxw_chart { int series_overlap_1; uint8_t grouping; - uint8_t cross_between; + uint8_t default_cross_between; uint8_t cat_axis_position; uint8_t val_axis_position; @@ -1342,6 +1352,29 @@ void chart_axis_set_reverse(lxw_chart_axis *axis); */ void chart_axis_off(lxw_chart_axis *axis); +/** + * @brief Position the axis on or between the axis tick marks. + * + * @param axis A pointer to a chart #lxw_chart_axis object. + * @param position A #lxw_chart_axis_tick_position value. + * + * Position a category axis horizontally on, or between, the axis tick marks. + * + * There are two allowable values: + * + * - #LXW_CHART_AXIS_POSITION_ON_TICK + * - #LXW_CHART_AXIS_POSITION_BETWEEN + * + * @code + * chart_axis_set_position(chart->x_axis, LXW_CHART_AXIS_POSITION_BETWEEN); + * @endcode + * + * @image html chart_axis_set_position.png + * + * Applicable to category axes only. + */ +void chart_axis_set_position(lxw_chart_axis *axis, uint8_t position); + /** * @brief Set the minimum value for a chart axis. * diff --git a/src/chart.c b/src/chart.c index 2137dcde..29fae8af 100644 --- a/src/chart.c +++ b/src/chart.c @@ -2406,14 +2406,17 @@ _chart_write_number_format(lxw_chart *self, lxw_chart_axis *axis) * Write the element. */ STATIC void -_chart_write_cross_between(lxw_chart *self) +_chart_write_cross_between(lxw_chart *self, uint8_t position) { struct xml_attribute_list attributes; struct xml_attribute *attribute; + if (!position) + position = self->default_cross_between; + LXW_INIT_ATTRIBUTES(); - if (self->cross_between) + if (position == LXW_CHART_AXIS_POSITION_ON_TICK) LXW_PUSH_ATTRIBUTES_STR("val", "midCat"); else LXW_PUSH_ATTRIBUTES_STR("val", "between"); @@ -2803,7 +2806,7 @@ _chart_write_val_axis(lxw_chart *self) _chart_write_crosses(self); /* Write the c:crossBetween element. */ - _chart_write_cross_between(self); + _chart_write_cross_between(self, self->x_axis->position_axis); lxw_xml_end_tag(self->file, "c:valAx"); } @@ -2867,7 +2870,7 @@ _chart_write_cat_val_axis(lxw_chart *self) _chart_write_crosses(self); /* Write the c:crossBetween element. */ - _chart_write_cross_between(self); + _chart_write_cross_between(self, self->y_axis->position_axis); lxw_xml_end_tag(self->file, "c:valAx"); } @@ -3233,7 +3236,8 @@ STATIC void _chart_initialize_area_chart(lxw_chart *self, uint8_t type) { self->grouping = LXW_GROUPING_STANDARD; - self->cross_between = LXW_CHART_AXIS_POSITION_ON_TICK; + self->default_cross_between = LXW_CHART_AXIS_POSITION_ON_TICK; + self->x_axis->is_category = LXW_TRUE; if (type == LXW_CHART_AREA_STACKED) { self->grouping = LXW_GROUPING_STACKED; @@ -3267,6 +3271,7 @@ _chart_initialize_bar_chart(lxw_chart *self, uint8_t type) /*Also reverse some of the defaults. */ self->x_axis->major_gridlines.visible = LXW_FALSE; self->y_axis->major_gridlines.visible = LXW_TRUE; + self->x_axis->is_category = LXW_TRUE; self->has_horiz_cat_axis = LXW_TRUE; self->has_horiz_val_axis = LXW_FALSE; @@ -3300,6 +3305,7 @@ STATIC void _chart_initialize_column_chart(lxw_chart *self, uint8_t type) { self->has_horiz_val_axis = LXW_FALSE; + self->x_axis->is_category = LXW_TRUE; if (type == LXW_CHART_COLUMN_STACKED) { self->grouping = LXW_GROUPING_STACKED; @@ -3338,6 +3344,7 @@ _chart_initialize_line_chart(lxw_chart *self) { _chart_set_default_marker_type(self, LXW_CHART_MARKER_NONE); self->grouping = LXW_GROUPING_STANDARD; + self->x_axis->is_category = LXW_TRUE; /* Initialize the function pointers for this chart type. */ self->write_chart_type = _chart_write_line_chart; @@ -3362,7 +3369,7 @@ STATIC void _chart_initialize_scatter_chart(lxw_chart *self) { self->has_horiz_val_axis = LXW_FALSE; - self->cross_between = LXW_CHART_AXIS_POSITION_ON_TICK; + self->default_cross_between = LXW_CHART_AXIS_POSITION_ON_TICK; self->is_scatter_chart = LXW_TRUE; if (self->type == LXW_CHART_SCATTER_STRAIGHT @@ -3386,6 +3393,7 @@ _chart_initialize_radar_chart(lxw_chart *self, uint8_t type) _chart_set_default_marker_type(self, LXW_CHART_MARKER_NONE); self->x_axis->major_gridlines.visible = LXW_TRUE; + self->x_axis->is_category = LXW_TRUE; self->y_axis->major_tick_mark = LXW_TRUE; @@ -3905,6 +3913,15 @@ chart_axis_off(lxw_chart_axis *axis) axis->hidden = LXW_TRUE; } +/* + * Set the category axis position. + */ +void +chart_axis_set_position(lxw_chart_axis *axis, uint8_t position) +{ + axis->position_axis = position; +} + /* * Set the minimum value for an axis. */ diff --git a/test/functional/src/test_chart_axis30.c b/test/functional/src/test_chart_axis30.c new file mode 100644 index 00000000..ccb3ee7d --- /dev/null +++ b/test/functional/src/test_chart_axis30.c @@ -0,0 +1,44 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_axis30.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_LINE); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 69200896; + chart->axis_id_2 = 69215360; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + chart_axis_set_position(chart->x_axis, LXW_CHART_AXIS_POSITION_ON_TICK); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_axis31.c b/test/functional/src/test_chart_axis31.c new file mode 100644 index 00000000..930c8c2f --- /dev/null +++ b/test/functional/src/test_chart_axis31.c @@ -0,0 +1,44 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_axis31.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 90616960; + chart->axis_id_2 = 90618496; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + chart_axis_set_position(chart->y_axis, LXW_CHART_AXIS_POSITION_ON_TICK); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_axis32.c b/test/functional/src/test_chart_axis32.c new file mode 100644 index 00000000..d1c68c0d --- /dev/null +++ b/test/functional/src/test_chart_axis32.c @@ -0,0 +1,44 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_axis32.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_AREA); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 96171520; + chart->axis_id_2 = 96173056; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + chart_axis_set_position(chart->x_axis, LXW_CHART_AXIS_POSITION_BETWEEN); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/test_chart_axis.py b/test/functional/test_chart_axis.py index 3e688d76..d202d3fd 100644 --- a/test/functional/test_chart_axis.py +++ b/test/functional/test_chart_axis.py @@ -75,11 +75,18 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_axis29(self): self.run_exe_test('test_chart_axis29') + def test_chart_axis30(self): + self.run_exe_test('test_chart_axis30') + + def test_chart_axis31(self): + self.run_exe_test('test_chart_axis31') + + def test_chart_axis32(self): + self.run_exe_test('test_chart_axis32') def test_chart_axis33(self): self.run_exe_test('test_chart_axis33') - def test_chart_axis35(self): self.run_exe_test('test_chart_axis35') diff --git a/test/functional/xlsx_files/chart_axis30.xlsx b/test/functional/xlsx_files/chart_axis30.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5500e745e269c65cbe988515aad196eac2e560ff GIT binary patch literal 9281 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_axis31.xlsx b/test/functional/xlsx_files/chart_axis31.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..08f6008029621a642b03b2a21684a36e9f3d0a4c GIT binary patch literal 9266 zcmeHN^;?wdx}E`P2@yq+&Y_VU0g;d%I;4>XiJ?0rBm|W1ZbUkyVWb%v$)Tha>25ir zYwhh?Ecf{X&e`7&^UZg?^W4|G?{h!>DaxYWAOfHRFaZDn6#!d;eAfmD09@Pv0B!^3 zfZAeE8%GlxM}1W{TN4LeHdkva%B*Q1CjVcbYy&4rO?}!TD%3)yQmB zCrjVRr}bJYb-!56N5kQnnwFov{V2h+$X0SKBJW6oB^UrNPn1F!^d4wv^cwG={Q^67 zG9jU9v&VPf0DxW^?aW=7(MwBVxmg~RIp5%|;LP^EB~^QVI(9rY>(+GISu+8OrV4#T zzL6`oDuKXj-f%kLk)4YDU6|W)OeJhFlk5XZtcPC!0Z+;oCz0cFmF2GZWQ*-li0s6G zfH<)mf8hRiy&x`ceG0SfTpZh`)BH>GqAR}Kb-RHNAP`8OLW%*@;dh*SfWDtRmI z7DaV}?YXU03snkILw5PLdXPvtm!ZeR3)kXwb^HuNYBLL> zE|NE-2G3^atn^)TVv-Ff&I>9+LrLmmE@%w7$rOlib~o&EBRQ0M4a|q5?-!WN#H>6H zY#~=<6&!=Tz{K#tcqeowcv|s+TMp{VzUpNdFCQkHc3S}Mydq|bQ#gnyND_rh``_75 z8NJnWPHlvmMnA2iaBx)vwxgB}8IoGq7o30XAiTcr%a(3lc+xZ=xR@XCS!8 zs*hCLKe-+rG;OUET?<3(a zke*rm_|WOQrlAD4{nsCfxC`58Ve;q`aPF`y3AJv}MA%z;Vqx9d`95qNPhg48DUEQ4pVX4pQNRjw0H^w0K+(z=dJfwOu3RiI%LkpI-pxL2*xq zQ+RY<@KdvF`fxzhdI-}XQ#=`$n1&*DZx3`?wIxH<=O)>-5(Tn zCwL@R&i(kpVzR_*BL{nwr5D6pLOsuVOL15Jl(jc`XtfA4wA0tV`CG8N(Df^*EgPS-*L zJ`lj6AtqrmJQ(!}?_=gVCM9{yHp3{>UBk%)HZ4!o-<|o&JibLL^32zftM~pmb7Ol0 z7YiFR2lhX|Jp5snDJrlZ?yCuzBPeYR*-$3DtHyljTMNKA0Wix=NXaQbGGO+38=YrD z88O5bc}e;N!9H+iIz)z$cI-`xVjplA$hlRcZmPZaVdA{U7+=Upww@PZ- z`yi6gCIlr7$`ZD{?40{NvF7SiW}aFHgsj+bXBN5wn@uH&fx@SHc$}MeY#lk>r;^wa zXeXwEr|peobQ9M*0{b2w3=Lc3!Q+dVJm!bySO~TFbruLgUxIL_!>H=%O$>I4p{=4Z zObmyQcs935p^}}YoO1)8#ta|c9(>+i*UkRyltMfnK3}A#AL;DywP;Tj8anhrW`@SR zha0nsPN5=UwoPP*j*%wKnY~+8caP32utLUr0>!;%LG#71wRNp#*1H z+u6r)v$QM5BIN9Hv5fc^4GvfcJ1PRHBz%-#_X~4XIHpf%;r-%Bcb%D}WNbjAtX(kS==OF@OA z{z@<3Z#RFZ^qpW6a)tTV=70DQ2Xhk>M~6Sd&CiFQto~1%*L%9dbO?+yKKHjKtk}(m zLfQQM7Oc(UFHQ5NpX4jeFzzj+1}fjB?7k1hn6Rkj?i#y$gTe8xDtf6O*nOOWzvcg8mvFSYl-kFaZbbhUoy z0D#JaAEn$+59(-cVr|0y^YiDHH#8NX2wtKV{7Dx|N2oPJ%>xXl*OTSR#c~hYZGy-x z65}*fvV=#Zy&g<2y#%(^8^i+}HaV=Ahfo?E)9JN?ic!z*97)Mk+=I)Gpg$NN3wlcJ z<9Ri|MB{Wg?H`;eMoqh7hbYo5aSv`6q8J66d$=-V!Mjic7BDd?iDd9Q*pf;2s<VW z_u{bWr}f4z8hgjbu;(De533EW4Rq%(Mx56Cb{+e7h+rTyt@R1*XU_I#=&hePOD5Kx zJgQUDfY0YKrukfbJ5@ROb{f4DH28+%yW_>z;oUY0R#vmmY;XJ*KgQ2{ zAAOmi$bORMy}!3hyyB|aes$Ky&~kC%_K1MfoN73fJ^kWnqbIaf=<>3mi*Co-S5o{W zLgHzb_A(~f4yGelpdB3pja~DdHUbqhG(2BtthF?3vW4PDrY5y`cHu71gm*!xdg-$+ z#$*A8dFEJO9vCbGj=^SRY%;jEV*5-QuHaCA`&C2rcCzQ58l4THMqSlSnkZ^qI5J&F zvk_p!EiO`K(uf35&X<#z2*S-RrEil?Z_oT>g_ORMi<3cQ zS>kL}=|b!TW*&79BCVH_!t9d?pdegL*yT@SB#n(ET@1d1>wUYZ4AKqLIT6=UVA^pM zz9-rAFtWm`-x_#!H^m!Otcl6#oIF{QO&P?`n(cPmLGS6-js;)4l5!x~5SYdANrVcf zQrJ-)lmE6IpV)!G39yTK)+?T{Yc`+QPk`I@sn(6)v_z~;S
    %W(4xmyQIbf=*ua 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 G?tcKzo%kRC literal 0 HcmV?d00001