使用图表
本节介绍 chart_class 的一些选项和功能。
本节大部分示例基于下面程序的变体:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_line.xlsx')
worksheet = workbook.add_worksheet()
# Add the worksheet data to be plotted.
data = [10, 40, 50, 20, 10, 50]
worksheet.write_column('A1', data)
# Create a new chart object.
chart = workbook.add_chart({'type': 'line'})
# Add a series to the chart.
chart.add_series({'values': '=Sheet1!$A$1:$A$6'})
# Insert the chart into the worksheet.
worksheet.insert_chart('C1', chart)
workbook.close()

另见 chart_examples。
图表的数值轴与分类轴
使用图表时,需要理解Excel如何区分表示数据系列类别的坐标轴与表示系列数值的坐标轴。
在大多数Excel图表中,X轴是分类轴,各项按顺序等距排列;Y轴是数值轴,数据点按其数值定位:

Excel以不同方式处理这两类坐标轴,并提供不同属性。例如,分类轴具有以下属性:

数值轴的属性如下:

因此,XlsxWriter的某些坐标轴属性只能用于数值轴,另一些只能用于分类轴,还有一些两者通用。例如,reverse 可用于分类轴或数值轴,而 min 和 max 只能用于数值轴以及日期轴。文档会说明各属性适用的轴类型。
条形图的分类轴与数值轴方向相反:

散点图有两个数值轴,折线图则不是:

date_category_axes 是特殊的分类轴;用于日期或时间值时,它具有数值轴的部分属性,例如 min 和 max。
图表系列选项
以下各节详细介绍图表 add_series() 方法中较复杂的选项:
marker
trendline
y_error_bars
x_error_bars
data_labels
points
smooth
系列选项:数据标记
数据标记格式指定用于区分图表中不同系列的标记属性。通常只有折线图、散点图以及趋势线使用标记。
图表的 marker 格式可设置以下属性:
type
size
border
fill
pattern
gradient
type 指定系列使用的标记类型:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'marker': {'type': 'diamond'},
})

marker 支持以下 type 值,顺序与Excel格式对话框一致:
automatic
none
square
diamond
triangle
x
star
short_dash
long_dash
circle
plus
automatic 是特殊类型,会按照相应系列编号启用默认标记样式:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'marker': {'type': 'automatic'},
})
启用 automatic 时,不能设置大小、边框、填充等其他标记属性。
size 指定标记大小,通常与 type 一起使用:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'marker': {'type': 'diamond', 'size': 7},
})
标记还可设置嵌套的 border 和 fill 属性:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'marker': {
'type': 'square',
'size': 8,
'border': {'color': 'black'},
'fill': {'color': 'red'},
},
})

系列选项:趋势线
可以为图表系列添加趋势线,用于表示数据趋势,例如移动平均或多项式拟合。
系列趋势线可设置以下属性:
type
order (for polynomial trends)
period (for moving average)
forward (for all except moving average)
backward (for all except moving average)
name
line
intercept (for exponential, linear and polynomial only)
display_equation (for all except moving average)
display_r_squared (for all except moving average)
type 设置系列的趋势线类型:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {'type': 'linear'},
})
支持的 trendline 类型如下:
exponential
linear
log
moving_average
polynomial
power
polynomial 趋势线还可用 order 指定多项式阶数,默认值为2:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {
'type': 'polynomial',
'order': 3,
},
})

moving_average 趋势线还可用 period 指定移动平均周期,默认值为2:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {
'type': 'moving_average',
'period': 2,
},
})

forward 和 backward 设置趋势线向前、向后的预测周期:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {
'type': 'polynomial',
'order': 2,
'forward': 0.5,
'backward': 0.5,
},
})
可选的 name 设置趋势线在图例中的名称。未指定时使用Excel默认名称,通常由趋势线类型和系列名称组合而成:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {
'type': 'polynomial',
'name': 'My trend name',
'order': 2,
},
})
intercept 设置趋势线与Y轴(数值轴)的交点:
chart.add_series({
'values': '=Sheet1!$B$1:$B$6',
'trendline': {'type': 'linear',
'intercept': 0.8,
},
})
display_equation 在图表上显示趋势线方程:
chart.add_series({
'values': '=Sheet1!$B$1:$B$6',
'trendline': {'type': 'linear',
'display_equation': True,
},
})
display_r_squared 在图表上显示趋势线的R平方值:
chart.add_series({
'values': '=Sheet1!$B$1:$B$6',
'trendline': {'type': 'linear',
'display_r_squared': True,
},
})
可以一次设置多个属性:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'trendline': {
'type': 'polynomial',
'name': 'My trend name',
'order': 2,
'forward': 0.5,
'backward': 0.5,
'display_equation': True,
'line': {
'color': 'red',
'width': 1,
'dash_type': 'long_dash',
},
},
})

堆积图、饼图、圆环图、雷达图,以及将来实现的三维图和曲面图,其系列都不能添加趋势线。
系列选项:误差线
可以为系列添加误差线,表示数据的误差范围。误差线可以是竖直的 y_error_bars(最常用),也可以是水平的 x_error_bars(仅适用于条形图和散点图)。
系列误差线支持以下属性:
type
value (for all types except standard error and custom)
plus_values (for custom only)
minus_values (for custom only)
direction
end_style
line
type 设置系列的误差线类型:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'y_error_bars': {'type': 'standard_error'},
})

支持以下误差线类型:
fixed
percentage
standard_deviation
standard_error
custom
除 standard_error 和 custom 外,所有误差线类型都必须关联一个表示误差范围的数值:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'y_error_bars': {
'type': 'percentage',
'value': 5,
},
})
custom 误差线必须指定 plus_values 和 minus_values;两者应为类似 Sheet1!$A$1:$A$6 的区域公式或数值列表:
chart.add_series({
'categories': '=Sheet1!$A$1:$A$6',
'values': '=Sheet1!$B$1:$B$6',
'y_error_bars': {
'type': 'custom',
'plus_values': '=Sheet1!$C$1:$C$6',
'minus_values': '=Sheet1!$D$1:$D$6',
},
})
# or
chart.add_series({
'categories': '=Sheet1!$A$1:$A$6',
'values': '=Sheet1!$B$1:$B$6',
'y_error_bars': {
'type': 'custom',
'plus_values': [1, 1, 1, 1, 1],
'minus_values': [2, 2, 2, 2, 2],
},
})
注意,与Excel一样,minus_values 中的值不必是负数。
direction 设置误差线方向,可以为以下值之一:
plus # Positive direction only.
minus # Negative direction only.
both # Plus and minus directions, The default.
end_style 设置误差线端帽样式,可选1(默认)或0(不显示端帽):
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'y_error_bars': {
'type': 'fixed',
'value': 2,
'end_style': 0,
'direction': 'minus'
},
})

系列选项:数据标签
可以为系列添加数据标签,显示已绘制数据点的值。
data_labels 格式支持以下属性:
value
category
series_name
position
leader_lines
percentage
separator
legend_key
num_format
font
border
fill
pattern
gradient
custom
value 为系列启用“值”数据标签:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True},
})

默认情况下,Excel的数据标签只显示值。不过,也可以配置下面这些显示选项。

category 为系列启用“类别名称”数据标签:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'category': True},
})
series_name 为系列启用“系列名称”数据标签:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'series_name': True},
})
下面的示例同时显示这三类标签:

position 设置系列数据标签相对于数据点的位置:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'series_name': True, 'position': 'above'},
})

Excel允许的数据标签位置因图表类型而异,具体如下:
| 位置 | 折线、散点、股价图 | 条形、柱形图 | 饼图、圆环图 | 面积、雷达图 |
|---|---|---|---|---|
| center | 是 | 是 | 是 | 是* |
| right | 是* | |||
| left | 是 | |||
| above | 是 | |||
| below | 是 | |||
| inside_base | 是 | |||
| inside_end | 是 | 是 | ||
| outside_end | 是* | 是 | ||
| best_fit | 是* |
注:* 表示用户未指定位置时,Excel对该图表类型采用的默认位置。
percentage 让系列的数据标签显示“百分比”。Excel只有饼图和圆环图的变体支持 percentage 数据标签选项:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'percentage': True},
})

leader_lines 为系列的数据标签启用引导线:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'leader_lines': True},
})
注意:
即使启用引导线,Excel或XlsxWriter也不会自动显示它。由于Excel的限制或设计,只有手动移动数据标签,或者标签相互靠得太近而需要自动调整时,引导线才会出现。
separator 修改多个数据标签项目之间的分隔符:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'category': True,
'series_name': True, 'separator': "\n"},
})

分隔符必须是以下字符串之一:
','
';'
'.'
'\n'
' '
legend_key 为系列的数据标签启用图例项标示:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'legend_key': True},
})

num_format 设置系列数据标签的数字格式:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'num_format': '#,##0.00'},
})

这种数字格式类似于工作表单元格格式中的 num_format,但不能使用格式索引,必须像上例那样给出明确的格式字符串。详见 set_num_format()。
font 设置系列数据标签的字体:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {
'value': True,
'font': {'name': 'Consolas', 'color': 'red'}
},
})

font 还可用于旋转系列的数据标签:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {
'value': True,
'font': {'rotation': 45}
},
})
参见 chart_fonts。
数据标签也可应用 border 和 fill 等标准图表格式:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True,
'border': {'color': 'red'},
'fill': {'color': 'yellow'}},
})

custom 用于设置单个数据标签的属性,下一节会详细说明。
系列选项:自定义数据标签
数据标签的 custom 属性用于设置系列中单个标签的属性,最常见的用途是自定义文字或数字标签:
custom_labels = [
{'value': 'Jan'},
{'value': 'Feb'},
{'value': 'Mar'},
{'value': 'Apr'},
{'value': 'May'},
{'value': 'Jun'},
]
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'custom': custom_labels},
})

如前面的示例所示,custom 应为字典列表。属性字典设为 None,或者对应项未包含在列表中时,会使用默认的数据标签值:
custom_labels = [
None,
{'value': 'Feb'},
{'value': 'Mar'},
{'value': 'Apr'},
]
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'custom': custom_labels},
})

custom 列表的元素应为字典,允许以下键或子属性:
value
font
position
delete
value 应为字符串、数字,或引用某个单元格的公式字符串;使用公式时从该单元格取得值:
custom_labels = [
{'value': '=Sheet1!$C$1'},
{'value': '=Sheet1!$C$2'},
{'value': '=Sheet1!$C$3'},
{'value': '=Sheet1!$C$4'},
{'value': '=Sheet1!$C$5'},
{'value': '=Sheet1!$C$6'},
]
font 设置系列自定义数据标签的字体:
custom_labels = [
{'value': '=Sheet1!$C$1', 'font': {'color': 'red'}},
{'value': '=Sheet1!$C$2', 'font': {'color': 'red'}},
{'value': '=Sheet1!$C$3', 'font': {'color': 'red'}},
{'value': '=Sheet1!$C$4', 'font': {'color': 'red'}},
{'value': '=Sheet1!$C$5', 'font': {'color': 'red'}},
{'value': '=Sheet1!$C$6', 'font': {'color': 'red'}},
]
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'custom': custom_labels},
})
可用字体属性详见 chart_fonts。

position 设置自定义数据标签的位置,例如“center”或“right”。参见前文系列数据标签的 position 属性。
delete 可以删除系列中的标签。当你希望突出系列中的一个或多个单元格,例如最大值和最小值时,这很有用:
custom_labels = [
None,
{'delete': True},
{'delete': True},
{'delete': True},
{'delete': True},
None,
]
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'data_labels': {'value': True, 'custom': custom_labels},
})

自定义数据标签也可应用 border 和 fill 等标准图表格式:
custom_labels = [
{'value': 'Jan', 'border': {'color': 'blue'}},
{'value': 'Feb'},
{'value': 'Mar'},
{'value': 'Apr'},
{'value': 'May'},
{'value': 'Jun', 'fill': {'color': 'green'}},
]
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'marker': {'type': 'circle'},
'data_labels': {'value': True,
'custom': custom_labels,
'border': {'color': 'red'},
'fill': {'color': 'yellow'}},
})

系列选项:数据点
通常,格式会应用于图表中的整个系列。但有时需要单独设置系列中某些数据点的格式。饼图和圆环图尤其如此,因为每一个扇区都由一个数据点表示。
这时可以使用 add_series() 的 points 属性:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_pie.xlsx')
worksheet = workbook.add_worksheet()
chart = workbook.add_chart({'type': 'pie'})
data = [
['Pass', 'Fail'],
[90, 10],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
chart.add_series({
'categories': '=Sheet1!$A$1:$A$2',
'values': '=Sheet1!$B$1:$B$2',
'points': [
{'fill': {'color': 'green'}},
{'fill': {'color': 'red'}},
],
})
worksheet.insert_chart('C3', chart)
workbook.close()

points 接受格式选项列表,详见下文“图表格式”。要让某些数据点使用默认属性,在列表相应位置传入 None:
# Format point 3 of 3 only.
chart.add_series({
'values': '=Sheet1!A1:A3',
'points': [
None,
None,
{'fill': {'color': '#990000'}},
],
})
# Format point 1 of 3 only.
chart.add_series({
'values': '=Sheet1!A1:A3',
'points': [
{'fill': {'color': '#990000'}},
],
})
系列选项:平滑
smooth 设置线条系列的平滑属性,仅适用于 line 和 scatter 图表类型:
chart.add_series({
'categories': '=Sheet1!$A$1:$A$6',
'values': '=Sheet1!$B$1:$B$6',
'smooth': True,
})
图表格式
以下格式属性可用于适用且受XlsxWriter支持的图表对象,例如图表线条、柱形填充区域、绘图区边框、数据标记、网格线和其他元素:
line
border
fill
pattern
gradient
图表格式通常通过字典设置:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'color': 'red'},
})

某些格式属性可以嵌套。例如,marker 可以包含 border 和 fill 子属性:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'color': 'blue'},
'marker': {'type': 'square',
'size': 5,
'border': {'color': 'red'},
'fill': {'color': 'yellow'}
},
})

图表格式:线条
线条格式用于设置图表中线条对象的属性,例如绘制的数据线或边框。
图表的 line 格式支持以下属性:
none
color
width
dash_type
transparency
none 关闭 line。除散点图外,线条默认总是启用。如果希望只绘制标记而不绘制连线,这个选项很有用:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'none': True},
'marker': {'type': 'automatic'},
})

color 可以是 Color() 实例、HTML形式的 #RRGGBB 字符串,或有限范围内的命名颜色,参见 colors。
例如:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'color': '#FF0000'},
})
# Or:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'color': Color('#FF9900')},
})

width 设置线宽。与Excel一样,应以0.25磅为增量指定:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'width': 3.25},
})
dash_type 设置线条的虚线样式:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'dash_type': 'dash_dot'},
})

支持以下 dash_type 值,顺序与Excel对话框一致:
solid
round_dot
square_dot
dash
dash_dot
long_dash
long_dash_dot
long_dash_dot_dot
默认线型为 solid。
transparency 设置线条颜色的透明度,取1到100之间的整数。必须明确设置颜色,透明度才会生效;它不适用于自动或默认颜色:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {'color': 'yellow', 'transparency': 50},
})
可以同时指定多个 line 属性:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'line': {
'color': 'red',
'width': 1.25,
'dash_type': 'square_dot',
},
})
图表格式:边框
border 是 line 的同义属性。
对于条形图、柱形图等采用边框和填充而非线条样式的图表,用 border 替代 line 能更清楚地表达含义。一般而言,具有 border 属性的图表对象也具有填充属性。
图表格式:纯色填充
纯色填充用于设置图表对象的填充区域,例如柱形内部或图表本身的背景。
图表的 fill 格式支持以下属性:
none
color
transparency
none 关闭 fill;填充一般默认启用:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'fill': {'none': True},
'border': {'color': 'black'}
})

color 设置填充区域的颜色:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'fill': {'color': 'red'}
})
可用颜色见XlsxWriter主文档。也可以用HTML形式的 #RRGGBB 字符串或有限范围内的命名颜色设置填充色,参见 colors:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'fill': {'color': '#FF9900'}
})

transparency 设置纯色填充的透明度,取1到100之间的整数。必须明确设置颜色才会生效;它不适用于自动或默认颜色:
chart.set_chartarea({'fill': {'color': 'yellow', 'transparency': 50}})

fill 一般与 border 一起使用;后者拥有与 line 相同的属性:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'fill': {'color': 'red'},
'border': {'color': 'black'}
})

图表格式:图案填充
图案填充用于设置图表对象的图案区域,例如柱形内部或图表本身的背景。

图表的 pattern 填充支持以下属性:
pattern: the pattern to be applied (required)
fg_color: the foreground color of the pattern (required)
bg_color: the background color (optional, defaults to white)
例如:
chart.set_plotarea({
'pattern': {
'pattern': 'percent_5',
'fg_color': 'red',
'bg_color': 'yellow',
}
})
可以使用以下图案:
percent_5percent_10percent_20percent_25percent_30percent_40percent_50percent_60percent_70percent_75percent_80percent_90light_downward_diagonallight_upward_diagonaldark_downward_diagonaldark_upward_diagonalwide_downward_diagonalwide_upward_diagonallight_verticallight_horizontalnarrow_verticalnarrow_horizontaldark_verticaldark_horizontaldashed_downward_diagonaldashed_upward_diagonaldashed_horizontaldashed_verticalsmall_confettilarge_confettizigzagwavediagonal_brickhorizontal_brickweaveplaiddivotdotted_griddotted_diamondshingletrellisspheresmall_gridlarge_gridsmall_checklarge_checkoutlined_diamondsolid_diamond
前景色 fg_color 是必需参数,可以是HTML形式的 #RRGGBB 字符串或有限范围内的命名颜色,参见 colors。
背景色 bg_color 为可选参数,默认为白色。
对图表对象使用图案填充时,它会覆盖对象的纯色填充属性。
图表格式:渐变填充
渐变填充用于设置图表对象的渐变区域,例如柱形内部或图表本身的背景。

图表的 gradient 填充支持以下属性:
colors: a list of colors
positions: an optional list of positions for the colors
type: the optional type of gradient fill
angle: the optional angle of the linear fill
colors 指定定义渐变的颜色列表:
chart.set_plotarea({
'gradient': {'colors': ['#FFEFD1', '#F0EBD5', '#B69F66']}
})
Excel允许渐变包含2到10种颜色,不过通常只需要2或3种。
与纯色和图案填充一样,渐变也可以使用HTML形式的 #RRGGBB 字符串或有限范围内的命名颜色,参见 colors:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'gradient': {'colors': ['red', 'green']}
})
可选的 positions 列表指定各颜色在渐变中的位置,取值0到100。包含2到4种颜色的 colors 列表有默认位置,也可以按需要明确指定:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'gradient': {
'colors': ['#DDEBCF', '#156B13'],
'positions': [10, 90],
}
})
type 可以使用以下值之一:
linear (the default)
radial
rectangular
path
例如:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'gradient': {
'colors': ['#DDEBCF', '#9CB86E', '#156B13'],
'type': 'radial'
}
})
未指定 type 时,默认为 linear。
对于 linear 填充,还可以设置渐变角度:
chart.add_series({
'values': '=Sheet1!$A$1:$A$6',
'gradient': {'colors': ['#DDEBCF', '#9CB86E', '#156B13'],
'angle': 45}
})
默认角度为90度。
对图表对象使用渐变填充时,它会覆盖对象的纯色填充和图案填充属性。
图表字体
以下字体属性可用于适用且受XlsxWriter支持的图表对象,例如图表标题、坐标轴标签、轴刻度数字和数据标签:
name
size
bold
italic
underline
rotation
color
这些属性对应工作表单元格Format对象中的同名属性。有关格式属性及设置方式的详细信息,参见 format。
可用字体属性说明如下:
name:设置字体名称:
chart.set_x_axis({'num_font': {'name': 'Arial'}})
size:设置字号:
chart.set_x_axis({'num_font': {'name': 'Arial', 'size': 9}})
bold:设置粗体:
chart.set_x_axis({'num_font': {'bold': True}})
italic:设置斜体:
chart.set_x_axis({'num_font': {'italic': True}})
underline:设置下划线:
chart.set_x_axis({'num_font': {'underline': True}})
rotation:设置字体旋转角度,允许-90到90度以及270到271度之间的整数:
chart.set_x_axis({'num_font': {'rotation': 45}})
字体旋转可用于以更紧凑的形式显示日期等坐标轴数据。
-90到90范围以外还有两个特殊角度:
-
270:堆叠文字,文本从上向下排列。
-
271:适用于东亚字体的特殊堆叠文字形式。
-
color:设置字体颜色,可以使用颜色索引、颜色名称或HTML形式的RGB颜色:
chart.set_x_axis({'num_font': {'color': 'red' }})
chart.set_y_axis({'num_font': {'color': '#92D050'}})
下面是图表程序中设置字体格式的示例:
chart.set_title({
'name': 'Test Results',
'name_font': {
'name': 'Calibri',
'color': 'blue',
},
})
chart.set_x_axis({
'name': 'Month',
'name_font': {
'name': 'Courier New',
'color': '#92D050'
},
'num_font': {
'name': 'Arial',
'color': '#00B0F0',
},
})
chart.set_y_axis({
'name': 'Units',
'name_font': {
'name': 'Century',
'color': 'red'
},
'num_font': {
'bold': True,
'italic': True,
'underline': True,
'color': '#7030A0',
},
})
chart.set_legend({'font': {'bold': 1, 'italic': 1}})

图表布局
图表在工作表中的位置由 set_size() 方法控制。
还可以更改以下图表子对象的布局:
plotarea
legend
title
x_axis caption
y_axis caption
示例如下:
chart.set_plotarea({
'layout': {
'x': 0.13,
'y': 0.26,
'width': 0.73,
'height': 0.57,
}
})
chart.set_legend({
'layout': {
'x': 0.80,
'y': 0.37,
'width': 0.12,
'height': 0.25,
}
})
chart.set_title({
'name': 'Title',
'overlay': True,
'layout': {
'x': 0.42,
'y': 0.14,
}
})
chart.set_x_axis({
'name': 'X axis',
'name_layout': {
'x': 0.34,
'y': 0.85,
}
})
参见 set_plotarea()、set_legend()、set_title() 和 set_x_axis()。
注意:
只有 plotarea 和 legend 对象可以更改宽度和高度。其他以文本为主的对象,其宽高随字体尺寸而变化。
布局单位必须是满足 0 < x <= 1 的浮点数,表示相对于图表尺寸的比例,如下所示:

由此可按以下方式计算布局单位:
layout:
x = a / W
y = b / H
width = w / W
height = h / H
这些单位不太方便,而且会随文字长度等其他图表元素变化。然而,Excel要求采用这些单位来实现相对定位,通常需要反复尝试和调整。
注意:
plotarea 的原点位于绘图区自身的左上角,不包含坐标轴。
日期分类轴
日期分类轴是显示日期或时间信息的分类轴。在XlsxWriter中,使用 set_x_axis 或 set_y_axis 的 date_axis 选项设置:
chart.set_x_axis({'date_axis': True})
通常还应为日期轴指定数字格式,尽管Excel一般会默认采用所绘制数据的格式:
chart.set_x_axis({
'date_axis': True,
'num_format': 'dd/mm/yyyy',
})
Excel通常不允许为分类轴设置最小值和最大值,日期轴是例外。min 和 max 应设置为Excel的时间或日期值:
chart.set_x_axis({
'date_axis': True,
'min': date(2013, 1, 2),
'max': date(2013, 1, 9),
'num_format': 'dd/mm/yyyy',
})
日期轴还可以设置主要和次要单位的类型:
chart.set_x_axis({
'date_axis': True,
'minor_unit': 4,
'minor_unit_type': 'months',
'major_unit': 1,
'major_unit_type': 'years',
'num_format': 'dd/mm/yyyy',
})
图表次坐标轴
通过设置系列的 y2_axis 或 x2_axis,可以为图表添加同类型的次坐标轴:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_secondary_axis.xlsx')
worksheet = workbook.add_worksheet()
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
]
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
chart = workbook.add_chart({'type': 'line'})
# Configure a series with a secondary axis.
chart.add_series({
'values': '=Sheet1!$A$2:$A$7',
'y2_axis': True,
})
# Configure a primary (default) Axis.
chart.add_series({
'values': '=Sheet1!$B$2:$B$7',
})
chart.set_legend({'position': 'none'})
chart.set_y_axis({'name': 'Primary Y axis'})
chart.set_y2_axis({'name': 'Secondary Y axis'})
worksheet.insert_chart('D2', chart)
workbook.close()

组合图表的次图表也可以使用共用坐标轴或次坐标轴,详见下文。
组合图表
还可以组合两种不同图表。例如,使用图表的 combine() 方法把柱形图与折线图组合为帕累托图:

组合的图表可以共用Y轴,如下例所示:
# Usual setup to create workbook and add data...
# Create a new column chart. This will use this as the primary chart.
column_chart = workbook.add_chart({'type': 'column'})
# Configure the data series for the primary chart.
column_chart.add_series({
'name': '=Sheet1!B1',
'categories': '=Sheet1!A2:A7',
'values': '=Sheet1!B2:B7',
})
# Create a new column chart. This will use this as the secondary chart.
line_chart = workbook.add_chart({'type': 'line'})
# Configure the data series for the secondary chart.
line_chart.add_series({
'name': '=Sheet1!C1',
'categories': '=Sheet1!A2:A7',
'values': '=Sheet1!C2:C7',
})
# Combine the charts.
column_chart.combine(line_chart)
# Add a chart title and some axis labels. Note, this is done via the
# primary chart.
column_chart.set_title({ 'name': 'Combined chart - same Y axis'})
column_chart.set_x_axis({'name': 'Test number'})
column_chart.set_y_axis({'name': 'Sample length (mm)'})
# Insert the chart into the worksheet
worksheet.insert_chart('E2', column_chart)

次图表也可以按照上一节的方法放到次坐标轴上。
这时只需给系列增加 y2_axis 参数,并按需要用 set_y2_axis() 添加标题。以下是对前例的补充,用于将次图表放在次坐标轴上:
# ...
line_chart.add_series({
'name': '=Sheet1!C1',
'categories': '=Sheet1!A2:A7',
'values': '=Sheet1!C2:C7',
'y2_axis': True,
})
# Add a chart title and some axis labels.
# ...
column_chart.set_y2_axis({'name': 'Target length (mm)'})

上述示例使用了“主图表”和“次图表”的概念。主图表定义主X轴与主Y轴,还用于设置除次数据系列之外的所有图表属性。例如,图表标题和坐标轴属性应通过主图表设置。
更详细的示例见 ex_chart_combined 和 ex_chart_pareto。
组合图表存在以下限制:
- 只能组合两个图表。
- 当前不能组合饼图。
- 散点图当前不能作为主图表,但可以作为次图表。
- 条形图只能与使用次坐标轴的次图表组合,这是Excel的限制。
图表工作表
上面的示例以及Excel中最常见的图表都是嵌入式图表。
不过,也可以创建“图表工作表”(Chartsheet),即只包含一个图表的工作表:

详见 chartsheet。
从工作表表格创建图表
可以从 工作表表格 创建图表。但Excel有一项限制:如果指定数据系列的 name,它必须引用表格内的单元格,通常是某个表头。
要绕过Excel的这项限制,可以在表格中指定用户定义的名称,并从图表中引用它:
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_pie.xlsx')
worksheet = workbook.add_worksheet()
data = [
['Apple', 60],
['Cherry', 30],
['Pecan', 10],
]
worksheet.add_table('A1:B4', {'data': data,
'columns': [{'header': 'Types'},
{'header': 'Number'}]}
)
chart = workbook.add_chart({'type': 'pie'})
chart.add_series({
'name': '=Sheet1!$A$1',
'categories': '=Sheet1!$A$2:$A$4',
'values': '=Sheet1!$B$2:$B$4',
})
worksheet.insert_chart('D2', chart)
workbook.close()
图表限制
XlsxWriter不支持以下图表功能:
- 三维图表和控件。
- 气泡图、曲面图以及未在 chart_class 中列出的其他图表类型。
图表示例
参见 chart_examples。
来源与许可
原文:Working with Charts,XlsxWriter文档。中文译文。Copyright (c) 2013–2025, John McNamara。文档源文件标注 SPDX-License-Identifier: BSD-2-Clause;依BSD两条款许可提供。原图版权归原权利人。











暂无评论内容