图表元素

本节介绍图表元素如图表区域、绘图区、图例、标题等的设置。图表元素是图表的必要组成部分,它们对图表本身进行美化和补充说明。[大谦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。

code.vba
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所示。

Document Image

图2-15 设置图表标题

数据标签

数据标签表示图表中数据点处的数据。在图表上添加数据标签便于更精确地阅读图表。数据标签可以根据需要显示在不同的位置。

图例用Legend对象表示,使用Chart对象的HasLegend属性设置显示图例,使用Legend属性返回Legend对象。利用Legend对象的属性和方法对图例的外观、字体和位置等进行设置。完整代码见:Samples->ch03图表基础->24 图表元素:数据标签->py.py。

code.vba
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所示。

Document Image

图2-16 给图表添加数据标签

绘图区

绘图区是由坐标系中两个坐标轴所确定的矩形区域。可以修改绘图区的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。

Excel中用Chart对象的PlotArea属性获取绘图区。连续引用ChartArea对象和PlotArea对象的Format.Fill属性,可以对绘图区的属性进行设置。

下面创建图表,获取图表区域并对该区域进行渐变色填充。完整代码见:Samples->ch03图表基础->25 图表元素:绘图区->py.py。

code.vba
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所示的图表。

Document Image

图2-17 对绘图区进行渐变色填充

下面的代码创建图表并用图片填充绘图区。完整代码见:Samples->ch03图表基础->26 图表元素:绘图区2->py.py。

code.vba
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。

Document Image

图2-18 用图片填充绘图区

图表区

图表区是包含整个图表的矩形区域,可以对图表区的面进行设置,比如设置它们的颜色、透明度等,或进行渐变色填充、图案填充、图片填充、纹理填充等。

Excel中使用Chart对象的ChartArea属性获取图表区。连续引用ChartArea对象的Format.Fill属性,可以设置图表区的属性。

下面创建图表,获取图表区域并用图片填充该区域。完整代码见:Samples->ch03图表基础->27 图表元素:图表区->py.py。

code.vba
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。

Document Image

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

code.vba
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所示的图表。

Document Image Document Image

图2-20 图例效果1 图2-21 图例效果2

下面创建复合柱状图,设置图例背景区域为黄色,位置为图表右侧。完整代码见:Samples->ch03图表基础->29 图表元素:图例2->py.py。

code.vba
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。

code.vba
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所示的图表。

Document Image Document Image

图2-22 图例效果1 图2-23 图例效果2

下面创建复合柱状图,设置图例位置为图表上方。完整代码见:Samples->ch03图表基础->31 图表元素:图例4->py.py。

code.vba
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所示的图表。