1.>>>a = 1/2/2
   >>>a

>>>0.25

2.def plotMidText(cntrPt,parentPt,txtString):                                                    #在父子节点间填充文本信息
    xMid = (parentPt[0]-cntrPt[0])/2.0 + cntrPt[0]
    yMid = (parentPt[1]-cntrPt[1])/2.0 + cntrPt[1]
    createPlot.ax1.text(xMid,yMid,txtString)                                  #x和y的坐标轴  和填充内容
   
#为了方便理解这个函数我设定getNumLeafs=3   getDepth=2  
1.def plotTree(myTree,parentPt,nodeTxt):
2.      numLeafs = getNumLeafs(myTree)
3.      depth = getTreeDepth(myTree)                           #这个变量没有用到
4.      firstStr = list(myTree.keys())[0]                       #得到字典的第一个键
5.      cntrPt = (plotTree.xOff + (1.0 + float(numLeafs))/2.0/plotTree.totalW,                      
6.             plotTree.yOff)                                                                         #计算子节点的坐标(0.5,1.0)下面会改变哟
7.      plotMidText(cntrPt,parentPt,nodeTxt)
8.      plotNode(firstStr,cntrPt,parentPt,decisionNode)                                     
9.      secondDict = myTree[firstStr]                                                  #{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}, 3: 'maybe'}
10.    plotTree.yOff = plotTree.yOff - 1.0/plotTree.totalD                        #到这里子系欸但坐标 (0.5,0.5)        
11.    for key in secondDict.keys():
12.         if type(secondDict[key]).__name__ == 'dict':
13.         plotTree(secondDict[key],cntrPt,str(key))                                #递归调用plotTree
14.    else:
15.         plotTree.xOff = plotTree.xOff + 1.0/plotTree.totalW
16.         plotNode(secondDict[key],(plotTree.xOff,plotTree.yOff),
17.                        cntrPt,leafNode)                                                    #调用上面的函数plotNode()
18.         plotMidText((plotTree.xOff,plotTree.yOff),cntrPt,str(key))
19. plotTree.yOff = plotTree.yOff + 1.0/plotTree.totalD
   
#为了方便理解这个函数我设定numLeafs=3   depth=2       
def createPlot(inTree):                                                    #画图函数
    fig = plt.figure(1,facecolor = 'white')
    fig.clf()                                                                            #清空画布
    axprops = dict(xticks=[],yticks=[])                       #此参数表示坐标刻度,[]表示不显示刻度,可以作为参数传入,也可以用plt.xticks([1,3,4])单独设置
    createPlot.ax1 = plt.subplot(111,frameon=False,**axprops)   
    plotTree.totalW = float(getNumLeafs(inTree))                         #宽度=3.0
    plotTree.totalD = float(getTreeDepth(inTree))                         #深度=2.0
    plotTree.xOff = -0.5/plotTree.totalW;plotTree.yOff = 1.0;        #得到两个全局变量 x和y  (-1/6,1.0)
    plotTree(inTree,(0.5,1.0),'')                                                     #(0.5,1.0)顶层节点的坐标
    plt.show()       
   这段代码个人觉得比较难理解(为了方便理解我们这里将宽度设置为3.0,深度设置为2.0)顶点坐标为(0.5,1.0)采取的myTree=

{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

第一步 我们画图时候调用的是createPlot()这个函数,从函数我们得知   两个全局变量(-1/6,1.0)即xOff,yOff

第二步 我们看到该函数中存在plotTree(inTree,(0.5,1.0),'') 这段代码,即调用了上面一个函数plotTree,经过计算我们得到子节点的第一个坐标(0.5,1.0)  即函数中第6行

第三步通过调用plotMidText和plotNode将顶点坐标内容(这里填充的内容是键的名称)填充和设置格式,即顶点坐标(这里因为子节点和父节点是同一个点,所以顶点没有指向的自己的箭头)

第四步我们得到myTree第一个键对应的值并设为字典secondDict,第10行计算变量y的新值0.5,注意子节点此时还是(0.5,1.0)

第五步遍历secondDict中的所有键,如果键对应的值是字典呢么递归调用plotTree注意里面的参数子节点(0.5,1.0)是panterPt的新参数,myTree对应的参数是secondDict[key]

第六步由给出myTree得知for循环中存在不是字典的值,呢么进入else:改变了xOff的值(经计算的为1/6)调用plotNode(secondDict[key],(1/6,0.5),(0.5,1.0),leafnode)即该处为叶子

第六步我们接着第五步递归调用,此时numLeafs变为2,depth变为1(这个depth没用到可以忽略)我们还是取新字典的第一个键,计算子节点得到(2/3,0.5)

第七步同第三步骤,不过这里子节点和父节点不一致子节点(2/3,0.5)父节点(0.5,1.0)二者之间存在父节点指向子节点的箭头。

第八步完成

对plotTree的解释的更多相关文章

  1. 《机器学习实践》程序清单3-7 plotTree函数

    这个plotTree函数,比较聪明,比较简化,比较抽象,作者一定是逐步优化和简化到这个程度的.我是花了小两天时间,断断续续看明白的,还是在参考了另一篇文章以后.这里是链接http://www.cnbl ...

  2. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  3. 说说BPM数据表和日志表中几个状态字段的详细解释

    有个客户说需要根据这些字段的值作为判断条件做一些定制化需求,所以需要知道这些字段的名词解释,以及里面存储的值具体代表什么意思 我只好为你们整理奉上这些了! Open Work Sheet  0 Sav ...

  4. 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释

    目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...

  5. nodejs、npm、grunt——名词解释

    最近着手开发一个新项目,打算从工程化的角度整理一套自己的前端开发.发布体系. grunt这些工具,之前别人用我也用,并没有认真想过它们的前世今生,正好趁着这个机会,我来理一理目前业界比较流行这些工具的 ...

  6. HTTP各状态码解释

      状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必 ...

  7. JavaScript中‘this’关键词的优雅解释

    本文转载自:众成翻译 译者:MinweiShen 链接:http://www.zcfy.cc/article/901 原文:https://rainsoft.io/gentle-explanation ...

  8. XML简介与CDATA解释

    简介XML 是一种受到广泛支持的 Internet 标准,用于以一种特殊的方式编码结构化数据.实际上,以 XML 编码的数据可以通过任何编程语言解码,人们甚至可以使用标准的文本编辑器来阅读或编写 XM ...

  9. free-简单明了解释清楚怎么看内存使用

    free命令可以用来查看系统内存使用情况.我一般习惯-m参数以MB的方式查看 [root@localhost ~]# free -m total used free shared buffers ca ...

随机推荐

  1. Py西游攻关之基础数据类型(二)-列表

    Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html  五 List(列表) OK,现在我们知 ...

  2. 利用Python进行数据分析笔记-时间序列(时区、周期、频率)

    此文对Python中时期.时间戳.时区处理等阐述十分清楚,特别值得推荐学习. 原文链接:https://blog.csdn.net/wuzlun/article/details/80287517

  3. 微信小程序测试request请求webapi

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...

  4. 深入理解 Python 中的装饰器

    装饰器本质上也是函数,接收函数对象来作为参数,并在装饰器的内部来调用接受的函数对象完成相关的函数调用,也可以这样理解   ,为了方便在几个不同函数调用之前或者完成相关的统一操作,注意是完成统一的操作, ...

  5. C语言入门第四章

    =========C语言的输入与输出=========== %-9d : d:以十进制输出,9表示至少占用9个字符的宽度,宽度不足以空格补齐,-表示左对齐.综合起来,%-9d 表示以十进制输出,左对齐 ...

  6. 重大消息:华为笔记本电脑开始用LINUX系统

    对华为而言,此举不失为一个明智的抉择.在手机操作系统领域,目前已被苹果的IOS系统和谷歌的安卓系统垄断.而IOS系统是封闭式,只为苹果手机使用:安卓是开放性,当谷歌与华为停止合作后.华为手机将无法使用 ...

  7. Codeforces 598D:Igor In the Museum

    D. Igor In the Museum time limit per test 1 second memory limit per test 256 megabytes input standar ...

  8. android 基础学习(6)-----sqlite3查看表结构

    原文:http://blog.csdn.net/richnaly/article/details/7831933 sqlite3查看表结构 在android下通过adb shell命令可以进入sqli ...

  9. VUE框架下安装自带http协议

    在控制台CMD 中输入 npm install vue-resource --save-dev

  10. 使用SpringMVC时,web应用的资源路径问题

    web应用常见的资源存方式 在WEB-INF下新建lib,存放要使用的jar包 在WEB-INF下新建jsp文件夹,存放jsp文件.首页除外,首页就放到web下. 在web下,或WEB-INF下,新建 ...