获取图表中的基本图形元素

首先介绍对图表局部进行修改。修改局部图形元素的属性,首先需要获取到对应的图形元素。本节介绍怎样获取到图表中的点、线、面和文本等基本图形元素。[大谦Excel,dqexcel点com]

获取图表中的序列

对于图3-2中生成的复合柱状图,每个省市对应一个复合柱面,称为分组,每个分组中有六个不同颜色的单一柱面,所有省市相同颜色的单一柱面一起组成一个序列。所以,图中一共有六个序列,六个分组。可以选择序列,然后对该序列进行属性设置。

每个Chart对象都有一个SeriesCollection属性,它返回一个包含图表中所有序列的集合,对该集合进行索引,可以获取指定序列。用Series对象表示序列。

下面用Shapes对象绘制图表,修改第一个序列柱面和边线的颜色,修改分组之间的间隔和分组内部各柱面之间的间隔。完整代码见:Samples->ch04 美化Excel图表->01 获取和修改序列属性2->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('A2:C8').Select()    #数据
shp=sht.api.Shapes.AddChart2(-1, xw.constants.ChartType.xlColumnClustered,20,20,350,250,True)
cht=shp.Chart    #添加图表
cht.SeriesCollection(1).Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((76,200,132))  #序列1填充
cht.SeriesCollection(1).Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #序列1边线
cht.ChartGroups(1).GapWidth=100    #分组之间的距离
cht.ChartGroups(1).Overlap=-15    #分组内部柱面之间的距离

运行代码后生成的图表如图1-1中所示。第一个序列的颜色从兰色改成了绿色,边线改成了兰色。分组之间的间隔设置为100%柱面宽度,分组内部各柱面之间的间隔设置为-15,表示间隔15%柱面宽度,如果该值为正,分组内相邻柱面会出现重叠。

Document Image
\[\]

图1-1 修改图表中第1个序列的属性

获取序列中的单个点

序列表示复合柱状图中颜色相同的一组柱面,如果对这组柱面中的某个或某几个柱面感兴趣,需要单独设置它们的属性,就要用到序列中的点这个概念。注意,这里说的点不是几何意义上的点,而是数据点,可以用不同图形元素如点标记、柱面、扇面等表示数据点。

使用Series对象的Points属性,可以获取序列中的全部数据点。通过索引,可以把其中的某个或某些点提取出来进行设置。单个的点用Point对象表示,利用该对象的属性和方法,可以对指定的点进行设置。点的设置主要用于折线图、柱状图、条形图、面积图和饼图等。

下面的代码获取图表指定序列中数据点的个数。

code.python
>>> num=ser.Points().Count
num
6

下面创建图表,修改第一个序列中第二个柱面的颜色为绿色。完整代码见:Samples->ch04 美化Excel图表->02 获取和修改序列中点的属性->py.py。

code.python
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('A2:C8').Select()  #数据
shp=sht.api.Shapes.AddChart2(-1, xw.constants.ChartType.xlColumnClustered,20,20,350,250,True)
cht=shp.Chart  #添加图表
#序列1中第2个数据点点标记内部填充的前景色
cht.SeriesCollection(1).Points(2).Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((76,200,132))
#序列1中第2个数据点点标记边线的前景色
cht.SeriesCollection(1).Points(2).Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))
cht.ChartGroups(1).GapWidth=100    #分组之间的距离
cht.ChartGroups(1).Overlap=-15    #分组内部柱面之间的距离

设置效果如图1-2所示。设置以后,序列中第3个点进行了突出显示。

Document Image
\[\]

图1-2 设置第1个序列中第2个点的属性