坐标系是图表的重要组成部分,有了坐标系,图表中的每一个点,每一个基本图形元素的位置、长度度量、方向度量才能确定下来,它是一个基本的参照系。利用Excel提供的图表坐标系相关的对象及其属性和方法,可以对坐标系进行各种设置,以达成所需要的图形效果。[大谦Excel,dqexcel点com]
Axes对象和Axis对象
Excel中,用Axis对象表示单个的坐标轴,用其复数形式Axes对象表示多个坐标轴及它们组成的坐标系。对于二维平面坐标系,有水平轴和垂直轴两个坐标轴;对于三维空间坐标系,有三个方向上的坐标轴。
使用API使用方式,通过Chart对象获取Axis对象的语法格式如下所示。
axs=cht.Axes(Type,AxisGroup)
其中,cht为Chart对象,两个参数:
• Type - 为必选项,取值为1, 2或3。取值为1时坐标轴显示类别,常用于设置图表的水平轴;取值为2时坐标轴显示值,常用于设置图表的垂直轴;取值为3时坐标轴显示数据系列,只能用于3D图表。
• AxisGroup – 为可选项,指定坐标轴主次之分。当设置为2时,说明坐标轴为辅助轴。当设置为1时,说明坐标轴为主坐标轴。
下面首先选择绘图数据,使用Shapes对象的AddChart2方法创建一个表示图表的Shape对象,然后利用它的Chart属性获取Chart对象。
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,200,20,300,200,True).Chart
利用Chart对象的Axes属性获取横坐标轴和纵坐标轴,并设置各坐标轴的属性。利用Border属性可以对坐标轴本身的颜色、线型、线宽等进行设置。
下面创建图表,设置两个坐标轴的Border属性,设置HasMinorGridlines属性的值为True,显示次级网格。
>>> sht.api.Range("A1:B7").Select() #数据
>>> cht=sht.api.Shapes.AddChart().Chart #添加图表
>>> axs=cht.Axes(1) #水平轴
>>> axs.Border.ColorIndex=3 #红色
>>> axs.Border.Weight=3 #线宽
>>> axs.HasMinorGridlines=True #显示次级网格线
>>> axs2=cht.Axes(2) #纵轴
>>> axs2.Border.Color=xw.utils.rgb_to_int((0,0,255)) #兰色
>>> axs2.Border.Weight=3 #线宽
>>> axs2.HasMinorGridlines=True #显示次级网格线
图形效果如图5-13所示。
图5-13 获取和设置坐标轴
坐标轴标题
使用Axis对象的HasTitle属性设置是否显示坐标轴标题,用AxisTitle属性设置坐标轴标题的文本内容。注意,必须设置HasTitle属性的值为True后才能设置AxisTitle属性。AxisTitle属性返回一个AxisTitle对象,利用它设置坐标轴标题的文本和字体。
下面接着5.4.1小节的绘图代码,给两个坐标轴添加标题。横坐标标题红色显示,字体倾斜;纵坐标标题字体加粗。
>>> axs.HasTitle=True #横坐标有轴标题
>>> axs.AxisTitle.Caption="横坐标轴标题" #标题文本
>>> axs.AxisTitle.Font.Italic=True #字体倾斜
>>> axs.AxisTitle.Font.Color=xw.utils.rgb_to_int((255,0,0)) #文字红色
>>> axs2.HasTitle=True #纵轴有轴标题
>>> axs2.AxisTitle.Caption="纵坐标轴标题" #标题文本
>>> axs2.AxisTitle.Font.Bold=True #字体加粗
效果如图5-14所示。
图5-14 添加和设置坐标轴标题
数值轴取值范围
纵轴为数值轴。使用纵轴对象的MinimumScale和MaximumScale属性设置数值轴的最小值和最大值。
下面设置纵轴的最小值和最大值分别为10和200。
>>> axs2.MinimumScale=10
>>> axs2.MaximumScale=200
生成图5-15。注意纵轴,即数值轴的取值范围已经被修改,图表显示也相应的有变化。
图5-15 设置纵轴的取值范围
刻度线
刻度线是坐标轴上的短线,用来辅助确定图表上各点的位置。刻度线有主刻度线和次刻度线。用Axis对象的MajorTickMark和MinorTickMark属性设置主刻度线和次刻度线。
MajorTickMark和MinorTickMark属性的取值如表5-5中所示,可以有不同的表示形式。
表5-5 刻度线设置参数的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlTickMarkCross | 4 | 跨轴 |
| xlTickMarkInside | 2 | 在轴内 |
| xlTickMarkNone | -4142 | 无标志 |
| xlTickMarkOutside | 3 | 在轴外 |
下面将横坐标轴的主刻度线设置为跨轴形式,将次刻度线设置为轴内显示。
>>> axs.MajorTickMark = 4
>>> axs.MinorTickMark = 2
用TickMarkSpacing属性返回或设置每隔多少个数据显示一个主刻度线,仅用于分类轴和系列轴,可以是1到31999之间的一个数值。
>>> axs.TickMarkSpacing = 1
用MajorUnit和MinorUnit属性设置数值轴上的主要和次要刻度单位。
下面为数值轴设置主要和次要刻度单位。
>>> axs2.MajorUnit = 40
>>> axs2.MinorUnit = 10
设置后数值轴上从最小值开始每隔40显示一个主刻度线,次刻度线之间的间隔是10。
设置MajorUnitIsAuto和MinorUnitIsAuto属性的值为True,Excel会自动计算数值轴上的主要和次要刻度单位。
>>> axs2.MajorUnitIsAuto=True
>>> axs2.MinorUnitIsAuto=True
设置MajorUnit和MinorUnit属性的值时,MajorUnitIsAuto和MinorUnitIsAuto属性的值自动设置为False。
刻度标签
坐标轴上与主刻度线位置对应的文本标签称为刻度标签,它们对主刻度线对应的数值或分类进行标注说明。
分类轴刻度标签的文本为图表中关联分类的名称。分类轴的默认刻度标签文本为数字,它们按照从左到右的顺序从1开始累加编号。使用TickLabelSpacing属性设置间隔多少个分类显示一个刻度标签。
数值轴刻度标签的文本数字对应于数值轴的MajorUnit, MinimumScale和MaximumScale属性。若要更改数值轴的刻度标签文字,必须更改这些属性的值。
Axis对象的TickLabels属性返回一个TickLabels对象,它表示坐标轴上的刻度标签。使用TickLabels对象的属性和方法,可以对刻度标签的字体、数字显示格式、显示方向、偏移量和对齐方式等进行设置。
下面设置数值轴刻度标签的数字显示格式、字体和显示方向。
>>> tl=axs2.TickLabels #纵轴刻度标签
>>> tl.NumberFormat = "0.00" #数字格式
>>> tl.Font.Italic=True #字体倾斜
>>> tl.Font.Name="Times New Roman" #字体名称
>>> tl.Orientation=45 #45度方向
效果如图5-16中数值轴的刻度标签所示。
图5-16 数值轴刻度标签的设置
代码中,TickLabels对象的Orientation属性指定刻度线标签的文本方向,当标签比较长时这个属性很有用。此属性的值可以设置为-90到90度。
用TickLabelPosition属性指定坐标轴上刻度标签的位置,值为表5-6中所示的常数或值。
表5-6 TickLabelPosition属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlTickLabelPositionHigh | -4127 | 图表的顶部或右侧 |
| xlTickLabelPositionLow | -4134 | 图表的底部或左侧 |
| xlTickLabelPositionNextToAxis | 4 | 坐标轴旁边(其中坐标轴不在图表的任意一侧) |
| xlTickLabelPositionNone | -4142 | 无刻度线 |
下面将图表分类轴上的刻度标签设置为顶部。
>>> tl=axs.TickLabels
>>> tl.TickLabelPosition=-4127
用TickLabelSpacing属性返回或设置刻度标签之间的分类数或数据系列数,即每隔几个分类显示一个刻度标签。仅用于分类轴和系列轴,可以是1到31999之间的一个数值。
下面设置分类轴上刻度标签之间的分类数为1。
>>> axs.TickLabels.TickLabelSpacing=1
设置TickLabelSpacingIsAuto属性的值为True,自动设置刻度标签的间距。
>>> axs.TickLabelSpacingIsAuto=True
网格线
在坐标系中添加网格线,可以辅助定位图表中点的位置,相当于多了很多参考线,每条线对应到各自刻度标签所表示的值。
网格线用Gridlines对象表示,使用它的Border或Format属性,可以设置网格线的颜色、线型、线宽等属性。利用Axis对象的MajorGridlines和MinorGridlines属性返回Gridlines对象,它们分别设置主网格线和次网格线。设置之前,必须将Axis对象的HasMajorGridlines和(或) HasMinorGridlines属性的值设置为True。
下面显示主网格线,并将其颜色设置为红色,线型设置为虚线。
>>> axs.HasMajorGridlines=True #横轴显示主网格线
>>> axs.MajorGridlines.Border.ColorIndex = 3 #红色
>>> axs.MajorGridlines.Border.LineStyle = xw.constants.LineStyle.xlDash #线型
>>> axs2.HasMajorGridlines=True #纵轴显示主网格线
>>> axs2.MajorGridlines.Border.ColorIndex = 3 #红色
>>> axs2.MajorGridlines.Border.LineStyle = xw.constants.LineStyle.xlDash #线型
也可以用下面的代码进行设置。
>>> axs.MajorGridlines.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))
>>> axs.MajorGridlines.Format.Line.DashStyle= 4
>>> axs2.MajorGridlines.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((255,0,0))
>>> axs2.MajorGridlines.Format.Line.DashStyle= 4
效果如图5-17所示。
图5-17 设置坐标系的网格
多轴图
使用API使用方式,通过Chart对象获取Axis对象的语法格式为:
axs=cht.Axes(Type,AxisGroup)
其中,cht为Chart对象。Type参数表示坐标轴的类型,值取1时表示分类轴,值为2时为数值轴。AxisGroup参数的值为1时表示坐标轴为主轴,为2时坐标轴为辅轴。默认时,主轴显示在左侧,辅轴显示在右侧。这样就可以生成双轴图,即绘图区两个图叠加显示,使用相同的横轴不同的纵轴。
下面首先选择工作表sht中A1:B7区域内的数据,然后用Shapes对象的AddChart方法创建图表,该方法返回一个Shape对象,引用它的Chart属性获取图表对象cht。默认时生成复合柱状图。
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart().Chart
然后设置序列1和序列2的AxisGroup属性的值为1和2,即这两个序列的图形分别使用主轴和辅轴。设置序列2的图表类型为折线图,显示和设置数据点处的标记,显示数据标签。
>>> cht.SeriesCollection(1).AxisGroup=1 #序列1使用主轴
>>> cht.SeriesCollection(2).AxisGroup=2 #序列2使用辅轴
>>> cht.SeriesCollection(2).ChartType=xw.constants.ChartType.xlLine
>>> cht.SeriesCollection(2).MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle
>>> cht.SeriesCollection(2).MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255))
>>> cht.SeriesCollection(2).MarkerSize=8
>>> cht.SeriesCollection(2).HasDataLabels=True
>>> cht.SeriesCollection(1).HasDataLabels=True
获取和设置主纵轴,取值范围为0-60,设置坐标轴标题。
>>> axs1=cht.Axes(2,1)
>>> axs1.MinimumScale=0
>>> axs1.MaximumScale=60
>>> axs1.HasTitle=True
>>> axs1.AxisTitle.Text="纵坐标轴1"
获取和设置辅纵轴,取值范围为10-160,设置坐标轴标题。
>>> axs2=cht.Axes(2,2)
>>> axs2.MinimumScale=10
>>> axs2.MaximumScale=160
>>> axs2.HasTitle=True
>>> axs2.AxisTitle.Text="纵坐标轴2"
生成多轴图如图5-18所示。图中,柱状图使用左侧的纵坐标轴,折线图使用右侧的纵坐标轴。
图5-18 创建多轴图
对数坐标图
Axis对象的ScaleType属性返回或设置数值轴的刻度类型,取值如表5-7所示。坐标轴的ScaleType属性的值设置为xw.constants.ScaleType.xlScaleLogarithmic时该轴刻度线为对数间隔,据此可绘制对数坐标图。
表5-7 ScaleType属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlScaleLinear | -4132 | 线性刻度 |
| xlScaleLogarithmic | -4133 | 对数刻度 |
下面首先选择工作表sht中A1:B7区域内的数据,然后用Shapes对象的AddChart方法创建复合柱状图,该方法返回一个Shape对象,引用它的Chart属性获取图表对象cht。将纵轴对象的ScaleType属性设置为xw.constants.ScaleType.xlScaleLogarithmic,创建对数坐标图。显示水平方向的网格线。
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart().Chart
>>> cht.Axes(2).ScaleType=xw.constants.ScaleType.xlScaleLogarithmic #对数坐标
>>> cht.Axes(2).HasMinorGridlines=True
生成图5-19。
图5-19 对数坐标图
其他属性
用Axis对象的AxisBetweenCategories属性设置数值轴和分类轴相交的位置。如果该属性的值为True,则相交的位置在分类之间的中间位置;值为False时,相交的位置在分类中间的位置。
下面利用图5-5中工作表内的数据创建复合柱状图,设置AxisBetweenCategories属性的值为True。
>>> sht.api.Range("A1:B7").Select()
>>> cht=sht.api.Shapes.AddChart().Chart
>>> cht.Axes(1).AxisBetweenCategories=True
生成图5-20。设置AxisBetweenCategories属性的值为Fasle。
>>> cht.Axes(1).AxisBetweenCategories=False
生成图5-21。比较两个图中纵轴和横轴相交的位置。
图5-20 AxisBetweenCategories属性的值为True 图5-21 AxisBetweenCategories属性的值为False
用Axis对象的Crosses属性返回或设置指定坐标轴与其他坐标轴相交的点。该属性的取值如表5-8中所示。
表5-8 Axis对象Crosses属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlAxisCrossesAutomatic | -4105 | 由Excel设置坐标轴交点 |
| xlAxisCrossesCustom | -4114 | CrossesAt属性指定坐标轴交点 |
| xlAxisCrossesMaximum | 2 | 坐标轴在最大值处相交 |
| xlAxisCrossesMinimum | 4 | 坐标轴在最小值处相交 |
下面设置图表上的数值轴在最大x值处与分类轴相交。
>>> cht.Axes(1).Crosses = 2
使用Axis对象的CrossesAt属性返回或设置数值轴中与分类坐标轴的交点,仅用于数值轴。下面设置横轴与纵轴在纵轴取值为20.0的地方相交。
>>> cht.Axes(2).CrossesAt=20.0
上面两步设置后生成图5-22。[大谦Excel,dqexcel点com]
图5-22 设置横坐标轴与纵坐标轴的交点位置