如何指定图形决策树在Graphviz中的大小?

11
我有一个基于鸢尾花数据集训练的决策树的GraphViz表示。
import graphviz 

dot_data = tree.export_graphviz(clf, out_file=None, 
                     feature_names=iris.feature_names,  
                     class_names=iris.target_names,  
                     filled=True, rounded=True,  
                     special_characters=True)

graph = graphviz.Source(dot_data)
graph

我正在使用上面的代码生成GraphViz图形,但它创建了一个大图。

我想要手动控制这个图形的figzise,我该怎么做?

我可以在代码中设置figsize参数来控制图形的大小。

1个回答

18

在最初编写自己的函数以修改DOT源代码字符串以添加大小属性后,我偶然发现了pydotplus.graphviz.Graph文档中的这一部分:

所有在Graphviz dot语言中定义的属性都应该被支持。

属性可以通过动态生成的方法进行设置:

 set_[attribute name], i.e. set_size, set_fontname
您可以在下面看到使用此功能的示例。请注意调用函数时的语法,因为DOT源代码需要在宽度和高度周围使用双引号。感叹号表示它将强制图像调整大小,直到其中一个尺寸与指定的尺寸之一匹配,这似乎只有在指定的尺寸大于图形的原始尺寸时才有影响。
import pydotplus
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier, export_graphviz

# Load in the dataset from sklearn
dataset = load_breast_cancer()
X = dataset.data
y = dataset.target
col_names = dataset.feature_names

# Create and fit the decision tree
clf_dt = DecisionTreeClassifier(criterion = 'gini', max_depth = 3)
clf_dt.fit(X_train, y_train)

# Export resulting tree to DOT source code string
dot_data = export_graphviz(clf_dt,
                                feature_names=col_names,
                                out_file=None,
                                filled=True,
                                rounded=True)

pydot_graph = pydotplus.graph_from_dot_data(dot_data)
pydot_graph.write_png('original_tree.png')
pydot_graph.set_size('"5,5!"')
pydot_graph.write_png('resized_tree.png')

点击图片以获得尺寸感觉,因为在浏览器中似乎无法正确显示。

original_tree.png: 原始树

resized_tree.png:
调整大小后的树

请注意,pydotplus.graphviz.Graph对象具有to_string()方法,该方法返回树的DOT源代码字符串,也可与您问题中的graphviz.Source对象一起使用:

import graphviz
gvz_graph = graphviz.Source(pydot_graph.to_string())
gvz_graph

感谢您的解决方案和详细的解释 :) - Nasir Islam Sujan
没问题。在回答这个问题的过程中,我学到了不少东西。很高兴它能对你有所帮助。=) - Mihai Chelaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接