📜  如何在python中绘制树状图(1)

📅  最后修改于: 2023-12-03 15:08:57.771000             🧑  作者: Mango

如何在Python中绘制树状图

绘制树状图是数据可视化中常见的一种形式。在Python中,可以使用多个第三方库来实现这个目的,如matplotlib、graphviz等。

使用matplotlib绘制树状图

在matplotlib中,可以使用matplotlib.pyplot库的plotscatter方法来构建树状图。其中,plot方法用于连接各个节点,scatter方法则用于绘制节点。

以下是一个简单的示例代码:

import matplotlib.pyplot as plt

class Node:
    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent
        self.children = []
        
    def add_child(self, child):
        self.children.append(child)

tree = Node('root')
tree.add_child(Node('A'))
tree.add_child(Node('B'))
tree.add_child(Node('C'))
tree.children[0].add_child(Node('A1'))
tree.children[0].add_child(Node('A2'))
tree.children[1].add_child(Node('B1'))

leaves = []
def get_leaves(node):
    if not node.children:
        leaves.append(node.name)
        
    for child in node.children:
        get_leaves(child)

get_leaves(tree)

fig, ax = plt.subplots(figsize=(10, 5))
ax.plot([0, 1], [0, 0], 'k')
ax.plot([0, 1], [0, 0], 'ko', mfc='w', mew=2)
ax.text(0, 0, tree.name, ha='center', va='center')
for i, child in enumerate(tree.children):
    ax.plot([i+1, i+1], [0, -1], 'k')
    ax.plot([i+1, i+1], [0, -1], 'ko', mfc='w', mew=2)
    ax.text(i+1, 0, child.name, ha='center', va='bottom')
    for j, grandchild in enumerate(child.children):
        ax.plot([i+1, i+j+2], [-1, -2], 'k')
        ax.plot([i+1, i+j+2], [-1, -2], 'ko', mfc='w', mew=2)
        ax.text(i+j+2, -1, grandchild.name, ha='center', va='bottom')
ax.set_ylim(-2, 1)
ax.set_xlim(-0.5, 3.5)
plt.xticks([]), plt.yticks([])
plt.show()

该代码的输出结果如下:

tree_plot_example.png

使用graphviz绘制树状图

graphviz是一款开源的图形可视化工具,可以通过代码定义图形结构并生成对应的图形。在Python中,需要使用graphviz库,可以通过pip安装,例如:

!pip install graphviz

以下是一个使用graphviz库绘制树状图的示例代码:

from graphviz import Digraph

class Node:
    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent
        self.children = []
        
    def add_child(self, child):
        self.children.append(child)
        
    def render(self, dot):
        dot.node(self.name)
        for child in self.children:
            child.render(dot)
            dot.edge(self.name, child.name)
            
tree = Node('root')
tree.add_child(Node('A'))
tree.add_child(Node('B'))
tree.add_child(Node('C'))
tree.children[0].add_child(Node('A1'))
tree.children[0].add_child(Node('A2'))
tree.children[1].add_child(Node('B1'))

dot = Digraph(comment='Tree Plot')
tree.render(dot)

dot.render('tree_plot_example', format='png', view=True)

该代码的输出结果如下:

tree_plot_example.png

总结

以上就是在Python中绘制树状图的两个方法,其中使用matplotlib需要手动设置每个节点的坐标,而graphviz则可以自动布局,更加便捷。通过这两种方法,可以将复杂的树状结构可视化,提高数据分析和理解的效率。