柱状图

点图和线形图以比较简洁的形式表现数据,柱状图及后面介绍的面积图、饼图则用面、用大色块来表现数据,因而更加饱满,更有表现张力。柱状图包括简单柱状图、复合柱状图、堆叠柱状图、百分比堆叠柱状图、重叠柱状图、二维半柱状图和三维柱状图等,表现形式丰富。第5章介绍了柱状图的各种定制方法,可以重新定义柱状图,请参阅。

简单柱状图

简单柱状图用一组柱形面表现一组数据。

Document Image
\[\]

图4-8 简单柱状图

下面用Excel文件data.xlsx中的数据绘制简单柱状图。完整代码见:Samples->ch06 分类型图表->16 简单柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:B9").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 40
  SetStyle cht, 0, 0.22
End Sub

运行代码生成图4-8。

不同色简单柱状图

学术期刊中经常可以看到柱面颜色不同的简单柱状图。Excel中可以绘制简单柱状图后逐个修改柱面的颜色实现。此图涉及到一组多个对象的颜色,要注意配色问题。

Document Image
\[\]

图4-9 不同色简单柱状图

下面用Excel文件data.xlsx中的数据绘制不同色简单柱状图。完整代码见:Samples->ch06 分类型图表->17 不同色简单柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:B9").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 50
  cht.SeriesCollection(1).Points(1).Format.Fill.ForeColor.RGB = RGB(192, 0, 0)
  cht.SeriesCollection(1).Points(2).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
  cht.SeriesCollection(1).Points(3).Format.Fill.ForeColor.RGB = RGB(255, 192, 0)
  cht.SeriesCollection(1).Points(4).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
  cht.SeriesCollection(1).Points(5).Format.Fill.ForeColor.RGB = RGB(146, 208, 80)
  cht.SeriesCollection(1).Points(6).Format.Fill.ForeColor.RGB = RGB(0, 176, 80)
  cht.SeriesCollection(1).Points(7).Format.Fill.ForeColor.RGB = RGB(0, 176, 240)
  cht.SeriesCollection(1).Points(8).Format.Fill.ForeColor.RGB = RGB(0, 112, 192)
  SetStyle cht, 0, 0.22
End Sub

运行代码生成图4-9。

渐变色填充简单柱状图

常常见到用渐变色填充柱状图的柱面,可以用垂直渐变色填充,也可以用水平渐变色填充。Excel中可以实现单色渐变、双色渐变和多色渐变,还可以控制渐变的方向。第4章有比较详细的介绍。

Document Image
\[\]

图4-10 渐变色填充简单柱状图

下面用Excel文件data.xlsx中的数据绘制渐变色填充简单柱状图。完整代码见:Samples->ch06 分类型图表->18 渐变色填充简单柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:B9").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 50
  cht.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
  cht.SeriesCollection(1).Format.Fill.OneColorGradient msoGradientHorizontal, 1, 1
  cht.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
  SetStyle cht, 0, 0.22
End Sub

运行代码生成图4-19。

图案填充简单柱状图

Excel中可以很方便地用图案填充柱状图。图案是一些Excel已经预定义好的花纹。每种花纹有一个编号,使用时指定编号即可。

Document Image
\[\]

图4-20 图案填充简单柱状图

下面用Excel文件data.xlsx中的数据绘制图案填充简单柱状图。完整代码见:Samples->ch06 分类型图表->19 图案填充简单柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:B9").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 40
  cht.SeriesCollection(1).Format.Fill.Patterned msoPatternDiagonalBrick
  cht.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
  SetStyle cht, 0, 0.22
End Sub

运行代码生成图4-20。

图片填充简单柱状图

Excel中还可以用图片填充柱状图,实现一些特殊的效果。

Document Image
\[\]

图4-12 重叠柱状图

下面用Excel文件data.xlsx中的数据绘制图片填充简单柱状图。完整代码见:Samples->ch06 分类型图表->20 图片填充简单柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:B9").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 40
  cht.SeriesCollection(1).Format.Fill.UserPicture "D:\pic.jpg"
  cht.SeriesCollection(1).Format.Line.ForeColor.RGB = RGB(0, 0, 0)
  SetStyle cht, 0, 0.22
End Sub

运行代码生成图4-12。

复合柱状图

复合柱状图是将同一个分组内部的柱面在水平方向上紧凑排列,分组之间的间隔更大。

Document Image
\[\]

图4-13 复合柱状图

下面用Excel文件data.xlsx中的数据绘制复合柱状图。完整代码见:Samples->ch06 分类型图表->21 复合柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnClustered, 200, 20, 350, 250, True).Chart
  SetStyle cht, 0, 0.28
End Sub

运行代码生成图4-13。

堆叠柱状图

堆叠柱状图是将同一个分组中的柱面在垂直方向堆叠排列,可以看作是复合柱状图的另外一种表现形式。

Document Image
\[\]

图4-14 堆叠柱状图

下面用Excel文件data.xlsx中的数据绘制堆叠柱状图。完整代码见:Samples->ch06 分类型图表->22 堆叠柱状图->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
  cht.ChartGroups(1).GapWidth = 50
  SetStyle cht, 0, 0.45
End Sub

运行代码生成图4-14。

百分比堆叠柱状图

百分比堆叠柱状图也是常见的复合柱状图,它是根据每个柱形占它所在分组各柱形高度总和的百分比数据进行绘图。因为每个分组的百分比总和都是100%,所以它们对应的堆叠柱形的高度相等。

Document Image
\[\]

图4-15 百分比堆叠柱状图

下面用Excel文件data.xlsx中的数据绘制百分比堆叠柱状图。完整代码见:Samples->ch06 分类型图表->23 百分比堆叠柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C11").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnStacked100, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 50
  SetStyle cht, 0, 1
End Sub

运行代码生成图4-15。

重叠柱状图

重叠柱状图是特殊的复合柱状图,分组内部各柱面之间的间隔为负数时,柱面之间发生重叠。重叠柱状图常将柱面设置为半透明。

Document Image
\[\]

图4-16 重叠柱状图

下面用Excel文件data.xlsx中的数据绘制重叠柱状图。完整代码见:Samples->ch06 分类型图表->24 重叠柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C10").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnCluster, 200, 20, 350, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 50
  cht.ChartGroups(1).Overlap = 50
  Dim clr2 As ColorFormat
  Set clr2 = cht.SeriesCollection(2).Format.Fill.ForeColor
  cht.SeriesCollection(2).Format.Fill.ForeColor = clr2
  cht.SeriesCollection(2).Format.Fill.Transparency = 0.3
  SetStyle cht, 0, 0.28
  cht.HasLegend = True
End Sub

运行代码生成图4-16。

水平渐变色填充复合柱状图

4.3.3小节对简单柱状图进行了垂向渐变色填充,这里对复合柱状图进行多色水平渐变填充。

Document Image
\[\]

图4-17 水平渐变色填充复合柱状图

下面用Excel文件data.xlsx中的数据绘制水平渐变色复合柱状图。完整代码见:Samples->ch06 分类型图表->25 水平渐变色填充复合柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C10").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlColumnCluster, 200, 20, 400, 250, True).Chart
  cht.ChartGroups(1).GapWidth = 50
  cht.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
  cht.SeriesCollection(1).Format.Fill.OneColorGradient msoGradientVertical, 1, 1
  cht.SeriesCollection(1).Format.Fill.GradientStops.Insert RGB(255, 255, 255), 0.5
  cht.SeriesCollection(1).Format.Fill.GradientStops.Delete(2)
  cht.SeriesCollection(1).Format.Fill.GradientStops.Insert RGB(0, 0, 255), 1
  cht.SeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(255, 128, 0)
  cht.SeriesCollection(2).Format.Fill.OneColorGradient msoGradientVertical, 1, 1
  cht.SeriesCollection(2).Format.Fill.GradientStops.Insert RGB(255, 255, 255), 0.5
  cht.SeriesCollection(2).Format.Fill.GradientStops.Delete(2)
  cht.SeriesCollection(2).Format.Fill.GradientStops.Insert RGB(255, 128, 0), 1
  cht.HasLegend = True
  SetStyle cht, 0, 0.28
End Sub

运行代码生成图4-17。

三维柱状图

Excel可以轻松绘制多种样式的三维柱状图,如简单三维柱状图、复合三维柱状图、堆叠三维柱状图和百分比堆叠柱状图等。根据柱体形状的不同,可以有长方体三维柱状图、圆锥三维柱状图、圆柱三维柱状图和棱锥三维柱状图等。

Document Image Document Image
\[\]
Document Image Document Image
\[\]

图4-18 三维柱状图

下面用Excel文件data.xlsx中的数据绘制不同样式的三维柱状图。完整代码见:Samples->ch06 分类型图表->26 三维柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:D7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xl3DColumn, 200, 20, 350, 280, True).Chart
  'cht.ChartGroups(1).GapWidth = 50
  SetStyle cht
End Sub
Sub CreateChart2()
  Dim cht As Chart
  ActiveSheet.Range("A2:D7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xl3DColumnClustered, 200, 20, 350, 280, True).Chart
  'cht.ChartGroups(1).GapWidth = 50
  SetStyle cht
End Sub
Sub CreateChart3()
  Dim cht As Chart
  ActiveSheet.Range("A2:D7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xl3DColumnStacked, 200, 20, 350, 280, True).Chart
  'cht.ChartGroups(1).GapWidth = 50
  SetStyle cht
End Sub
Sub CreateChart4()
  Dim cht As Chart
  ActiveSheet.Range("A2:D7").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xl3DColumnStacked100, 200, 20, 350, 280, True).Chart
  'cht.ChartGroups(1).GapWidth = 50
  SetStyle cht
End Sub

运行代码生成图4-18。

三维圆锥柱状图

Document Image Document Image
\[\]
Document Image Document Image
\[\]

图4-19 三维圆锥柱状图

下面用Excel文件data.xlsx中的数据绘制三维圆锥柱状图。完整代码见:Samples->ch06 分类型图表->30 三维圆锥柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlConeCol, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart2()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlConeColClustered, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart3()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlConeColStacked, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart4()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlConeColStacked100, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub

运行代码生成图4-19。

三维圆柱柱状图

Document Image Document Image
\[\]
Document Image Document Image
\[\]

图4-20 简单点图

下面用Excel文件data.xlsx中的数据绘制三维圆柱柱状图。完整代码见:Samples->ch06 分类型图表->34 三维圆柱柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlCylinderCol, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart2()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlCylinderColClustered, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart3()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlCylinderColStacked, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart4()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlCylinderColStacked100, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub

运行代码生成图4-20。

三维棱锥柱状图

Document Image Document Image
\[\]
Document Image Document Image
\[\]

图4-21 简单点图

下面用Excel文件data.xlsx中的数据绘制三维棱锥柱状图。完整代码见:Samples->ch06 分类型图表->38 三维棱锥柱状图->py.py。

code.vba
Sub CreateChart()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlPyramidCol, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart2()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlPyramidColClustered, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart3()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlPyramidColStacked, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub
Sub CreateChart4()
  Dim cht As Chart
  ActiveSheet.Range("A2:C8").Select  '数据
  Set cht = ActiveSheet.Shapes.AddChart2(-1, _
          xlPyramidColStacked100, 200, 20, 350, 280, True).Chart
  SetStyle cht
End Sub

运行代码生成图4-21。