小提琴图由两个核密度估计曲线拼接而成,如图5-15所示;经常叠加箱形图,如图5-16所示。因为图形外观上像小提琴,取名为小提琴图。小提琴图的功能与箱形图的类似,都可以显示数据的分布特征。不同的是,箱形图用多个统计量进行描述,小提琴图则用连续的概率密度进行描述。[大谦Excel,dqexcel点com]
小提琴图样式1
最简单的小提琴样式直接用两个核密度估计曲线拼接而成,如图5-15所示。4.2节详细介绍了核密度估计曲线图,以及在Excel中如何绘制该图表,请参阅。
\[\]
图5-15 小提琴图样式1
4.2节介绍了核密度估计曲线图的绘制,将曲线图立起来,并且与它关于基线的镜像曲线拼接,就得到简单的小提琴图。
用draw_violin函数绘制给定数据的小提琴图,需要指定所属Chart对象、绘图数据、数据个数、横坐标、颜色分量和y轴取值范围。完整代码见:Samples->ch08 统计图表->13 小提琴图->py.py。
code.vba
Sub DrawViolin(cht As Chart, dblY() As Double, lngN As Long, dblX As Double, intR As Integer, intG As Integer, intB As Integer, dblMinY As Double, dblMaxY As Double)
Dim intI As Integer
Dim kdeY(1 To 180, 1 To 1) As Double
Dim kdeF(1 To 180, 1 To 1) As Double
Dim kdeF2(1 To 180, 1 To 1) As Double
Dim kdeP(1 To 182, 1 To 2) As Single
Dim kdeP2(1 To 182, 1 To 2) As Single
Dim dblStep As Double
dblStep = (dblMaxY - dblMinY) / 180
For intI = 1 To 180
kdeY(intI, 1) = dblMinY + dblStep * intI
kdeF(intI, 1) = dblX + KDE(dblY, lngN, kdeY(intI, 1), 0.5)
kdeF2(intI, 1) = dblX - KDE(dblY, lngN, kdeY(intI, 1), 0.5)
Next
For intI = 2 To 181
kdeP(intI, 1) = ShapeX(cht, CDbl(kdeF(180 - intI + 2, 1)))
kdeP(intI, 2) = ShapeY(cht, CDbl(kdeY(180 - intI + 2, 1)))
Next
kdeP(182, 1) = ShapeX(cht, dblX)
kdeP(182, 2) = kdeP(181, 2)
kdeP(1, 1) = ShapeX(cht, dblX)
kdeP(1, 2) = kdeP(2, 2)
Dim shp3 As Shape
Set shp3 = cht.Shapes.AddPolyline(kdeP)
shp3.Fill.ForeColor.RGB = RGB(0, 0, 255)
shp3.Fill.Transparency = 0.8
shp3.Line.ForeColor.RGB = RGB(0, 0, 255)
shp3.Line.Weight = 1
Dim shp2 As Shape
'Set shp2 = cht.Shapes.AddPolyline(kdeP)
'shp2.Line.ForeColor.RGB = RGB(0, 0, 255)
For intI = 2 To 181
kdeP2(intI, 1) = ShapeX(cht, CDbl(kdeF2(180 - intI + 2, 1)))
kdeP2(intI, 2) = ShapeY(cht, CDbl(kdeY(180 - intI + 2, 1)))
Next
kdeP2(182, 1) = ShapeX(cht, dblX)
kdeP2(182, 2) = kdeP2(181, 2)
kdeP2(1, 1) = ShapeX(cht, dblX)
kdeP2(1, 2) = kdeP2(2, 2)
Dim shp5 As Shape
Set shp5 = cht.Shapes.AddPolyline(kdeP2)
shp5.Fill.ForeColor.RGB = RGB(0, 0, 255)
shp5.Fill.Transparency = 0.8
shp5.Line.ForeColor.RGB = RGB(0, 0, 255)
shp5.Line.Weight = 1
End Sub
小提琴图样式2
图5-16所示的小提琴图更加常见。该样式的小提琴图在简单小提琴图的基础上叠加了箱形图,从图中不仅能探查任意处数据分布的概率密度,还可以通过箱形图查看数据的分散程度和偏态特征,以及是否有异常值等关键信息。
\[\]
图5-16 小提琴图样式2
用draw_violin函数绘制简单小提琴图,用draw_boxplot函数叠加绘制箱形图。调用这两个函数绘制小提琴图。完整代码见:Samples->ch08 统计图表->14 小提琴图2->py.py。
code.vba
...
DrawViolin cht, D1, lngCount(1), 1, 0, 0, 255, -4, 4
DrawBoxplot cht, D1, lngCount(1), 1, 0, 0, 255, 0.1, False
DrawViolin cht, D2, lngCount(2), 2, 0, 0, 255, -4, 4
DrawBoxplot cht, D2, lngCount(2), 2, 0, 0, 255, 0.1, False
DrawViolin cht, D3, lngCount(3), 3, 0, 0, 255, -4, 4
DrawBoxplot cht, D3, lngCount(3), 3, 0, 0, 255, 0.1, False
DrawViolin cht, D4, lngCount(4), 4, 0, 0, 255, -4, 4
DrawBoxplot cht, D4, lngCount(4), 4, 0, 0, 255, 0.1, False
DrawViolin cht, D5, lngCount(5), 5, 0, 0, 255, -4, 4
DrawBoxplot cht, D5, lngCount(5), 5, 0, 0, 255, 0.1, False
DrawViolin cht, D6, lngCount(6), 6, 0, 0, 255, -4, 4
DrawBoxplot cht, D6, lngCount(6), 6, 0, 0, 255, 0.1, False...
运行代码生成类似图5-16的小提琴图。[大谦Excel,dqexcel点com]