坐标系的常见设置包括坐标轴、刻度线、刻度标签、网格线等的设置。[大谦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属性。完整代码见:Samples->ch03图表基础->09 坐标系:坐标轴->py.py。
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所示。
图2-1 获取和设置坐标轴
坐标轴标题
给图表添加坐标轴标题,可以标示各坐标轴数据表示的意义。使用Excel和Python xlwings可以添加坐标轴标题并设置和修改它们的属性。
使用Axis对象的HasTitle属性设置是否显示坐标轴标题,用AxisTitle属性设置坐标轴标题的文本内容。注意,必须设置HasTitle属性的值为True后才能设置AxisTitle属性。AxisTitle属性返回一个AxisTitle对象,利用它设置坐标轴标题的文本和字体。
下面创建图表并给两个坐标轴添加标题。横坐标轴标题用红色显示,字体倾斜;纵坐标轴标题字体加粗。完整代码见:Samples->ch03图表基础->10 坐标系:坐标轴标题->py.py。
#... 省略部分代码
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所示。
图2-2 添加和设置坐标轴标题
数值轴取值范围
Excel图表中,对于数值轴可以设置取值范围,即可以设置数据的最小值和最大值。设置坐标轴的取值范围,可以控制图表的整体显示外观。注意,Excel图表中不能对分类轴和序列轴设置取值范围。
默认时纵轴为数值轴。使用纵轴对象的MinimumScale和MaximumScale属性设置数值轴的最小值和最大值。下面设置纵轴的最小值和最大值分别为10和200。完整代码见:Samples->ch03图表基础->11 坐标系:坐标轴取值范围->py.py。
#... 省略部分代码
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所示。注意纵轴,即数值轴的取值范围已经被修改,图表也相应地有变化。
图2-3 设置纵轴的取值范围
坐标轴反向
默认时,Excel图表的横轴向右为正,纵轴向上为正。特殊情况下需要反转坐标轴,比如表现地面以下土的沉降、地下水位的变化等,需要图表纵轴向下为正。使用Excel和Python xlwings可以方便地反转坐标轴的方向。
设置坐标轴对象的ReversePlotOrder属性的值为True,反转对应坐标轴,图表也相应反转。下面创建图表并反转两个坐标轴。完整代码见:Samples->ch03图表基础->12 坐标系:坐标轴反向->py.py。
#... 省略部分代码
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所示。注意,两个坐标轴刻度标签显示取值顺序与默认时相反了。
图2-4 反转坐标轴
坐标轴交点位置
图表坐标系是自定义坐标系,坐标原点和坐标轴的方向可以自己定义。3.4.4小节介绍了自定义坐标轴的方向,这里介绍自定义坐标系的原点,即坐标轴的交点。
用Axis对象的Crosses属性返回或设置指定坐标轴与其他坐标轴相交的点。该属性的取值如表2-1中所示。
表2-1 Axis对象Crosses属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlAxisCrossesAutomatic | -4105 | 由Excel设置坐标轴交点 |
| xlAxisCrossesCustom | -4114 | CrossesAt属性指定坐标轴交点 |
| xlAxisCrossesMaximum | 2 | 坐标轴在最大值处相交 |
| xlAxisCrossesMinimum | 4 | 坐标轴在最小值处相交 |
下面设置图表上的数值轴在最大x值处与分类轴相交。
cht.Axes(1).Crosses=2
用Axis对象的AxisBetweenCategories属性设置分类轴和数值轴相交的位置。如果该属性的值为True,则相交的位置在分类之间的中间位置;值为False时,相交的位置在分类中间的位置。
使用Axis对象的CrossesAt属性返回或设置数值轴与分类坐标轴的交点,仅用于数值轴。下面设置横轴与纵轴在纵轴取值为20.0的地方相交。
cht.Axes(2).CrossesAt=20.0
下面创建图表,设置两个坐标轴的交点位于横轴为最大值、纵轴取值为10处。完整代码见:Samples->ch03图表基础->13 坐标系:坐标轴交点位置->py.py。
#... 省略部分代码
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所示。
图2-5 设置坐标轴的交点
刻度线
刻度线是坐标轴上的短线,用来辅助确定图表上各点的位置。刻度线有主刻度线和次刻度线。
用Axis对象的MajorTickMark和MinorTickMark属性设置主刻度线和次刻度线。MajorTickMark和MinorTickMark属性的取值如表2-4所示,可以有不同的表示形式。
表2-4 刻度线设置参数的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlTickMarkCross | 4 | 跨轴 |
| xlTickMarkInside | 2 | 在轴内 |
| xlTickMarkNone | -4142 | 无标志 |
| xlTickMarkOutside | 3 | 在轴外 |
下面创建图表,将横坐标轴的主刻度线设置为跨轴形式,将次刻度线设置为轴内显示。完整代码见:Samples->ch03图表基础->14 坐标系:刻度线->py.py。
#... 省略部分代码
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所示。
图2-6 设置刻度线的显示样式
刻度线间隔
刻度线间隔控制在坐标轴上隔多远绘一根刻度线。
用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。
下面创建图表并设置坐标轴刻度线之间的间隔。完整代码见:Samples->ch03图表基础->15 坐标系:刻度线间隔->py.py。
#... 省略部分代码
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所示。
图2-7 设置坐标轴刻度线间隔
刻度标签
坐标轴上与主刻度线位置对应的文本标签称为刻度标签,它们对主刻度线对应的数值或分类进行标注说明。
分类轴刻度标签的文本为图表中关联分类的名称。分类轴的默认刻度标签文本为数字,它们按照从左到右的顺序从1开始累加编号。
数值轴刻度标签的文本数字对应于数值轴的MajorUnit, MinimumScale和MaximumScale属性。若要更改数值轴的刻度标签文字,必须更改这些属性的值。
Axis对象的TickLabels属性返回一个TickLabels对象,它表示坐标轴上的刻度标签。使用TickLabels对象的属性和方法,可以对刻度标签的字体、数字显示格式、显示方向、偏移量和对齐方式等进行设置。
下面创建图表并设置数值轴刻度标签的数字显示格式、字体和显示方向。完整代码见:Samples->ch03图表基础->16 坐标系:刻度标签->py.py。
#... 省略部分代码
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中数值轴的刻度标签所示。
图2-8 数值轴刻度标签的设置
用TickLabelPosition属性指定坐标轴上刻度标签的位置,值为表2-2中所示的常数或值。
表2-2 TickLabelPosition属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlTickLabelPositionHigh | -4127 | 图表的顶部或右侧 |
| xlTickLabelPositionLow | -4134 | 图表的底部或左侧 |
| xlTickLabelPositionNextToAxis | 4 | 坐标轴旁边(其中坐标轴不在图表的任意一侧) |
| xlTickLabelPositionNone | -4142 | 无刻度线 |
下面将图表分类轴上的刻度标签设置为顶部。
tl=axs.TickLabels
tl.TickLabelPosition=-4127
刻度标签间隔
刻度标签标示坐标轴上刻度线对应的数据或类别。Excel和Python xlwings都可以实现刻度标签间隔的设置。
用TickLabelSpacing属性返回或设置刻度标签之间的分类数或数据系列数,即每隔几个分类显示一个刻度标签。仅用于分类轴和系列轴,可以是1到31999之间的一个数值。
下面设置分类轴上刻度标签之间的分类数为1。
axs.TickLabels.TickLabelSpacing=1
设置TickLabelSpacingIsAuto属性的值为True,自动设置刻度标签的间距。
axs.TickLabelSpacingIsAuto=True
数值轴刻度标签的间隔设置请参见3.4.7小节介绍的主刻度线的间隔设置方法。
下面创建图表并设置横轴的刻度标签间隔。完整代码见:Samples->ch03图表基础->17 坐标系:刻度标签间隔->py.py。
#... 省略部分代码
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所示。
图2-9 设置横轴刻度标签的显示间隔
刻度标签输出格式
Excel和Python xlwings可以设置刻度标签的输出格式和文字方向等。
代码中,TickLabels对象的Orientation属性指定刻度线标签的文本方向,当标签比较长时这个属性很有用。此属性的值可以设置为-90到90度。
下面创建图表并设置纵轴刻度标签倾斜显示。完整代码见:Samples->ch03图表基础->18 坐标系:刻度标签输出格式->py.py。
#... 省略部分代码
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所示。
图2-10 设置纵轴刻度标签倾斜显示
网格线
在坐标系中添加网格线,可以辅助定位图表中点的位置,相当于多了很多参考线,每条线对应到各自刻度标签所表示的值。
网格线用Gridlines对象表示,使用它的Border或Format属性,可以设置网格线的颜色、线型、线宽等属性。利用Axis对象的MajorGridlines和MinorGridlines属性返回Gridlines对象,它们分别设置主网格线和次网格线。设置之前,必须将Axis对象的HasMajorGridlines和(或) HasMinorGridlines属性的值设置为True。
下面创建图表,显示主网格线,并将其颜色设置为红色,线型设置为虚线。完整代码见:Samples->ch03图表基础->19 坐标系:网格线->py.py。
#... 省略部分代码
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所示。
图2-11 给图表添加网格
外框
图表外框指的是图表绘图区的外边线。给图表添加外框可以增强图表的整体感。默认时Excel图表样式没有显示外框,只有一个显示图表区范围的更大的矩形框。
编程显示图表外框,将图表对象的PlotArea子对象的线形图元对象设置为可见,并设置其属性。下面创建图表并给图表添加外框。完整代码见:Samples->ch03图表基础->20 坐标系:外框->py.py。
#... 省略部分代码
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所示。
图2-12 给图表添加外框