本节介绍图表元素如图表区域、绘图区、图例、标题等的设置。图表元素是图表的必要组成部分,它们对图表本身进行美化和补充说明。[大谦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。
Sub CreateChart()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnClustered, 200, 20, 350, 250, True).Chart
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 = RGB(255, 0, 0)
SetStyle cht, 0, 0.28
End Sub
运行代码,设置效果如图2-15所示。
图2-15 设置图表标题
数据标签
数据标签表示图表中数据点处的数据。在图表上添加数据标签便于更精确地阅读图表。数据标签可以根据需要显示在不同的位置。
图例用Legend对象表示,使用Chart对象的HasLegend属性设置显示图例,使用Legend属性返回Legend对象。利用Legend对象的属性和方法对图例的外观、字体和位置等进行设置。完整代码见:Samples->ch03图表基础->24 图表元素:数据标签->py.py。
Sub CreateChart()
Dim cht As Chart
ActiveSheet.Range("A2:B11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnClustered, 200, 20, 350, 220, True).Chart
cht.SetElement 201
SetStyle cht, 0, 0.28
End Sub
运行代码,创建图表并显示数据标签,如图2-16所示。
图2-16 给图表添加数据标签
绘图区
绘图区是由坐标系中两个坐标轴所确定的矩形区域。可以修改绘图区的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。
Excel中用Chart对象的PlotArea属性获取绘图区。连续引用ChartArea对象和PlotArea对象的Format.Fill属性,可以对绘图区的属性进行设置。
下面创建图表,获取图表区域并对该区域进行渐变色填充。完整代码见:Samples->ch03图表基础->25 图表元素:绘图区->py.py。
Sub CreateChart()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnClustered, 200, 20, 350, 250, True).Chart
cht.PlotArea.Format.Fill.ForeColor.RGB = RGB(255, 255, 26)
cht.PlotArea.Format.Fill.OneColorGradient msoGradientHorizontal, 1, 1
SetStyle cht, 0, 0.28
End Sub
运行代码,生成图2-17所示的图表。
图2-17 对绘图区进行渐变色填充
下面的代码创建图表并用图片填充绘图区。完整代码见:Samples->ch03图表基础->26 图表元素:绘图区2->py.py。
Sub CreateChart2()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnClustered, 200, 20, 350, 250, True).Chart
cht.SeriesCollection(1).ChartType = xlLine
cht.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(255, 255, 0)
cht.PlotArea.Format.Fill.UserPicture("d:\picpy2.jpg")
SetStyle cht, 0, 0.28
End Sub
运行代码生成图2-18。
图2-18 用图片填充绘图区
图表区
图表区是包含整个图表的矩形区域,可以对图表区的面进行设置,比如设置它们的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。
Excel中使用Chart对象的ChartArea属性获取图表区。连续引用ChartArea对象的Format.Fill属性,可以设置图表区的属性。
下面创建图表,获取图表区域并用图片填充该区域。完整代码见:Samples->ch03图表基础->27 图表元素:图表区->py.py。
Sub CreateChart()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnClustered, 200, 20, 350, 250, True).Chart
cht.ChartArea.Format.Fill.UserPicture("d:\pic.jpg")
cht.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
SetStyle cht, 0, 0.28
cht.Legend.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)
End Sub
运行代码生成图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。
Sub CreateChart()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnStacked, 200, 20, 350, 250, True).Chart
Dim leg As Legend
cht.HasLegend = True
Set leg = cht.Legend
leg.Position = xlLegendPositionBottom
leg.Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
SetStyle cht
End Sub
运行代码,生成图2-20所示的图表。
图2-20 图例效果1 图2-21 图例效果2
下面创建复合柱状图,设置图例背景区域为黄色,位置为图表右侧。完整代码见:Samples->ch03图表基础->29 图表元素:图例2->py.py。
Sub CreateChart2()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnStacked, 200, 20, 350, 250, True).Chart
Dim leg As Legend
cht.HasLegend = True
Set leg = cht.Legend
leg.Position = xlLegendPositionRight
leg.Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
leg.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
leg.Format.Line.Weight = 2
SetStyle cht
End Sub
运行代码,生成图2-21所示的图表。
下面创建复合柱状图,设置图例背景区域为绿色,文本为白色,位置为图表下方。完整代码见:Samples->ch03图表基础->30 图表元素:图例2->py.py。
Sub CreateChart3()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnStacked, 200, 20, 350, 250, True).Chart
Dim leg As Legend
cht.HasLegend = True
Set leg = cht.Legend
leg.Position = xlLegendPositionBottom
leg.Format.Fill.ForeColor.RGB = RGB(0, 200, 0)
leg.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 255, 255)
leg.Format.TextFrame2.TextRange.Font.Name = "Arial"
leg.Format.TextFrame2.TextRange.Font.Italic = True
SetStyle cht
End Sub
运行代码,生成图2-22所示的图表。
图2-22 图例效果1 图2-23 图例效果2
下面创建复合柱状图,设置图例位置为图表上方。完整代码见:Samples->ch03图表基础->31 图表元素:图例4->py.py。
Sub CreateChart4()
Dim cht As Chart
ActiveSheet.Range("A2:C11").Select '数据
Set cht = ActiveSheet.Shapes.AddChart2(-1, _
xlColumnStacked, 200, 20, 350, 250, True).Chart
Dim leg As Legend
cht.HasLegend = True
Set leg = cht.Legend
leg.Position = xlLegendPositionTop
leg.Shadow = True
leg.Left = 80
leg.Width = 200
SetStyle cht
End Sub
Sub SetStyle(cht As Chart)
cht.ChartArea.Format.Line.Visible = msoFalse
cht.PlotArea.Format.Fill.Visible = msoFalse
With cht.PlotArea.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(200, 200, 200)
End With
Dim ax1 As Axis
Dim ax2 As Axis
Set ax1 = cht.Axes(1)
Set ax2 = cht.Axes(2)
ax2.HasMajorGridlines = False
ax1.HasTitle = True
ax1.AxisTitle.Text = "Categories"
ax1.AxisTitle.Font.Size = 10
ax1.TickLabels.Font.Size = 8
'ax1.TickLabels.NumberFormat = "0.00"
'ax1.HasMajorGridlines = True
ax2.HasTitle = True
ax2.AxisTitle.Text = "Values"
ax2.AxisTitle.Font.Size = 10
ax2.TickLabels.Font.Size = 8
'ax2.HasMajorGridlines = True
cht.HasTitle = True
'cht.ChartTitle.Caption = "KDE Plot"
'cht.ChartTitle.Font.Size = 12
End Sub
运行代码,生成图2-23所示的图表。