坐标系的常见设置

坐标系的常见设置包括坐标轴、刻度线、刻度标签、网格线等的设置。[大谦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属性。完整代码见:Samples->ch03图表基础->09 坐标系:坐标轴->py.py。

code.python
import xlwings as xw    #导入xlwings包
import os    #导入OS包
root=os.getcwd()    #获取当前工作路径
app=xw.App(visible=True,add_book=False)    #创建Excel应用
wb=app.books.open(root+r’/data.xlsx’,read_only=False)    #打开数据文件返回工作簿对象
sht=wb.sheets(‘Sheet1’)    #获取指定工作表对象
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs2.Border.Color=xw.utils.rgb_to_int((0, 0, 255))    #兰色
axs2.Border.Weight=3    #线宽

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

Document Image
\[\]

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

坐标轴标题

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

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs2.Border.Color=xw.utils.rgb_to_int((0, 0, 255))    #兰色
axs2.Border.Weight=3    #线宽

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

Document Image
\[\]

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

数值轴取值范围

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs2=cht.Axes(2)    #纵轴
axs2.MinimumScale=10    #数值轴取值范围的最小值
axs2.MaximumScale=200    #数值轴取值范围的最大值

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

Document Image
\[\]

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

坐标轴反向

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs.ReversePlotOrder=True    #反转横轴
axs2.ReversePlotOrder=True    #反转纵轴

运行代码,生成图表如图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.python
cht.Axes(1).Crosses=2

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

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

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs.Crosses=xw.constants.AxisCrosses.xlAxisCrossesMaximum    #纵轴位于横轴最大值处
axs2.CrossesAt=10    #横轴位于纵轴值为10的位置

运行代码,生成图表如图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.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs.MajorTickMark=4    #刻度线样式
axs.MinorTickMark=2

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

Document Image
\[\]

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

刻度线间隔

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

用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。

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs.TickMarkSpacing=2    #横轴上每两个分组显示一个主刻度线
axs2.MajorUnit=50    #数值轴上主刻度线间隔为50
axs2.MinorUnit=10    #数值轴上次刻度线间隔为10
axs2.MinorTickMark=xw.constants.TickMark.xlTickMarkInside    #次刻度线样式朝内

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

Document Image
\[\]

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

刻度标签

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

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

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

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
labels=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']    #横轴刻度标签文本
cht.SeriesCollection(1).XValues=labels    #添加横轴刻度标签
tl=axs.TickLabels    #返回横轴刻度标签
tl.Font.Name='Times New Roman'    #设置刻度标签的字体名称
tl.Orientation=45    #设置45度显示方向

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

Document Image
\[\]

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

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

表2-2 TickLabelPosition属性的取值

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

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

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

刻度标签间隔

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

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

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

code.python
axs.TickLabels.TickLabelSpacing=1

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

code.python
axs.TickLabelSpacingIsAuto=True

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
labels=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']    #横轴刻度标签文本
cht.SeriesCollection(1).XValues=labels    #添加横轴刻度标签
tl=axs.TickLabels    #获取横轴刻度标签
tl.Font.Name='Times New Roman'    #字体名称
tl.Orientation=45    #45度方向
axs.TickLabelSpacing=2    #横轴上刻度标签每两个分组显示一个

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

Document Image
\[\]

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

刻度标签输出格式

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

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
tl=axs2.TickLabels    #纵轴刻度标签
tl.NumberFormat='0.00'    #数字格式
tl.Font.Italic=True    #字体倾斜
tl.Font.Name='Times New Roman'    #字体名称
tl.Orientation=45    #45度方向

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

Document Image
\[\]

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

网格线

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

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
shp=sht.api.Shapes.AddChart()    #添加图表
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1)    #水平轴
axs.Border.ColorIndex=3    #红色
axs.Border.Weight=3    #线宽
axs2=cht.Axes(2)    #纵轴
axs.HasMajorGridlines=True    #显示横轴主网格线
axs.HasMinorGridlines=True    #显示横轴次网格线
axs2.HasMajorGridlines=True    #显示纵轴主网格线
axs2.HasMinorGridlines=True    #显示纵轴次网格线
gl1=axs.MajorGridlines    #获取横轴主网格线
gl1.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,200))    #设置颜色
gl1.Format.Line.DashStyle=5    #msoLineDashDotDot    #设置线型
gl2=axs.MinorGridlines
gl2.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200))
gl2.Format.Line.DashStyle=5    #msoLineDashDotDot
gl3=axs2.MajorGridlines
gl3.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,200))
gl3.Format.Line.DashStyle=5    #msoLineDashDotDot
gl4=axs2.MinorGridlines
gl4.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200))
gl4.Format.Line.DashStyle=5    #msoLineDashDotDot

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

Document Image
\[\]

图2-11 给图表添加网格

外框

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

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

code.python
#... 省略部分代码
sht.api.Range('A1:B7').Select()    #数据
cht=sht.api.Shapes.AddChart2(-1, xw.constants.ChartType.xlColumnClustered, \
                        20,20,350,250, True).Chart    #创建图表
cht.PlotArea.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200))    #外框的颜色
cht.PlotArea.Format.Line.Weight=1    #外框的线宽

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

Document Image
\[\]

图2-12 给图表添加外框