图表及其序列

利用5.1.1和5.1.2小节介绍的方法可以获得chart和Chart对象,利用5.1.3小节介绍的方法可以获得Shape对象,引用Shape对象的Chart属性可以获取Chart对象。然后利用chart(Chart)对象的属性和方法就可以对图表的类型、坐标系、标题、图例等进行各种设置。

对于多变量数据绘制的复合图表类型,图中的每组简单图形称为一个序列。可以从复合图形中获取序列对象并利用其属性和方法进行设置。比如改变这一组简单图形的图表类型、设置条形区域或线条的颜色线型、显示和设置点标记和数据标签等。

对于特殊的图表类型,比如折线图、点图等,可以对图形的某个或某些控制点进行单独设置。比如对折线图上第5个数据点,改变它的标记类型大小、显示数据标签等。[大谦Excel,dqexcel点com]

设置图表的类型

使用chart对象的chart_type属性或Chart对象的ChartType属性设置图表的类型。对于图表对象cht,设置图表类型如下所示:

【xlwings】

code.python
>>> cht.chart_type="column_clustered"

【xlwings API】

code.python
>>> cht.ChartType=xw.constants.ChartType.xlColumnClustered

chart_type或ChartType属性的取值如表5-1所示。表中第3列中表示图表类型的字符串作为xlwings使用方式下chart_type属性的取值,前两列的常数或值作为API使用方式下ChartType属性的取值。值可以直接写,常数的形式类似xw.constants.ChartType.xlLine。

表5-1 Excel的图表类型

API常数名称 API值 xlwings取值 说 明
xl3DArea -4098 "3d_area" 三维面积图
xl3DAreaStacked 78 "3d_area_stacked" 三维堆栈面积图
xl3DAreaStacked100 79 "3d_area_stacked_100" 百分比堆栈面积图
xl3DBarClustered 60 "3d_bar_clustered" 三维复合条形图
xl3DBarStacked 61 "3d_bar_stacked" 三维堆栈条形图
xl3DBarStacked100 62 "3d_bar_stacked_100" 三维百分比堆栈条形图
xl3DColumn -4100 "3d_column" 三维柱形图
xl3DColumnClustered 54 "3d_column_clustered" 三维复合柱形图
xl3DColumnStacked 55 "3d_column_stacked" 三维堆栈柱形图
xl3DColumnStacked100 56 "3d_column_stacked_100" 三维百分比堆栈柱形图
xl3DLine -4101 "3d_line" 三维折线图
xl3DPie -4102 "3d_pie" 三维饼图
xl3DPieExploded 70 "3d_pie_exploded" 分离型三维饼图
xlArea 1 "area" 饼图
xlAreaStacked 76 "area_stacked" 堆栈面积图
xlAreaStacked100 77 "area_stacked_100" 百分比堆栈面积图
xlBarClustered 57 "bar_clustered" 复合条形图
xlBarOfPie 71 "bar_of_pie" 复合条饼图
xlBarStacked 58 "bar_stacked" 堆栈条形图
xlBarStacked100 59 "bar_stacked_100" 百分比堆栈条形图
xlBubble "bubble" 泡泡图
xlBubble3DEffect 87 "bubble_3d_effect" 三维泡泡图
xlColumnClustered 51 "column_clustered" 复合柱形图
xlColumnStacked 52 "column_stacked" 堆栈柱形图
xlColumnStacked100 53 "column_stacked_100" 百分比堆栈柱形图
xlConeBarClustered 102 "cone_bar_clustered" 复合条形圆锥图
xlConeBarStacked 103 "cone_bar_stacked" 堆栈条形圆锥图
xlConeBarStacked100 104 "cone_bar_stacked_100" 百分比堆栈条形圆锥图
xlConeCol 105 "cone_col" 三维柱形圆锥图
xlConeColClustered 99 "cone_col_clustered" 复合柱形圆锥图
xlConeColStacked 100 "cone_col_stacked" 堆栈柱形圆锥图
xlConeColStacked100 101 "cone_col_stacked_100" 百分比堆栈柱形圆锥图
xlCylinderBarClustered 95 "cylinder_bar_clustered" 复合条形圆柱图
xlCylinderBarStacked 96 "cylinder_bar_stacked" 堆栈条形圆柱图
xlCylinderBarStacked100 97 "cylinder_bar_stacked_100" 百分比堆栈条形圆柱图
xlCylinderCol 98 "cylinder_col" 三维柱形圆柱图
xlCylinderColClustered 92 "cylinder_col_clustered" 复合柱形圆锥图
xlCylinderColStacked 93 "cylinder_col_stacked" 堆栈柱形圆锥图
xlCylinderColStacked100 94 "cylinder_col_stacked_100" 百分比堆栈柱形圆柱图
xlDoughnut -4120 "doughnut" 圆环图.
xlDoughnutExploded 80 "doughnut_exploded" 分离型圆环图
xlLine 4 "line" 折线图
xlLineMarkers 65 "line_markers" 数据点折线图
xlLineMarkersStacked 66 "line_markers_stacked" 堆栈数据点折线图
xlLineMarkersStacked100 67 "line_markers_stacked_100" 百分比堆栈数据点折线图
xlLineStacked 63 "line_stacked" 堆栈折线图
xlLineStacked100 64 "line_stacked_100" 百分比堆栈折线图
xlPie 5 "pie" 饼图
xlPieExploded 69 "pie_exploded" 分离型饼图
xlPieOfPie 68 "pie_of_pie" 复合饼图
xlPyramidBarClustered 109 "pyramid_bar_clustered" 复合条形棱锥图
xlPyramidBarStacked 110 "pyramid_bar_stacked" 堆栈条形棱锥图
xlPyramidBarStacked100 111 "pyramid_bar_stacked_100" 百分比堆栈条形棱锥图
xlPyramidCol 112 "pyramid_col" 三维柱形棱锥图
xlPyramidColClustered 106 "pyramid_col_clustered" 复合柱形棱锥图
xlPyramidColStacked 107 "pyramid_col_stacked" 堆栈柱形棱锥图
xlPyramidColStacked100 108 "pyramid_col_stacked_100" 百分比堆栈柱形棱锥图
xlRadar -4151 "radar" 雷达图.
xlRadarFilled 82 "radar_filled" 填充雷达图
xlRadarMarkers 81 "radar_markers" 数据点雷达图
xlRegionMap 140 地图
xlStockHLC 88 "stock_hlc" 盘高-盘低-收盘图
xlStockOHLC 89 "stock_ohlc" 开盘-盘高-盘低-收盘图
xlStockVHLC 90 "stock_vhlc" 成交量-盘高-盘低-收盘图
xlStockVOHLC 91 "stock_vohlc" Volume-开盘-盘高-盘低-收盘图
xlSurface 83 "surface" 三维曲面图
xlSurfaceTopView 85 "surface_top_view" 曲面图(俯视图)
xlSurfaceTopViewWireframe 86 "surface_top_view_wireframe" 曲面图(俯视线框图)
xlSurfaceWireframe 84 "surface_wireframe" 三维曲面图(线框图)
xlXYScatter -4169 "xy_scatter" 散点图
xlXYScatterLines 74 "xy_scatter_lines" 折线散点图
xlXYScatterLinesNoMarkers 75 "xy_scatter_lines_no_markers" 无数据点折线散点图
xlXYScatterSmooth 72 "xy_scatter_smooth" 平滑线散点图
xlXYScatterSmoothNoMarkers 73 "xy_scatter_smooth_no_markers" 无数据点平滑线散点图

利用5.1节提供的数据,下面用Shapes对象的AddChart2方法创建更多类型的图表。

code.python
>>> sht.api.Range("A1").CurrentRegion.Select()  #数据
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,20,150,300,200,True)
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlBarClustered,400,150,300,200,True)
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlConeBarStacked,20,400,300,200,True)
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlLineMarkersStacked,400,400,300,200,True)
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlXYScatter,20,650,300,200,True)
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlPieOfPie,400,650,300,200,True)

生成不同类型的图表如图5-4所示。

Document Image

图5-4 创建不同类型的图表

Chart对象的常用属性和方法

前一小节我们用Chart对象的ChartType属性设置了图表的类型,实际上,Chart对象还有很多其他属性和方法,使用它们可以对图表进行各种设置。Chart对象常见的属性和方法如表5-2所示。这些属性和方法的用法在后面会陆续进行介绍。

表5-2 Chart对象的常用属性

名 称 意 义
BackWall 返回Walls对象,该对象允许用户单独对三维图表的背景墙进行格式设置
BarShape 条形的形状
ChartArea 返回ChartArea对象,该对象表示图表的整个图表区
ChartStyle 返回或设置图表的图表样式。可以使用介于1到48之间的数字设置图表样式
ChartTitle 返回ChartTitle对象,表示指定图表的标题
ChartType 返回或设置图表类型
Copy 将图表工作表复制到工作簿的另一位置
CopyPicture 将图表以图片的形式复制到剪贴板
DataTable 返回DataTable对象,表示此图表的数据表
Delete 删除图表
Export 将图表以图片格式导出到文件
HasAxis 返回或设置图表上显示的坐标轴
HasDataTable 如果图表有数据表,则该属性值为True,否则为False
HasTitle 设置是否显示标题
Legend 返回一个Legend对象,表示图表的图例
Move 将图表工作表移动到工作簿中的另一位置
Name 图表的名称
PlotArea 返回一个PlotArea对象,表示图表的绘图区
PlotBy 返回或设置行或列在图表中作为数据系列使用的方式。可为以下XlRowCol常量之一:xlColumns或xlRows
SaveAs 图表另存到不同的文件中
Select 选择图表
SeriesCollection 返回包含图表所有序列的集合
SetElement 设置图表元素
SetSourceData 绑定绘制图表的数据
Visible 返回或设置一个XlSheetVisibility值,用于确定对象是否可见
Walls 返回一个Walls对象,此表示三维图表的背景墙

设置序列

每个Chart对象都有一个SeriesCollection属性,它返回一个包含图表中所有序列的集合。那什么是序列呢?对于图5-1中生成的复合柱状图,每个省市对应一个复合柱形,每个复合柱形中有六个不同颜色的单一柱形,这里面,所有省市相同颜色的单一柱形一起组成一个序列。所以,图中一共有六个序列。用Series对象表示序列。

下面利用图5-5中给定的数据,用Shapes对象绘制图表。

code.python
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart().Chart

生成的图表如图5-5中所示。程序中第一行选择绘图数据,第二行使用Shapes对象的AddChart方法创建表示图表的Shape对象,用该对象的Chart属性返回一个Chart对象。

Document Image

图5-5 默认时生成的图表

Chart对象的SeriesCollection属性返回包含图表中所有序列的集合。下面使用Count属性获取集合中序列的个数。

code.python
>>> cht.SeriesCollection().Count
2

图5-5中共有两种不同颜色的柱形,每种颜色的柱形构成一个序列,所以一共有两个序列。

使用序列的名称或序列在集合中的索引号可以引用序列。下面引用第2个序列,用它的 ChartType属性将图形类型改变为折线图。设置Smooth属性的值为True,对折线进行平滑处理。用MarkerStyle属性将各数据点处的标记设置为三角形,用MarkerForegroundColor属性将标记的颜色设置为兰色。设置HasDataLabel属性的值为True,显示数据标签。

code.python
>>> ser2=cht.SeriesCollection("P2")  #第2个序列
>>> ser2.ChartType=xw.constants.ChartType.xlLine  #线形图
>>> ser2.Smooth=True  #平滑处理
>>> ser2.MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle  #标记
>>> ser2.MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255))  #颜色
>>> ser2.HasDataLabels=True  #数据标签

现在图表变成图5-6所示的样子。可见,通过设置图表中Series对象的属性,可以对单个序列进行改变。

Document Image

图5-6 改变序列的属性值

设置序列中单个点的属性

使用Series对象的Points属性,可以获取序列中的全部数据点。通过索引,可以把其中的某个或某些点提取出来进行设置。单个的点用Point对象表示,利用该对象的属性和方法,可以对指定的点进行设置。点的设置主要用于折线图、散点图和雷达图等。

接着5.2.3小节的例子,获取第2个序列中数据点的数量。

code.python
>>> Num=ser2.Points().Count
>>> Num
6

Point对象的常用属性如表5-3中所示。

表5-3 Point对象的常用属性

名 称 意 义
DataLabel 返回一个DataLabel对象,表示数据标签
HasDataLabel 是否显示数据标签
MarkerBackgroundColor 标记背景色,RGB着色
MarkerBackgroundColorIndex 标记背景色,索引着色
MarkerForegroundColor 标记前景色,RGB着色
MarkerForegroundColorIndex 标记前景色,索引着色
MarkerSize 标记的大小
MarkerStyle 标记的样式
Name 点的名称
PictureType 设置在柱状图或条形图上显示图片时图片的显示方式。可以拉伸或堆栈显示

Point对象的MarkerStyle属性设置标记的样式。该属性的值为XlMarkerStyle枚举类型的值,如表5-4中所示。

表5-4 Point对象的MarkerStyle属性取值

名 称 说 明
xlMarkerStyleAutomatic -4105 自动设置标记
xlMarkerStyleCircle 8 圆形标记
xlMarkerStyleDash -4115 长条形标记
xlMarkerStyleDiamond 2 菱形标记
xlMarkerStyleDot -4118 短条形标记
xlMarkerStyleNone -4142 无标记
xlMarkerStylePicture -4147 图片标记
xlMarkerStylePlus 9 带加号的方形标记
xlMarkerStyleSquare 1 方形标记
xlMarkerStyleStar 5 带星号的方形标记
xlMarkerStyleTriangle 3 三角形标记
xlMarkerStyleX -4168 带X记号的方形标记

下面在表示序列2的折线图中改变第3个点的属性。设置它的前景色和背景色为兰色,设置标记样式为菱形,设置标记大小为10。

code.python
>>> ser2.Points(3).MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255))
>>> ser2.Points(3).MarkerBackgroundColor=xw.utils.rgb_to_int((0,0,255))
>>> ser2.Points(3).MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleDiamond
>>> ser2.Points(3).MarkerSize=10

设置效果如图5-7所示。设置以后,序列中第3个点进行了突出显示。

Document Image

图5-7 设置第3个点的属性值