核密度估计图

直方图是根据给定数据进行频数分析后利用各分箱中的频数等统计量绘图,核密度估计图则是根据给定的有限的样本数据对总体进行估计,得到描述总体的概率密度函数并绘图。[大谦Excel,dqexcel点com]

一元核密度估计曲线图

直方图是直接用紧密排列的柱形表现样本数据的分布特征。核密度估计则不同,它是使用非参数的方法,用有限的样本数据对总体进行估计,得到描述总体特征的概率密度函数。一元核密度估计曲线图如图4-9所示。

4.1节绘制直方图使用的是各分箱中的数据点数,即频数,将频数换成频率,即各分箱中的数据点数除以总数据个数,得到频率直方图。采用极限思维,理论上将数据区间无限细分,频率直方图将变成一条曲线,即概率密度曲线。

用核密度估计得到的概率密度函数为:

\[f\left( x \right)=\frac{1}{nh}\sum_{i=1}^{n} {K(\frac{x-{x}_{i}}{h})}\]

其中,x是自变量,n表示样本数据的个数,h表示带宽,K为核函数,xi表示样本数据中的一个数据点。可见,用核密度估计得到的概率密度函数是用各点处的核函数加权平均得到的,与正态分布、指数分布等的参数表示不同。

常用的核函数有高斯核函数、Box函数、三角函数等。核函数必须是对称的,值大于0,并且曲线下的面积为1。

Document Image
\[\]

图4-9 核密度估计曲线图

用Python xlwings编程绘制核密度估计曲线图的关键在于核密度估计的计算。下面的KDE函数实现上面核密度估计的计算公式,可以计算任意x处的概率密度值。KDE函数使用的核函数为高斯核函数,用标准正态分布的概率密度函数进行计算。完整代码见:Samples->ch07 数值型图表->05 一元核密度估计曲线图->py.py。

code.python
def kde(data,x,h):
  my_sum=0
  count=0
  for i in data:
      my_sum+=(1/np.sqrt(2*3.1415926))*np.exp(-0.5*((x-i)/h)*((x-i)/h))
      count+=1
  return my_sum/count/h

下面调用KDE函数进行核密度估计,得到一系列指定kdeX处的概率密度值kdeF,最后利用它们绘制多义线,就是需要绘制的核密度估计曲线图。

code.python
root=os.getcwd()    #获取当前工作路径
app=xw.App(visible=True,add_book=False)    #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False)    #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1')    #获取指定工作表对象
data=sht.range('A2:A61').value    #获取数据
app.kill()    #退出应用
#从comtypes包中导入CreateObject函数
from comtypes.client import CreateObject
app2=CreateObject("Excel.Application")    #创建Excel应用
app2.Visible=True    #应用窗口可见
app2.ScreenUpdating=False    #取消画面重绘
wb2=app2.Workbooks.Open(root+r'/data.xlsx')    #添加工作簿
sht2=wb2.Sheets('Sheet1')    #获取第1个工作表
shp=sht2.Shapes.AddChart2()    #创建空白图表
shp.Left=20
cht=shp.Chart    #获取图表
cht.ChartType=-4169    #散点图
ax1=cht.Axes(1)    #获取横轴
ax2=cht.Axes(2)    #获取纵轴
ax1.MinimumScale=-5.9    #横轴最小值
ax1.MaximumScale=12
ax2.MinimumScale=0    #纵轴最小值
ax2.MaximumScale=0.15
ax1.CrossesAt=ax1.MinimumScale    #两个坐标轴相交于最小值处
ax2.CrossesAt=ax2.MinimumScale
set_style(cht)    #设置样式
kdex=[0 for _ in range(180)]
kdef=[0 for _ in range(180)]
#计算指定x处的核密度估计值
for i in range(180):
    kdex[i]=(i-59)/10
    kdef[i]=kde(data,(i-59)/10,1.5)
cht.SeriesCollection().NewSeries()    #新建序列
#画多义线表示核密度估计曲线
pt=[[0 for _ in range(2)] for _ in range(183)]
for i in range(180):
    pt[i][0]=shape_x(cht,kdex[179-i])
    pt[i][1]=shape_y(cht,kdef[179-i])
pt[180][0]=pt[179][0]
pt[180][1]=shape_y(cht,0)
pt[181][0]=pt[0][0]
pt[181][1]=shape_y(cht,0)
pt[182][0]=pt[0][0]
pt[182][1]=pt[0][1]
shp2=cht.Shapes.AddPolyline(pt)    #绘制多义线
shp2.Fill.Visible=False    #隐藏面
shp2.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #线的颜色
shp2.Line.Weight=1.5    #线宽
app2.ScreenUpdating=True    #启动画面重绘

运行代码生成图4-9。

单色填充核密度估计曲线图

如果觉得图4-9中的核密度估计曲线图过于单调,可以考虑将曲线和坐标系横轴围成的区域用颜色进行填充。可以用单色填充,也可以用渐变色填充。单色填充的效果如图4-10所示。

Document Image
\[\]

图4-10 单色填充核密度估计图

核密度估计曲线相关的计算与4.2.1小节的相同。不同的是最后绘制多边形区域,而不是多义线。多边形区域的顶点按逆时针方向排列,最后一个顶点与第一个顶点重合。完整代码见:Samples->ch07 数值型图表->06 单色填充核密度估计曲线图->py.py。

code.python
#... 省略部分代码
kdex=[0 for _ in range(180)]
kdef=[0 for _ in range(180)]
#计算指定x处的核密度估计值
for i in range(180):
    kdex[i]=(i-59)/10
    kdef[i]=kde(data,(i-59)/10,1.5)
cht.SeriesCollection().NewSeries()    #新建序列
#填充核密度估计曲线与横轴之间的区域
pt=[[0 for _ in range(2)] for _ in range(183)]
#多边形顶点坐标
for i in range(180):
    pt[i][0]=shape_x(cht,kdex[179-i])
    pt[i][1]=shape_y(cht,kdef[179-i])
pt[180][0]=pt[179][0]
pt[180][1]=shape_y(cht,0)
pt[181][0]=pt[0][0]
pt[181][1]=shape_y(cht,0)
pt[182][0]=pt[0][0]
pt[182][1]=pt[0][1]
shp2=cht.Shapes.AddPolyline(pt)    #绘制多边形
shp2.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #单色填充
shp2.Fill.Transparency=0.5    #半透明
shp2.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #边线的颜色
shp2.Line.Weight=2    #边线的宽度

运行代码生成图4-10。

渐变色填充核密度估计曲线图

4.2.2小节用单色填充核密度估计曲线与横轴之间的区域,这里用渐变色进行填充,用到了多边形区域渐变色填充的知识。渐变色填充的效果如图4-11所示。

Document Image
\[\]

图4-11 渐变色填充核密度估计曲线图

核密度估计曲线相关的计算与4.2.1小节的相同。不同的是最后绘制多边形区域,而不是多义线。多边形区域的顶点按逆时针方向排列,最后一个顶点与第一个顶点重合。这里使用FillFormat对象的OneColorGradient方法实现单色渐变填充,也可以实现双色渐变填充或多色渐变填充。完整代码见:Samples->ch07 数值型图表->07 渐变色填充核密度估计曲线图->py.py。

code.python
#... 省略部分代码
#渐变色填充核密度估计曲线与横轴之间的区域
pt=[[0 for _ in range(2)] for _ in range(183)]
for i in range(180):
    pt[i][0]=shape_x(cht,kdex[179-i])
    pt[i][1]=shape_y(cht,kdef[179-i])
pt[180][0]=pt[179][0]
pt[180][1]=shape_y(cht,0)
pt[181][0]=pt[0][0]
pt[181][1]=shape_y(cht,0)
pt[182][0]=pt[0][0]
pt[182][1]=pt[0][1]
shp2=cht.Shapes.AddPolyline(pt)    #绘制多边形
shp2.Fill.Transparency=0.5    #半透明
shp2.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #渐变色填充
shp2.Fill.OneColorGradient(1,1,1)
shp2.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #边线的颜色
shp2.Line.Weight=1.5    #边线的宽度

运行代码生成图4-11。

多色渐变填充核密度估计曲线图

4.2.3小节用单色渐变填充核密度估计曲线与横轴之间的区域,这里用多色渐变进行填充,用到了多边形区域多色渐变填充的知识。渐变色填充的效果如图4-12所示。

Document Image Document Image
\[\]

图4-12 多色渐变填充核密度估计曲线图

Excel中可以对多边形进行多色渐变填充,本例实现该效果。完整代码见:Samples->ch07 数值型图表->08 多色渐变填充核密度估计曲线图目录下的py.py和py2.py。

code.python
#... 省略部分代码
#多色渐变填充核密度估计曲线与横轴之间的区域
pt=[[0 for _ in range(2)] for _ in range(183)]
for i in range(180):
    pt[i][0]=shape_x(cht,kdex[179-i])
    pt[i][1]=shape_y(cht,kdef[179-i])
pt[180][0]=pt[179][0]
pt[180][1]=shape_y(cht,0)
pt[181][0]=pt[0][0]
pt[181][1]=shape_y(cht,0)
pt[182][0]=pt[0][0]
pt[182][1]=pt[0][1]
shp2=cht.Shapes.AddPolyline(pt)    #绘制多边形
shp2.Fill.Transparency=0.5    #半透明
shp2.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255, 255, 26))    #多色渐变填充
shp2.Fill.OneColorGradient(1,1,1)
shp2.Fill.GradientStops.Insert(xw.utils.rgb_to_int((255, 204, 51)), 0.25)
shp2.Fill.GradientStops.Delete(2)
shp2.Fill.GradientStops.Insert(xw.utils.rgb_to_int((204, 204, 51)), 0.5)
shp2.Fill.GradientStops.Insert(xw.utils.rgb_to_int((0, 179, 179)), 0.75)
shp2.Fill.GradientStops.Insert(xw.utils.rgb_to_int((51, 128, 255)), 0.85)
shp2.Fill.GradientStops.Insert(xw.utils.rgb_to_int((0, 0, 255)), 1)
shp2.Line.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255))    #边线的颜色
shp2.Line.Weight=1.5    #边线的宽度

运行代码生成图4-12左侧图。将上面代码中OneColorGradient函数第1个参数的值修改为2,即

code.python
shp2.Fill.OneColorGradient(2,1,1)

运行代码生成图4-12右侧图。

复合核密度估计曲线图

复合核密度估计曲线图是在同一幅图中绘制多个向量数据的核密度估计曲线图,如图4-13所示。常将曲线下的区域设置为半透明,这样可以看到区域下方的其他曲线。

Document Image
\[\]

图4-13 复合核密度估计曲线图

绘制复合核密度估计曲线图,一个一个地绘制即可。为了使代码更简洁,将绘制单个核密度估计曲线图地代码写成draw_kde函数,方便重复调用。完整代码见:Samples->ch07 数值型图表->08 复合一元核密度估计曲线图->py.py。

code.python
def draw_kde(cht,data,y,r,g,b,minx,maxx):
    #将绘制核密度估计曲线的功能写成函数,方便重复调用
    kdex=[0 for _ in range(180)]
    kdef=[0 for _ in range(180)]
    step=(maxx-minx)/180
#计算指定x处的核密度估计值
    for i in range(180):
        kdex[i]=minx+i*step
        kdef[i]=y+kde(data,kdex[i],1.5)
    cht.SeriesCollection().NewSeries()    #新建序列
#渐变色填充核密度估计曲线与横轴之间的区域
    pt=[[0 for _ in range(2)] for _ in range(183)]
    for i in range(180):
        pt[i][0]=shape_x(cht,kdex[179-i])
        pt[i][1]=shape_y(cht,kdef[179-i])
    pt[180][0]=pt[179][0]
    pt[180][1]=shape_y(cht,0)
    pt[181][0]=pt[0][0]
    pt[181][1]=shape_y(cht,0)
    pt[182][0]=pt[0][0]
    pt[182][1]=pt[0][1]
    shp=cht.Shapes.AddPolyline(pt)    #绘制多边形
    shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((r,g,b))    #渐变色填充
    shp.Fill.OneColorGradient(1,1,1)
    shp.Fill.Transparency=0.5    #半透明
    shp.Line.ForeColor.RGB=xw.utils.rgb_to_int((r,g,b))
    shp.Line.Weight=1.5
root=os.getcwd()    #获取当前工作路径
app=xw.App(visible=True,add_book=False)    #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False)    #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1')    #获取指定工作表对象
data1=sht.range('A1:A100').value
data2=sht.range('B1:B100').value
app.kill()
#从comtypes包中导入CreateObject函数
from comtypes.client import CreateObject
app2=CreateObject("Excel.Application")    #创建Excel应用
app2.Visible=True    #应用窗口可见
app2.ScreenUpdating=False
wb2=app2.Workbooks.Open(root+r'/data.xlsx')    #添加工作簿
sht2=wb2.Sheets('Sheet1')    #获取第1个工作表
shp=sht2.Shapes.AddChart2()    #创建空白图表
shp.Left=20
cht=shp.Chart    #获取图表
cht.ChartType=-4169    #散点图
ax1=cht.Axes(1)    #获取横轴
ax2=cht.Axes(2)    #获取纵轴
ax1.MinimumScale=-10
ax1.MaximumScale=10
ax2.MinimumScale=0    #纵轴最小值
ax2.MaximumScale=0.3
ax1.CrossesAt=ax1.MinimumScale
ax2.CrossesAt=ax2.MinimumScale
set_style(cht)    #设置样式
#绘制核密度估计曲线图
draw_kde(cht,data1,0,0,0,255,-10,10)
draw_kde(cht,data2,0,255,128,0,-10,10)
app2.ScreenUpdating=True

运行代码生成图4-13。

山脊图:单色填充

山脊图是用核密度估计图表现多个一元数据分布特征、以及不同数据之间整体差异的常见图表,如图4-14所示。

Document Image
\[\]

图4-14 单色填充山脊图

与绘制复合核密度估计曲线图类似,绘制山脊图也是一个一个地绘制单个曲线图,只是图的位置不同。本例使用了颜色查找表对图表进行着色,相关内容请参见第4章。完整代码见:Samples->ch09 数值型图表->07 山脊图->py.py。

code.python
root=os.getcwd()    #获取当前工作路径
app=xw.App(visible=True,add_book=False)    #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False)    #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1')    #获取指定工作表对象
data=sht.range('A1:H100').value    #获取数据
cm=wb.sheets('colormap').range('A1:C256').value    #获取颜色查找表的颜色数据
app.kill()    #退出应用
#从comtypes包中导入CreateObject函数
from comtypes.client import CreateObject
app2=CreateObject("Excel.Application")    #创建Excel应用
app2.Visible=True    #应用窗口可见
app2.ScreenUpdating=False
wb2=app2.Workbooks.Open(root+r'/data.xlsx')    #添加工作簿
sht2=wb2.Sheets('Sheet1')    #获取第1个工作表
shp=sht2.Shapes.AddChart2()    #创建空白图表
shp.Left=20    #设置图表大小
shp.Left=300
shp.Top=20
shp.Width=350
shp.Height=400
cht=shp.Chart    #获取图表
cht.ChartType=-4169    #散点图
ax1=cht.Axes(1)    #获取横轴
ax2=cht.Axes(2)    #获取纵轴
ax1.MinimumScale=-10    #横轴最小值
ax1.MaximumScale=10
ax2.MinimumScale=0    #纵轴最小值
ax2.MaximumScale=1.8
ax1.CrossesAt=ax1.MinimumScale    #二轴交点
ax2.CrossesAt=ax2.MinimumScale
set_style(cht)    #设置样式
#cht.SeriesCollection().NewSeries()    #新建序列
dd=np.transpose(data)    #转置
dt=[0 for _ in range(8)]
#获取转置矩阵的行数据,也就是原始数据的列数据
for i in range(8):
    dt[i]=list(dd[i][:])
#绘制核密度估计曲线图
for i in range(7,-1,-1):
    count=int(i/7 * 256)    #利用该编号从颜色查找表取颜色数据
    if count==256:
        r=cm[255][0]
        g=cm[255][1]
        b=cm[255][2]
    else:
        r=cm[count][0]
        g=cm[count][1]
        b=cm[count][2]
    draw_kde(cht,dt[i],0.2*i,r,g,b,-10,10)    #绘制核密度估计曲线图,单色填充
#绘制刻度标签-纵坐标
label_pos=[0 for _ in range(8)]
for i in range(8):
    label_pos[i]=i*0.2
labels=['A','B','C','D','E','F','G','H']
for i in range(8):
    lf=shape_x(cht,-11)
    tp=shape_y(cht,label_pos[i]+0.08)
    wd=cht.PlotArea.InsideWidth/(cht.Axes(1).MaximumScale-cht.Axes(1).MinimumScale)*1.6
    ht=cht.PlotArea.InsideHeight/(cht.Axes(2).MaximumScale-cht.Axes(2).MinimumScale)*0.1
    shp2=cht.Shapes.AddLabel(1,lf,tp,wd,ht)
    shp2.TextFrame2.TextRange.Characters().Text=labels[i]
    shp2.TextFrame2.TextRange.Characters().Font.Size=8
    shp2.TextFrame2.AutoSize=1    #msoAutoSizeTextToFitShape
#绘制刻度标签-横坐标
xlabel_pos=[0 for _ in range(11)]
xlabels=[0 for _ in range(11)]
for i in range(11):
    xlabel_pos[i]=i*2-10
    xlabels[i]=str(i*2-10)
for i in range(11):
    lf=shape_x(cht,xlabel_pos[i]-0.5)
    tp=shape_y(cht,-0.03)
    wd=cht.PlotArea.InsideWidth/(cht.Axes(1).MaximumScale-cht.Axes(1).MinimumScale)*1.8
    ht=cht.PlotArea.InsideHeight/(cht.Axes(2).MaximumScale-cht.Axes(2).MinimumScale)*0.1
    shp3=cht.Shapes.AddLabel(1,lf,tp,wd,ht)
    shp3.TextFrame2.TextRange.Characters().Text=xlabels[i]
    shp3.TextFrame2.TextRange.Characters().Font.Size=8
    shp3.TextFrame2.AutoSize=1    #msoAutoSizeTextToFitShape
#绘制外框
lf=shape_x(cht,-10)
tp=shape_y(cht,1.8)
wd=cht.PlotArea.InsideWidth/(cht.Axes(1).MaximumScale-cht.Axes(1).MinimumScale)*20
ht=cht.PlotArea.InsideHeight/(cht.Axes(2).MaximumScale-cht.Axes(2).MinimumScale)*1.8
shp4=cht.Shapes.AddShape(1,lf,tp,wd,ht)
shp4.Fill.Visible=False
shp4.Line.Weight=1
shp4.Line.ForeColor.RGB=xw.utils.rgb_to_int((200,200,200))
app2.ScreenUpdating=True

运行代码生成类似图4-14的山脊图。

山脊图:渐变色填充

本例用渐变色填充山脊图中的单个核密度估计曲线图,如图4-15所示。

Document Image
\[\]

图4-15 渐变色填充山脊图

4.2.3小节介绍了核密度估计曲线图的渐变色填充,请参阅。本例使用了颜色查找表对图表进行着色,相关内容请参见第4章。完整代码见:Samples->ch07 数值型图表->10 山脊图2->py.py。

code.python
def draw_kde(cht,data,y,r,g,b,minx,maxx):
    #….
    shp=cht.Shapes.AddPolyline(pt)    #绘制多边形
    shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((r,g,b))    #渐变色填充
    shp.Fill.OneColorGradient(1,1,1)
    shp.Fill.Transparency=0.1    #透明度
    shp.Line.ForeColor.RGB=xw.utils.rgb_to_int((r,g,b))    #边线的颜色
    shp.Line.Weight=1    #边线的宽度

运行代码生成类似图4-15的山脊图。

二元核密度估计曲面图

前面各小节介绍了一元核密度估计,类似地,二元核密度估计也是用样本数据对总体进行估计。二元核密度估计的概率密度函数为

\[f\left( x,y \right)=\frac{1}{n{h}^{2}}\sum_{i=1}^{n} {{K}_{h}(\frac{x-{x}_{i}}{h},\frac{y-{y}_{i}}{h})}\]

其中,x,y是自变量,n表示样本数据的个数,h表示带宽,K为核函数,xi,yi表示样本数据中的一个数据点。

二元核密度估计图可以用曲面图表示,也可以用等值线图表示。用Python xlwings绘制的二元核密度估计曲面图效果如图4-16所示。曲面上的环带表示用单色填充相邻三维等值线之间的曲面区域。

Document Image
\[\]

图4-16 二元核密度估计曲面图

用Python xlwings编程绘制二元核密度估计图的关键在于核密度估计的计算。下面的kde2函数实现上面二元核密度估计的计算公式,可以计算任意x、y处的概率密度值。kde2函数使用的核函数为二元高斯核函数,用标准二元正态分布的概率密度函数进行计算。完整代码见:Samples->ch07 数值型图表->11 二元核密度估计曲面图->py.py。

code.python
def kde2(dt1,dt2,x,y,w):
    my_sum=0
    count=0
    for i in dt1:
        for j in dt2:
            #高斯二元核函数
            my_sum+=np.exp(-((x-i)**2+(y-j)**2)/(2*w**2))/\
            (2*3.1416*w**2)
            count+=1
    return my_sum/count

下面调用kde2函数进行二元核密度估计,计算一系列给定dt1和dt2处的概率密度值kdef,用它们绘制曲面图。

code.python
root=os.getcwd()    #获取当前工作路径
app=xw.App(visible=True,add_book=False)    #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False)    #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1')    #获取指定工作表对象
dt1=sht.range('A1:A200').value    #获取数据
dt2=sht.range('B1:B200').value
kdex=[0 for _ in range(40)]
kdey=[0 for _ in range(40)]
kdef=[[0 for _ in range(40)] for _ in range(40)]
#x和y坐标
for i in range(40):
    kdex[i]=(i- 20)/2
    kdey[i]=(i- 20)/2
#二元核密度估计
for i in range(40):
    for j in range(40):
        kdef[i][j]=kde2(dt1,dt2,kdex[i],kdey[j],1.5)
sht2=wb.sheets.add()    #新建工作表,输出上面的计算结果
sht2.name='plot'    #工作表的名称
#将数据输出到新工作表
for i in range(40):
    sht2.api.Cells(1, i+2).Value=kdex[i]
    sht2.api.Cells(i+2, 1).Value=kdey[i]
    for j in range(40):
        sht2.api.Cells(i+2,j+2).Value=kdef[i][j]
#利用计算数据创建曲面图
shp=sht2.api.Shapes.AddChart2()    #创建空白图表
shp.Left=20    #图表位置和大小
shp.Top=50
shp.Width=500
shp.Height=400
cht=shp.Chart    #获取图表
#设置图表数据范围
cht.SetSourceData(sht2.api.Range(sht2.api.Cells(2, 2),sht2.api.Cells(41, 41)))
#设置图表类型为三维曲面图
cht.ChartType=xw.constants.ChartType.xlSurface
#设置图表标题
cht.HasTitle=True
cht.ChartTitle.Text='Surface'
#设置轴标题
cht.Axes(1,1).HasTitle=True
cht.Axes(1,1).AxisTitle.Text='X Axis'
cht.Axes(3,1).HasTitle=True
cht.Axes(3,1).AxisTitle.Text='Y Axis'
cht.Axes(2,1).HasTitle=True
cht.Axes(2,1).AxisTitle.Text='Z Axis'

运行代码生成图4-16。计算好的绘图数据输出在新建的工作表中,如图4-17所示。

Document Image
\[\]

图4-17 二元核密度估计计算结果

二元核密度估计等值线图

二维核密度估计图可以用曲面图表示,也可以用等值线图表示。Excel绘制的等值线图如图4-18所示,图中将相邻等值线之间的区域用单色进行填充,也称填充等值线图。等值线图可以用二维图形表示三维数据。

Document Image
\[\]

图4-18 二元核密度估计等值线图

绘制二元核密度估计等值线图,计算过程与绘制曲面图的相同。完整代码见:Samples->ch07 数值型图表->12 二元核密度估计等值线图->py.py。

code.python
#创建曲面图表
shp=sht2.api.Shapes.AddChart2()    #创建空白图表
shp.Left=20    #图表位置和大小
shp.Top=50
shp.Width=500
shp.Height=400
cht=shp.Chart    #获取图表
#设置图表数据范围
cht.SetSourceData(sht2.api.Range(sht2.api.Cells(2, 2),sht2.api.Cells(41, 41)))
#设置图表类型为三维曲面图
cht.ChartType=xw.constants.ChartType.xlSurfaceTopView
#设置图表标题
cht.HasTitle=True
cht.ChartTitle.Text='Surface'

运行代码生成图4-18。