坐标系的常见设置

坐标系的常见设置包括坐标轴、刻度线、刻度标签、网格线等的设置。[大谦Excel,dqexcel点com]

Axes对象和Axis对象

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

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

code.vba
Set axs=cht.Axes(Type,AxisGroup)

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

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

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

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

code.vba
Range("A1:B7").Select
Set cht=sht.Shapes.AddChart2(-1,xlColumnClustered,200,20,300,200,True).Chart    '创建图表

利用Chart对象的Axes属性获取横坐标轴和纵坐标轴,并设置各坐标轴的属性。利用Border属性可以对坐标轴本身的颜色、线型、线宽等进行设置。

下面创建图表,设置两个坐标轴的Border属性。完整代码见:Samples->ch03图表基础->09 坐标系:坐标轴->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  axs.Border.ColorIndex = 3 '红色
  axs.Border.Weight = 3 '线宽
  Set axs2 = cht.Axes(2) '纵轴
  axs2.Border.Color = RGB(0, 0, 255) '兰色
  axs2.Border.Weight = 3 '线宽
End Sub

运行代码生成图表如图2-1所示。

Document Image
\[\]

图2-1 获取和设置坐标轴

坐标轴标题

给图表添加坐标轴标题,可以标示各坐标轴数据表示的意义。使用Excel和Python xlwings可以添加坐标轴标题并设置和修改它们的属性。

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

下面创建图表并给两个坐标轴添加标题。横坐标轴标题用红色显示,字体倾斜;纵坐标轴标题字体加粗。完整代码见:Samples->ch03图表基础->10 坐标系:坐标轴标题->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.HasTitle = True '横坐标有轴标题
  axs.AxisTitle.Caption = "横坐标轴标题" '标题文本
  axs.AxisTitle.Font.Italic = True '字体倾斜
  axs.AxisTitle.Font.Color = RGB(255, 0, 0) '文字红色
  axs2.HasTitle = True '纵轴有轴标题
  axs2.AxisTitle.Caption = "纵坐标轴标题" '标题文本
  axs2.AxisTitle.Font.Bold = True '字体加粗
End Sub

运行代码,生成图表如图2-2所示。

Document Image
\[\]

图2-2 添加和设置坐标轴标题

数值轴取值范围

Excel图表中,对于数值轴可以设置取值范围,即可以设置数据的最小值和最大值。设置坐标轴的取值范围,可以控制图表的整体显示外观。注意,Excel图表中不能对分类轴和序列轴设置取值范围。

默认时纵轴为数值轴。使用纵轴对象的MinimumScale和MaximumScale属性设置数值轴的最小值和最大值。下面设置纵轴的最小值和最大值分别为10和200。完整代码见:Samples->ch03图表基础->11 坐标系:坐标轴取值范围->py.py。

code.vba
Sub Test4()
  Dim cht As Chart
  Dim axs As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs2.MinimumScale = 10
  axs2.MaximumScale = 200
End Sub

运行代码,生成图表如图2-3所示。注意纵轴,即数值轴的取值范围已经被修改,图表也相应地有变化。

Document Image
\[\]

图2-3 设置纵轴的取值范围

坐标轴反向

默认时,Excel图表的横轴向右为正,纵轴向上为正。特殊情况下需要反转坐标轴,比如表现地面以下土的沉降、地下水位的变化等,需要图表纵轴向下为正。使用Excel和Python xlwings可以方便地反转坐标轴的方向。

设置坐标轴对象的ReversePlotOrder属性的值为True,反转对应坐标轴,图表也相应反转。下面创建图表并反转两个坐标轴。完整代码见:Samples->ch03图表基础->12 坐标系:坐标轴反向->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.ReversePlotOrder = True
  axs2.ReversePlotOrder = True
End Sub

运行代码,生成图表如图2-4所示。注意,两个坐标轴刻度标签显示取值顺序与默认时相反了。

Document Image
\[\]

图2-4 反转坐标轴

坐标轴交点位置

图表坐标系是自定义坐标系,坐标原点和坐标轴的方向可以自己定义。3.4.4小节介绍了自定义坐标轴的方向,这里介绍自定义坐标系的原点,即坐标轴的交点。

用Axis对象的Crosses属性返回或设置指定坐标轴与其他坐标轴相交的点。该属性的取值如表2-1中所示。

表2-1 Axis对象Crosses属性的取值

名 称 说 明
xlAxisCrossesAutomatic -4105 由Excel设置坐标轴交点
xlAxisCrossesCustom -4114 CrossesAt属性指定坐标轴交点
xlAxisCrossesMaximum 2 坐标轴在最大值处相交
xlAxisCrossesMinimum 4 坐标轴在最小值处相交

下面设置图表上的数值轴在最大x值处与分类轴相交。

code.vba
cht.Axes(1).Crosses=2

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

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

code.vba
cht.Axes(2).CrossesAt=20.0

下面创建图表,设置两个坐标轴的交点位于横轴为最大值、纵轴取值为10处。完整代码见:Samples->ch03图表基础->13 坐标系:坐标轴交点位置->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.Crosses = xlAxisCrossesMaximum
  axs2.CrossesAt = 10
End Sub

运行代码,生成图表如图2-5所示。

Document Image
\[\]

图2-5 设置坐标轴的交点

刻度线

刻度线是坐标轴上的短线,用来辅助确定图表上各点的位置。刻度线有主刻度线和次刻度线。

用Axis对象的MajorTickMark和MinorTickMark属性设置主刻度线和次刻度线。MajorTickMark和MinorTickMark属性的取值如表2-4所示,可以有不同的表示形式。

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

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

下面创建图表,将横坐标轴的主刻度线设置为跨轴形式,将次刻度线设置为轴内显示。完整代码见:Samples->ch03图表基础->14 坐标系:刻度线->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.MajorTickMark = 4    '刻度线样式
  axs.MinorTickMark = 2
End Sub

运行代码,生成图表如图2-6所示。

Document Image
\[\]

图2-6 设置刻度线的显示样式

刻度线间隔

刻度线间隔控制在坐标轴上隔多远绘一根刻度线。

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

code.vba
axs.TickMarkSpacing=1

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

code.vba
axs2.MajorUnit=40
axs2.MinorUnit=10

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

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

code.vba
axs2.MajorUnitIsAuto=True
axs2.MinorUnitIsAuto=True

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

下面创建图表并设置坐标轴刻度线之间的间隔。完整代码见:Samples->ch03图表基础->15 坐标系:刻度线间隔->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.TickMarkSpacing = 2
  axs2.MajorUnit = 50
  axs2.MinorUnit = 10
  axs2.MinorTickMark = xlTickMarkInside
End Sub

运行代码,生成图表如图2-7所示。

Document Image
\[\]

图2-7 设置坐标轴刻度线间隔

刻度标签

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

分类轴刻度标签的文本为图表中关联分类的名称。分类轴的默认刻度标签文本为数字,它们按照从左到右的顺序从1开始累加编号。

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

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

下面创建图表并设置数值轴刻度标签的数字显示格式、字体和显示方向。完整代码见:Samples->ch03图表基础->16 坐标系:刻度标签->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  Dim tl As TickLabels
  Dim strLabels(5) As String
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  strLabels(0) = "Monday"
  strLabels(1) = "Tuesday"
  strLabels(2) = "Wednesday"
  strLabels(3) = "Thursday"
  strLabels(4) = "Friday"
  strLabels(5) = "Saturday"
  cht.SeriesCollection(1).XValues = strLabels
  Set tl = axs.TickLabels
  tl.Font.Name = "Times New Roman" '字体名称
  tl.Orientation = 45 '45度方向
End Sub

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

Document Image
\[\]

图2-8 数值轴刻度标签的设置

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

表2-2 TickLabelPosition属性的取值

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

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

code.vba
Set tl=axs.TickLabels
tl.TickLabelPosition=-4127

刻度标签间隔

刻度标签标示坐标轴上刻度线对应的数据或类别。Excel和Python xlwings都可以实现刻度标签间隔的设置。

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

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

code.vba
axs.TickLabels.TickLabelSpacing=1

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

code.vba
axs.TickLabelSpacingIsAuto=True

数值轴刻度标签的间隔设置请参见3.4.7小节介绍的主刻度线的间隔设置方法。

下面创建图表并设置横轴的刻度标签间隔。完整代码见:Samples->ch03图表基础->17 坐标系:刻度标签间隔->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  Dim tl As TickLabels
  Dim strLabels(5) As String
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  strLabels(0) = "Monday"
  strLabels(1) = "Tuesday"
  strLabels(2) = "Wednesday"
  strLabels(3) = "Thursday"
  strLabels(4) = "Friday"
  strLabels(5) = "Saturday"
  cht.SeriesCollection(1).XValues = strLabels
  Set tl = axs.TickLabels
  tl.Font.Name = "Times New Roman" '字体名称
  tl.Orientation = 45 '45度方向
  axs.TickLabelSpacing = 2
End Sub

运行代码,生成图表如图2-9所示。

Document Image
\[\]

图2-9 设置横轴刻度标签的显示间隔

刻度标签输出格式

Excel和Python xlwings可以设置刻度标签的输出格式和文字方向等。

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

下面创建图表并设置纵轴刻度标签倾斜显示。完整代码见:Samples->ch03图表基础->18 坐标系:刻度标签输出格式->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  Dim tl As TickLabels
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  Set tl = axs2.TickLabels '纵轴刻度标签
  tl.NumberFormat = "0.00"  '数字格式
  tl.Font.Italic = True '字体倾斜
  tl.Font.Name = "Times New Roman" '字体名称
  tl.Orientation = 45 '45度方向
End Sub

运行代码,生成图表如图2-10所示。

Document Image
\[\]

图2-10 设置纵轴刻度标签倾斜显示

网格线

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

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

下面创建图表,显示主网格线,并将其颜色设置为红色,线型设置为虚线。完整代码见:Samples->ch03图表基础->19 坐标系:网格线->py.py。

code.vba
Sub Test2()
  Dim cht As Chart
  Dim axs As Axis
  Dim axs2 As Axis
  Dim gl1 As Gridlines
  Dim gl2 As Gridlines
  Dim gl3 As Gridlines
  Dim gl4 As Gridlines
  ActiveSheet.Range("A1:B7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart.Chart '添加图表
  Set axs = cht.Axes(1) '水平轴
  Set axs2 = cht.Axes(2) '纵轴
  axs.HasMajorGridlines = True
  axs.HasMinorGridlines = True
  axs2.HasMajorGridlines = True
  axs2.HasMinorGridlines = True
  Set gl1 = axs.MajorGridlines
  gl1.Format.Line.ForeColor.RGB = RGB(0, 0, 200)
  gl1.Format.Line.DashStyle = msoLineDashDotDot
  Set gl2 = axs.MinorGridlines
  gl2.Format.Line.ForeColor.RGB = RGB(200, 200, 200)
  gl2.Format.Line.DashStyle = msoLineDashDotDot
  Set gl3 = axs2.MajorGridlines
  gl3.Format.Line.ForeColor.RGB = RGB(0, 0, 200)
  gl3.Format.Line.DashStyle = msoLineDashDotDot
  Set gl4 = axs2.MinorGridlines
  gl4.Format.Line.ForeColor.RGB = RGB(200, 200, 200)
  gl4.Format.Line.DashStyle = msoLineDashDotDot
End Sub

运行代码,生成图表如图2-11所示。

Document Image
\[\]

图2-11 给图表添加网格

外框

图表外框指的是图表绘图区的外边线。给图表添加外框可以增强图表的整体感。默认时Excel图表样式没有显示外框,只有一个显示图表区范围的更大的矩形框。

编程显示图表外框,将图表对象的PlotArea子对象的线形图元对象设置为可见,并设置其属性。下面创建图表并给图表添加外框。完整代码见:Samples->ch03图表基础->20 坐标系:外框->py.py。

code.vba
Sub Test()
  Dim cht As Chart
  ActiveSheet.Range("A1:B7").Select
  Set cht = ActiveSheet.Shapes.AddChart2(-1, xlColumnClustered, _
                        200, 20, 350, 250, True).Chart
  cht.PlotArea.Format.Line.ForeColor.RGB = RGB(200, 200, 200)
  cht.PlotArea.Format.Line.Weight = 1
End Sub

运行代码,生成图表如图2-12所示。

Document Image
\[\]

图2-12 给图表添加外框