LoginSignup
5
5

More than 1 year has passed since last update.

【Python】Graphvizを用いて階層構造データを可視化してみた

Last updated at Posted at 2022-11-23

はじめに

本記事では、DataFrame(階層構造)を木構造にして 可視化する関数 を作成したので紹介します。(ネスト構造の辞書であればより簡単に作成できます!)

下図例

アドバイスや間違いがあれば、ご指導よろしくお願いします!

利用ライブラリ

pandas, graphviz

DataFrameからネスト構造の辞書型へ変換

扱いやすくするために、データフレームから辞書型へ変換します。

example1.py
def make_genre(df, col1, col2, col3) -> dict: # col1, col2, col3にはそれぞれのカラムを入れる

    genre1 = df[col1].unique()
    genre2 = df[col2].unique()
    process_dict = {}

    for i in genre1:
        dict1 = {}
        genre2 = df[df[col1] == i][col2].unique()
        for j in genre2:
            dict2 = {}
            category = df[df[col2] == j][col3].unique()
            dict2[j] = category
            dict1.update(dict2)
        process_dict[i] = dict1
        
    return process_dict

出力結果

ネスト構造の辞書を可視化

example2.py
from graphviz import Digraph
from tqdm import tqdm
def make_tree(classifer:dict, DIR:str): # classiferには可視化したい辞書、DIRには保存するディレクトリを入れる
    
    for nums, unique_name in enumerate(tqdm(classifer.keys())):
        # formatはpngを指定(他にはPDF, PNG, SVGなどが指定可)
        G = Digraph(format="png")
        G.attr('node', shape='circle')

        # ノードを追加
        for i, j in classifer[unique_name].items():
            G.node(i)
            for k in j:
                if type(k) == str:
                    G.node(k)

        # 辺を追加
        for i, j in classifer[unique_name].items():
            G.edge(unique_name, i)
            for k in j:
                if type(k) == str:
                    G.edge(i, k)

        # 画像を保存(拡張子は不要)
        G.render(DIR+unique_name)

出力結果(ディレクトリへ保存)

例:アジア・エスニック.png
アジア・エスニック.png

おわりに

今回は階層構造になっているデータフレームを木構造にして可視化しました。可視化することで、スッキリ整理できます。Graphvizは気軽に扱うことができて楽しいので、ぜひ使ってみてください(笑)

謝辞

以下を参照しています。ありがとうございます。

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5