本节介绍图表元素如图表区域、绘图区、图例、标题等的设置。图表元素是图表的必要组成部分,它们对图表本身进行美化和补充说明。[大谦Excel,dqexcel点com]
设置图表元素
使用Excel和Python xlwings可以方便地给图表添加图表元素。
使用Chart对象的SetElement方法可以为指定图表设置图表元素。该方法有一个参数,提供进行设置的选项。参数取值如表2-4所示。可见,该方法提供了很多图表元素的快捷设置途径。注意,这些设置不一定适合所有图表类型。
表2-4 SetElement方法的参数设置
| 名 称 | 值 | 说 明 |
|---|---|---|
| msoElementChartFloorNone | 1200 | 不显示图表基底 |
| msoElementChartFloorShow | 1201 | 显示图表基底 |
| msoElementChartTitleAboveChart | 2 | 在图表上方显示标题 |
| msoElementChartTitleCenteredOverlay | 1 | 将标题显示为居中覆盖 |
| msoElementChartTitleNone | 0 | 不显示图表标题 |
| msoElementChartWallNone | 1100 | 不显示图表背景墙 |
| msoElementChartWallShow | 1101 | 显示图表背景墙 |
| msoElementDataLabelBestFit | 210 | 使用数据标签最佳位置 |
| msoElementDataLabelBottom | 209 | 在底部显示数据标签 |
| msoElementDataLabelCallout | 211 | 将数据标签显示为标注 |
| msoElementDataLabelCenter | 202 | 居中显示数据标签 |
| msoElementDataLabelInsideBase | 204 | 在底端内侧显示数据标签 |
| msoElementDataLabelInsideEnd | 203 | 在顶端内侧显示数据标签 |
| msoElementDataLabelLeft | 206 | 靠左显示数据标签 |
| msoElementDataLabelNone | 200 | 不显示数据标签 |
| msoElementDataLabelOutSideEnd | 205 | 在顶端外侧显示数据标签 |
| msoElementDataLabelRight | 207 | 靠右显示数据标签 |
| msoElementDataLabelShow | 201 | 显示数据标签 |
| msoElementDataLabelTop | 208 | 在顶部显示数据标签 |
| msoElementDataTableNone | 500 | 不显示模拟运算表 |
| msoElementDataTableShow | 501 | 显示模拟运算表 |
| msoElementDataTableWithLegendKeys | 502 | 显示带图例项标示的模拟运算表 |
| msoElementErrorBarNone | 700 | 不显示误差线 |
| msoElementErrorBarPercentage | 702 | 显示百分比误差线 |
| msoElementErrorBarStandardDeviation | 703 | 显示标准偏差误差线 |
| msoElementErrorBarStandardError | 701 | 显示标准误差线 |
| msoElementLegendBottom | 104 | 在底部显示图例 |
| msoElementLegendLeft | 103 | 在左侧显示图例 |
| msoElementLegendLeftOverlay | 106 | 在左侧叠放图例 |
| msoElementLegendNone | 100 | 不显示图例 |
| msoElementLegendRight | 101 | 在右侧显示图例 |
| msoElementLegendRightOverlay | 105 | 在右侧叠放图例 |
| msoElementLegendTop | 102 | 在顶部显示图例 |
| msoElementLineDropHiLoLine | 804 | 显示垂直线和高/低线 |
| msoElementLineDropLine | 801 | 显示垂直线 |
| msoElementLineHiLoLine | 802 | 显示高/低线 |
| msoElementLineNone | 800 | 不显示线 |
| msoElementLineSeriesLine | 803 | 显示系列线 |
| msoElementPlotAreaNone | 1000 | 不显示绘图区 |
| msoElementPlotAreaShow | 1001 | 显示绘图区 |
图表标题
前面介绍了坐标轴标题,这里讲的图标标题是整个图表的标题。使用Excel和Python xlwings可以添加图表标题并设置属性。
用Chart对象的HasTitle属性确定是否显示图表标题,用ChartTitle属性返回一个ChartTitle对象,使用该对象的属性设置图表标题的文本和文本字体。下面创建图表,显示和设置标题,设置标题文本的字体。完整代码见:Samples->ch03图表基础->23 图表元素:标题->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.HasTitle=True #显示图表标题
cht.ChartTitle.Caption='Chart Title' #标题文本
cht.ChartTitle.Characters.Font.Name='Times New Roman' #标题文本的字体,字体名称
cht.ChartTitle.Characters.Font.Size=16 #字体大小
cht.ChartTitle.Characters.Font.Bold=True #字体加粗
cht.ChartTitle.Characters.Font.Color=xw.utils.rgb_to_int((255,0,0)) #字体颜色
运行代码,设置效果如图2-15所示。
图2-15 设置图表标题
数据标签
数据标签表示图表中数据点处的数据。在图表上添加数据标签便于更精确地阅读图表。数据标签可以根据需要显示在不同的位置。
图例用Legend对象表示,使用Chart对象的HasLegend属性设置显示图例,使用Legend属性返回Legend对象。利用Legend对象的属性和方法对图例的外观、字体和位置等进行设置。完整代码见:Samples->ch03图表基础->24 图表元素:数据标签->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.SetElement(201) #显示数据标签
运行代码,创建图表并显示数据标签,如图2-16所示。
图2-16 给图表添加数据标签
绘图区
绘图区是由坐标系中两个坐标轴所确定的矩形区域。可以修改绘图区的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。
Excel中用Chart对象的PlotArea属性获取绘图区。连续引用ChartArea对象和PlotArea对象的Format.Fill属性,可以对绘图区的属性进行设置。
下面创建图表,获取图表区域并对该区域进行渐变色填充。完整代码见:Samples->ch03图表基础->25 图表元素:绘图区->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.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,26)) #绘图区前景色
cht.PlotArea.Format.Fill.OneColorGradient(1,1,1) #绘图区垂向渐变色填充
运行代码,生成图2-17所示的图表。
图2-17 对绘图区进行渐变色填充
下面的代码创建图表并用图片填充绘图区。完整代码见:Samples->ch03图表基础->26 图表元素:绘图区2->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.SeriesCollection(1).Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,0))
cht.PlotArea.Format.Fill.UserPicture('d:/picpy2.jpg') #绘图区图片填充
运行代码生成图2-18。
图2-18 用图片填充绘图区
图表区
图表区是包含整个图表的矩形区域,可以对图表区的面进行设置,比如设置它们的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。
Excel中使用Chart对象的ChartArea属性获取图表区。连续引用ChartArea对象的Format.Fill属性,可以设置图表区的属性。
下面创建图表,获取图表区域并用图片填充该区域。完整代码见:Samples->ch03图表基础->27 图表元素:图表区->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.ChartArea.Format.Fill.UserPicture('d:/pic.jpg') #图表区图片填充
cht.SeriesCollection(1).Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,0)) #序列1颜色
set_style(cht) #设置样式
cht.Legend.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB=\
xw.utils.rgb_to_int((255,255,255)) #图例中的文本为白色
运行代码生成图2-19。
图2-19 设置图表区域和绘图区
图例
当图表中出现一个以上的序列时,需要给图表添加图例,以标示不同颜色、线型、点标记等对应的图形元素所表示的意义。图例可以根据图表整体布局的需要放在不同位置。也可以对图例中的图形和文本进行属性设置。
图例用Legend对象表示,使用Chart对象的HasLegend属性设置显示图例,使用Legend属性返回Legend对象。利用Legend对象的属性和方法对图例的外观、字体和位置等进行设置。
使用Legend对象的Format属性返回的ChartFormat对象,可以对图例的背景区域和外框进行属性设置。使用Legend对象的Font属性返回Font对象,设置字体。使用Legend对象的Position属性设置图例的显示位置。Position属性的取值如表2-5中所示。
表2-5 Position属性的取值
| 名 称 | 值 | 说 明 |
|---|---|---|
| xlLegendPositionBottom | -4107 | 位于图表下方 |
| xlLegendPositionCorner | 2 | 位于图表边框的右上角 |
| xlLegendPositionCustom | -4161 | 位于自定义的位置上 |
| xlLegendPositionLeft | -4131 | 位于图表的左侧 |
| xlLegendPositionRight | -4152 | 位于图表的右侧 |
| xlLegendPositionTop | -4160 | 位于图表的上方 |
下面创建复合柱状图,设置图例背景区域为黄色,位置为图表下方。完整代码见:Samples->ch03图表基础->28 图表元素:图例->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.HasLegend=True #显示图例
leg=cht.Legend #获取图例
leg.Position=xw.constants.LegendPosition.xlLegendPositionBottom #图例位置,底部
leg.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,0)) #图例区域橙色填充
运行代码,生成图2-20所示的图表。
图2-20 图例效果1 图2-21 图例效果2
下面创建复合柱状图,设置图例背景区域为黄色,位置为图表右侧。完整代码见:Samples->ch03图表基础->29 图表元素:图例2->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.HasLegend=True #显示图例
leg=cht.Legend #获取图例
leg.Position=xw.constants.LegendPosition.xlLegendPositionRight #图例位置,右侧
leg.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,0)) #图例区域橙色填充
leg.Format.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,0)) #图例区域边线黑色
leg.Format.Line.Weight=2 #图例区域边线线宽为2
运行代码,生成图2-21所示的图表。
下面创建复合柱状图,设置图例背景区域为绿色,文本为白色,位置为图表下方。完整代码见:Samples->ch03图表基础->30 图表元素:图例2->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.HasLegend=True
leg=cht.Legend
leg.Position=xw.constants.LegendPosition.xlLegendPositionBottom #图例位于图表底部
leg.Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,200,0)) #图例区域绿色填充
#图例内文字白色
leg.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,255,255))
leg.Format.TextFrame2.TextRange.Font.Name='Arial' #图例内文字字体名称
leg.Format.TextFrame2.TextRange.Font.Italic=True #图例内文字倾斜显示
运行代码,生成图2-22所示的图表。
图2-22 图例效果1 图2-23 图例效果2
下面创建复合柱状图,设置图例位置为图表上方。完整代码见:Samples->ch03图表基础->31 图表元素:图例4->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.HasLegend=True
leg=cht.Legend
leg.Position=xw.constants.LegendPosition.xlLegendPositionTop #图例位置,图表顶部
leg.Shadow=True #给图例添加阴影
leg.Left=80 #图例左侧位置
leg.Width=200 #图例宽度
运行代码,生成图2-23所示的图表。