利用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】
>>> cht.chart_type="column_clustered"
【xlwings API】
>>> 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方法创建更多类型的图表。
>>> 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所示。
图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对象绘制图表。
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart().Chart
生成的图表如图5-5中所示。程序中第一行选择绘图数据,第二行使用Shapes对象的AddChart方法创建表示图表的Shape对象,用该对象的Chart属性返回一个Chart对象。
图5-5 默认时生成的图表
Chart对象的SeriesCollection属性返回包含图表中所有序列的集合。下面使用Count属性获取集合中序列的个数。
>>> cht.SeriesCollection().Count
2
图5-5中共有两种不同颜色的柱形,每种颜色的柱形构成一个序列,所以一共有两个序列。
使用序列的名称或序列在集合中的索引号可以引用序列。下面引用第2个序列,用它的 ChartType属性将图形类型改变为折线图。设置Smooth属性的值为True,对折线进行平滑处理。用MarkerStyle属性将各数据点处的标记设置为三角形,用MarkerForegroundColor属性将标记的颜色设置为兰色。设置HasDataLabel属性的值为True,显示数据标签。
>>> 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对象的属性,可以对单个序列进行改变。
图5-6 改变序列的属性值
设置序列中单个点的属性
使用Series对象的Points属性,可以获取序列中的全部数据点。通过索引,可以把其中的某个或某些点提取出来进行设置。单个的点用Point对象表示,利用该对象的属性和方法,可以对指定的点进行设置。点的设置主要用于折线图、散点图和雷达图等。
接着5.2.3小节的例子,获取第2个序列中数据点的数量。
>>> 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。
>>> 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个点进行了突出显示。
图5-7 设置第3个点的属性值