|
|

楼主 |
发表于 2019-4-10 09:32:25
|
显示全部楼层
你说的这种全局变量和局部变量,我是知道的,我说的不是这个意思。如下代码:
- def plot_tree(my_tree, parant_pt, node_txt):
- """
- 函数作用:
- :param my_tree: 决策树
- :param parant_pt: 父节点
- :param node_txt: 结点文本标签信息
- :return:
- """
- # 计算叶节点
- num_leafs = get_num_leafs(my_tree)
- # 计算深度
- depth = get_tree_depth(my_tree)
- # 第一个判断节点
- first_str = list(my_tree.keys())[0]
- # 初始化子节点的位置
- # 全局变量plot_tree.totalW存储树的宽度
- # 全局变量plot_tree.totalD存储树的高度
- cntr_pt = (plot_tree.xoff + (1.0 + float(num_leafs))/2.0/plot_tree.totalW,
- plot_tree.yoff)
- # 计算父节点和子节点的中间位置,并在此处添加文本标签信息
- plot_mid_text(cntr_pt, parant_pt, node_txt)
- plot_node(first_str, cntr_pt, parant_pt, decisionNode)
- # 第一个判断节点的value
- second_dict = my_tree[first_str]
- # 按比例减少全局变量plot_tree.yoff
- plot_tree.yoff = plot_tree.yoff - 1.0/plot_tree.totalD
- # 遍历second_dict.keys(),绘制子节点(可以是叶子结点,或判断节点)
- for key in second_dict.keys():
- # key对应的value的类型是字典(说明是判断节点),则递归调用函数
- # 否则(说明是叶子节点),增加X的偏移,绘制箭头,并计算中间位置,添加文本信息
- if type(second_dict[key]).__name__ == 'dict':
- plot_tree(second_dict[key], cntr_pt, str(key))
- else:
- plot_tree.xoff = plot_tree.xoff + 1.0/plot_tree.totalW
- plot_node(second_dict[key], (plot_tree.xoff, plot_tree.yoff),
- cntr_pt, leafNode)
- plot_mid_text((plot_tree.xoff, plot_tree.yoff), cntr_pt, str(key))
- # 绘制完所有子节点之后,增加全局变量Y的偏移
- plot_tree.yoff = plot_tree.yoff + 1.0/plot_tree.totalD
- def create_plot(in_tree):
- """
- 函数作用:创建新图形并清空绘图区,在绘图区绘制决策节点和叶节点
- :param in_tree: 决策树
- :return:
- """
- # 创建窗口
- fig = plt.figure(1, facecolor='white')
- # 清空绘图区
- fig.clf()
- # 创建空字典
- axprops = dict(xticks=[], yticks=[])
- # 创建子图的绘图区
- create_plot.axl = plt.subplot(111, frameon=False, **axprops)
- # 全局变量plot_tree.totalW存储决策树的宽度
- # 全局变量plot_tree.totalD存储决策树的高度
- # 全局变量plot_tree.xoff存储决策树节点的x坐标
- # 全局变量plot_tree.yoff存储决策树节点的y坐标
- plot_tree.totalW = float(get_num_leafs(in_tree))
- plot_tree.totalD = float(get_tree_depth(in_tree))
- plot_tree.xoff = -0.5/plot_tree.totalW
- plot_tree.yoff = 1.0
- plot_tree(in_tree, (0.5, 1.0), '') # 决策树的起点:(0.5,1.0)
- # 调用"绘制带箭头的注解"函数
- # plot_node('decisionNodes', (0.5, 0.1), (0.1, 0.5), decisionNode)
- # plot_node('leafNodes', (0.8, 0.1), (0.3, 0.8), leafNode)
- plt.show()
复制代码
可以主要看plot_tree.yoff这个变量,两个函数都有这个变量,在create_plot()函数中初始化为1.0,然后就在plot_tree()函数中引用这个变量,值得注意的是,在这个函数中没有初始化这个变量,也没有global,可以直接引用。网盘通过debug查看plot_tree.yoff的值变化,发现plot_tree.yoff的值是从create_plot()传递到plot_tree()中的,这就有点像全局变量了 |
|