从机器学习的门缝开始窥了那一眼
利用Matplotlib注解绘制树形图
Matplotlib注解工具—annotations
此模块运用了一个非常重要的技术
将一些对象和变量作为函数的属性在函数的外部进行初始化
由于其全局的特性,使得在整个递归过程中,任意过程对这些变量的修改
都会反馈到程序后续的运行过程中
----比如:外层栈堆对变量的修改会进入内层栈堆
--------内层栈堆对变量的修改在出栈之后同样会反馈到外层栈堆
注意:本节使用的是以叶子节点数和树的层数的比例绘制决策树
好处:当决策树发生变化的时候,绘制方案会同步变化
一.创建绘图区,并调度绘图函数
from matplotlib import pyplot as plt
def create_plot(in_tree):
"""
in_tree:字典形式的决策树结构
"""
# figure:图形,数字,创建一个图形实例
# num = None:1-N,如果不提供,则增加figure的计数数值,如果提供,则在已存在中寻找,未找到创建,如果是字符串,则设置成窗口名
# figsize = None:以英寸为单位的宽高,缺省值为figure.figsize
# dpi = None:图形分辨率,缺省值为figure.dpi
# facecolor = None,背景色
# edgecolor = None,边框颜色
# frameon = True,默认值True为绘制边框,如果为False则不绘制边框
# FigureClass = Figure,matplotlib.figure.Figure派生类,从派生类创建figure实例
# clear = False,重建figure实例
fig = plt.figure(1, facecolor='white')
# 清除图形
fig.clf()
axprops = dict(xticks=[], yticks=[]) # 定义横纵坐标轴,无内容
# subplot是将多个图画到一个平面上的工具
# 参数;
# m:
# n:
# m和n代表在一个图像窗口中显示m行n列个图像
# p:p表示图所在的位置,p=1表示从左到右从上到下的第一个位置
# frameon=False),添加没有框架的子图
# 定义一个全局绘图区:create_plot.ax1
# 给函数绑定属性,则函数全局可以使用这些属性
# ax1---全局的图像对象
create_plot.ax1 = plt.subplot(111, frameon=False, **axprops) # 绘制图像,无边框,无坐标轴
plot_tree.total_w = float(get_num_leafs(in_tree)) # 获取总宽度
plot_tree.total_d = float(get_tree_depth(in_tree)) # 获取总高度
# (1 / plot_tree.total_w)---叶子节点能占有的宽度
# 为了让叶子节点在其拥有宽度的区域居中
# 故向左移动其所占有宽度一般
# x_off:居中对齐的节点坐标偏移量
plot_tree.x_off = -0.5 / plot_tree.total_w
# 定义树的高度
plot_tree.y_off = 1.0
# 绘制决策树--头像是1x1,所以(0.5,1.0)---根节点的坐标--横轴居中
plot_tree(in_tree, (0.5, 1.0), "") # 无键值,故给出 ""
plt.show