坐标系

坐标系是图表的重要组成部分,有了坐标系,图表中的每一个点,每一个基本图形元素的位置、长度度量、方向度量才能确定下来,它是一个基本的参照系。利用Excel提供的图表坐标系相关的对象及其属性和方法,可以对坐标系进行各种设置,以达成所需要的图形效果。[大谦Excel,dqexcel点com]

Axes对象和Axis对象

Excel中,用Axis对象表示单个的坐标轴,用其复数形式Axes对象表示多个坐标轴及它们组成的坐标系。对于二维平面坐标系,有水平轴和垂直轴两个坐标轴;对于三维空间坐标系,有三个方向上的坐标轴。

使用API使用方式,通过Chart对象获取Axis对象的语法格式如下所示。

code.python
axs=cht.Axes(Type,AxisGroup)

其中,cht为Chart对象,两个参数:

• Type - 为必选项,取值为1, 2或3。取值为1时坐标轴显示类别,常用于设置图表的水平轴;取值为2时坐标轴显示值,常用于设置图表的垂直轴;取值为3时坐标轴显示数据系列,只能用于3D图表。

• AxisGroup – 为可选项,指定坐标轴主次之分。当设置为2时,说明坐标轴为辅助轴。当设置为1时,说明坐标轴为主坐标轴。

下面首先选择绘图数据,使用Shapes对象的AddChart2方法创建一个表示图表的Shape对象,然后利用它的Chart属性获取Chart对象。

code.python
>>> 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,显示次级网格。

code.python
>>> 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所示。

Document Image

图5-13 获取和设置坐标轴

坐标轴标题

使用Axis对象的HasTitle属性设置是否显示坐标轴标题,用AxisTitle属性设置坐标轴标题的文本内容。注意,必须设置HasTitle属性的值为True后才能设置AxisTitle属性。AxisTitle属性返回一个AxisTitle对象,利用它设置坐标轴标题的文本和字体。

下面接着5.4.1小节的绘图代码,给两个坐标轴添加标题。横坐标标题红色显示,字体倾斜;纵坐标标题字体加粗。

code.python
>>> 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所示。

Document Image

图5-14 添加和设置坐标轴标题

数值轴取值范围

纵轴为数值轴。使用纵轴对象的MinimumScale和MaximumScale属性设置数值轴的最小值和最大值。

下面设置纵轴的最小值和最大值分别为10和200。

code.python
>>> axs2.MinimumScale=10
>>> axs2.MaximumScale=200

生成图5-15。注意纵轴,即数值轴的取值范围已经被修改,图表显示也相应的有变化。

Document Image

图5-15 设置纵轴的取值范围

刻度线

刻度线是坐标轴上的短线,用来辅助确定图表上各点的位置。刻度线有主刻度线和次刻度线。用Axis对象的MajorTickMark和MinorTickMark属性设置主刻度线和次刻度线。

MajorTickMark和MinorTickMark属性的取值如表5-5中所示,可以有不同的表示形式。

表5-5 刻度线设置参数的取值

名 称 说 明
xlTickMarkCross 4 跨轴
xlTickMarkInside 2 在轴内
xlTickMarkNone -4142 无标志
xlTickMarkOutside 3 在轴外

下面将横坐标轴的主刻度线设置为跨轴形式,将次刻度线设置为轴内显示。

code.python
>>> axs.MajorTickMark = 4
>>> axs.MinorTickMark = 2

用TickMarkSpacing属性返回或设置每隔多少个数据显示一个主刻度线,仅用于分类轴和系列轴,可以是1到31999之间的一个数值。

code.python
>>> axs.TickMarkSpacing = 1

用MajorUnit和MinorUnit属性设置数值轴上的主要和次要刻度单位。

下面为数值轴设置主要和次要刻度单位。

code.python
>>> axs2.MajorUnit = 40
>>> axs2.MinorUnit = 10

设置后数值轴上从最小值开始每隔40显示一个主刻度线,次刻度线之间的间隔是10。

设置MajorUnitIsAuto和MinorUnitIsAuto属性的值为True,Excel会自动计算数值轴上的主要和次要刻度单位。

code.python
>>> axs2.MajorUnitIsAuto=True
>>> axs2.MinorUnitIsAuto=True

设置MajorUnit和MinorUnit属性的值时,MajorUnitIsAuto和MinorUnitIsAuto属性的值自动设置为False。

刻度标签

坐标轴上与主刻度线位置对应的文本标签称为刻度标签,它们对主刻度线对应的数值或分类进行标注说明。

分类轴刻度标签的文本为图表中关联分类的名称。分类轴的默认刻度标签文本为数字,它们按照从左到右的顺序从1开始累加编号。使用TickLabelSpacing属性设置间隔多少个分类显示一个刻度标签。

数值轴刻度标签的文本数字对应于数值轴的MajorUnit, MinimumScale和MaximumScale属性。若要更改数值轴的刻度标签文字,必须更改这些属性的值。

Axis对象的TickLabels属性返回一个TickLabels对象,它表示坐标轴上的刻度标签。使用TickLabels对象的属性和方法,可以对刻度标签的字体、数字显示格式、显示方向、偏移量和对齐方式等进行设置。

下面设置数值轴刻度标签的数字显示格式、字体和显示方向。

code.python
>>> tl=axs2.TickLabels  #纵轴刻度标签
>>> tl.NumberFormat = "0.00"  #数字格式
>>> tl.Font.Italic=True  #字体倾斜
>>> tl.Font.Name="Times New Roman"  #字体名称
>>> tl.Orientation=45  #45度方向

效果如图5-16中数值轴的刻度标签所示。

Document Image

图5-16 数值轴刻度标签的设置

代码中,TickLabels对象的Orientation属性指定刻度线标签的文本方向,当标签比较长时这个属性很有用。此属性的值可以设置为-90到90度。

用TickLabelPosition属性指定坐标轴上刻度标签的位置,值为表5-6中所示的常数或值。

表5-6 TickLabelPosition属性的取值

名 称 说 明
xlTickLabelPositionHigh -4127 图表的顶部或右侧
xlTickLabelPositionLow -4134 图表的底部或左侧
xlTickLabelPositionNextToAxis 4 坐标轴旁边(其中坐标轴不在图表的任意一侧)
xlTickLabelPositionNone -4142 无刻度线

下面将图表分类轴上的刻度标签设置为顶部。

code.python
>>> tl=axs.TickLabels
>>> tl.TickLabelPosition=-4127

用TickLabelSpacing属性返回或设置刻度标签之间的分类数或数据系列数,即每隔几个分类显示一个刻度标签。仅用于分类轴和系列轴,可以是1到31999之间的一个数值。

下面设置分类轴上刻度标签之间的分类数为1。

code.python
>>> axs.TickLabels.TickLabelSpacing=1

设置TickLabelSpacingIsAuto属性的值为True,自动设置刻度标签的间距。

code.python
>>> axs.TickLabelSpacingIsAuto=True

网格线

在坐标系中添加网格线,可以辅助定位图表中点的位置,相当于多了很多参考线,每条线对应到各自刻度标签所表示的值。

网格线用Gridlines对象表示,使用它的Border或Format属性,可以设置网格线的颜色、线型、线宽等属性。利用Axis对象的MajorGridlines和MinorGridlines属性返回Gridlines对象,它们分别设置主网格线和次网格线。设置之前,必须将Axis对象的HasMajorGridlines和(或) HasMinorGridlines属性的值设置为True。

下面显示主网格线,并将其颜色设置为红色,线型设置为虚线。

code.python
>>> 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  #线型

也可以用下面的代码进行设置。

code.python
>>> 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所示。

Document Image

图5-17 设置坐标系的网格

多轴图

使用API使用方式,通过Chart对象获取Axis对象的语法格式为:

code.python
axs=cht.Axes(Type,AxisGroup)

其中,cht为Chart对象。Type参数表示坐标轴的类型,值取1时表示分类轴,值为2时为数值轴。AxisGroup参数的值为1时表示坐标轴为主轴,为2时坐标轴为辅轴。默认时,主轴显示在左侧,辅轴显示在右侧。这样就可以生成双轴图,即绘图区两个图叠加显示,使用相同的横轴不同的纵轴。

下面首先选择工作表sht中A1:B7区域内的数据,然后用Shapes对象的AddChart方法创建图表,该方法返回一个Shape对象,引用它的Chart属性获取图表对象cht。默认时生成复合柱状图。

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

然后设置序列1和序列2的AxisGroup属性的值为1和2,即这两个序列的图形分别使用主轴和辅轴。设置序列2的图表类型为折线图,显示和设置数据点处的标记,显示数据标签。

code.python
>>> 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,设置坐标轴标题。

code.python
>>> axs1=cht.Axes(2,1)
>>> axs1.MinimumScale=0
>>> axs1.MaximumScale=60
>>> axs1.HasTitle=True
>>> axs1.AxisTitle.Text="纵坐标轴1"

获取和设置辅纵轴,取值范围为10-160,设置坐标轴标题。

code.python
>>> axs2=cht.Axes(2,2)
>>> axs2.MinimumScale=10
>>> axs2.MaximumScale=160
>>> axs2.HasTitle=True
>>> axs2.AxisTitle.Text="纵坐标轴2"

生成多轴图如图5-18所示。图中,柱状图使用左侧的纵坐标轴,折线图使用右侧的纵坐标轴。

Document Image

图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,创建对数坐标图。显示水平方向的网格线。

code.python
>>> 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。

Document Image

图5-19 对数坐标图

其他属性

用Axis对象的AxisBetweenCategories属性设置数值轴和分类轴相交的位置。如果该属性的值为True,则相交的位置在分类之间的中间位置;值为False时,相交的位置在分类中间的位置。

下面利用图5-5中工作表内的数据创建复合柱状图,设置AxisBetweenCategories属性的值为True。

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

生成图5-20。设置AxisBetweenCategories属性的值为Fasle。

code.python
>>> cht.Axes(1).AxisBetweenCategories=False

生成图5-21。比较两个图中纵轴和横轴相交的位置。

Document Image Document Image

图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值处与分类轴相交。

code.python
>>> cht.Axes(1).Crosses = 2

使用Axis对象的CrossesAt属性返回或设置数值轴中与分类坐标轴的交点,仅用于数值轴。下面设置横轴与纵轴在纵轴取值为20.0的地方相交。

code.python
>>> cht.Axes(2).CrossesAt=20.0

上面两步设置后生成图5-22。[大谦Excel,dqexcel点com]

Document Image

图5-22 设置横坐标轴与纵坐标轴的交点位置