Rで複雑な関係図をデザインする(feat. DiagrammeR)

複雑な関係を一目で把握したいですか? RのDiagrammeRパッケージを使うと、専門家レベルの関係図デザインができます。この記事ではRを使って 法的紛争状況を例に、以下のような関係図の設計プロセスを詳しく説明します。

관계도 디자인 결과 그림
( Rを利用した関係図設計成果物 )

このガイドでは、RプログラミングのパワフルさとDiagrammeRの柔軟性を体験することができます。 ステップバイステップの説明と実際のコード例を通して、データ可視化の新たな次元を発見することができます。複雑な関係を明確に表現する方法、コードを最適化するためのヒント、プロ並みのグラフを作成するための秘訣まで、この記事ですべて紹介します。

法的訴訟における複雑な関係についての整理

まずは、どのような状況に対して関係図デザインをしようとするのか見ていきましょう。 詳しくはこちらをご覧ください。

  • 原告(日本電気):被告補助参加人(貸主)からアパートを賃借し、賃貸保証金を返還してもらえず、訴訟を提起した当事者です。
  • 被告(ソウル保証保険):原告と 전세금보장신용보험계약을締結したが、原告が賃貸借保証金を返却されなかったため、保険金を支払わない当事者です。
  • 被告補助参加人(賃貸人):原告にアパートを賃貸し、その後、疎外1にアパートを売却した当事者です。
  • 疎外者1(買主):被告補助参加人からアパートを購入し、賃貸人の地位を承継した当事者です。

関係図設計のためのDiagrammeRを始める

DiagrammeRパッケージのインストールとロード

Rで関係図を描くための最初のステップはDiagrammeRパッケージをインストールしてロードすることです。 次のコードを実行して始めましょう。

# DiagrammeRパッケージをインストールします。
install.packages("DiagrammeR")
#パッケージをロードします。
library(DiagrammeR)

関係図構造を設定する

基本的なグラフ構造の定義

DiagrammeRではDOT言語を使ってグラフ構造を定義します。次のコードから始めましょう。 このコードは上から下(TB, Top to Bottom)方向の基本的なグラフ構造を設定します。

grViz("
  digraph hierarchy {

    グラフ[rankdir = TB]

    node [shape = rectangle]
    # ここにノードとエッジを追加する予定です。
  }
")

ノードを定義する

それでは、グラフにノードを追加してみましょう。 各ノードは関係図の1つの要素を表します。

#関係図の各要素を追加
Korean_Electric_Power_Corporation [label = '原告(賃借人)\n韓電'] [label = '原告(賃借人)\n韓国電力'
Seoul_Guarantee_Insurance [label = '被告\nソウル保証保険'] [label = '被告補助参加人\n賃貸人'
Landlord [label = '被告補助参加人\n貸主'] [label = '被告補助参加人'
Buyer [label = '疎外者1\n買主']]
Lease_Contract [label = '賃貸借契約\n保証金未返還'] [label = '賃貸借契約\n保証金未返還']].
Lawsuit [label = '被告に対して\n訴訟を提起'] [label = '被告に対して\n訴訟を提起']].
Contract_Succession [label = '疎外者1に\n賃貸借契約承継'] [label = '疎外者1に\n賃貸借契約承継']].
Insurance_Contract [label = '保証保険契約の締結']].
Insurance_Denial [label = '保険金の支払いを拒否'] [label = '保険金の支払い拒否']].
Sale_Contract [label = '売却契約締結']] Sale_Contract [label = '売却契約締結']].

エッジ(接続線)を定義する

ノード間の関係を表すエッジを追加します。

#ノード間の関係設定
Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '賃貸保証\n信用保険契約'] [label = '賃貸保証\n信用保険契約'
Korean_Electric_Power_Corporation -> Lease_Contract
Seoul_Guarantee_Insurance -> Insurance_Denial
Korean_Electric_Power_Corporation -> 訴訟
大家 -> Sale_Contract
買主 -> Contract_Succession

リース_契約 -> 訴訟
訴訟 -> ソウル市_保証_保険
Sale_Contract -> 買主
契約_承継 -> 家主

レイアウトを最適化する

グラフのレイアウトを改善するために、見えないエッジを追加します。

#見えないエッジによる配置調整
edge [style = invis]
Lease_Contract -> Insurance_Contract -> Insurance_Denial -> Lawsuit -> Contract_Succession -> Sale_Contract

最終コードと結果

すべての要素を組み合わせた完成したコードは次のようになります。 このコードを実行すると、複雑な法的紛争関係を明確に示す関係図が生成されます。

grViz("
  digraph hierarchy {

    グラフ[rankdir = TB]

    node [shape = rectangle]
    Korean_Electric_Power_Corporation [label = '原告(賃借人)\n韓国電力公社'] [label = '原告(賃借人)\n韓国電力公社']].
    Seoul_Guarantee_Insurance [label = '被告\nソウル保証保険'] [label = '被告\nソウル保証保険']].
    Landlord [label = '被告補助参加人\n賃貸人'] [label = '被告補助参加人\n賃貸人']].
    Buyer [label = '疎外者1\n買主']]
    Lease_Contract [label = '賃貸借契約\n保証金未返還'] [label = '賃貸借契約\n保証金未返還']].
    Lawsuit [label = '被告に対して\n訴訟を提起'] [label = '被告に対して\n訴訟を提起']].
    Contract_Succession [label = '疎外者1に\n賃貸借契約承継'] [label = '疎外者1に\n賃貸借契約承継']].
    Insurance_Contract [label = '保証保険契約締結']].
    Insurance_Denial [label = '保険金の支払いを拒否'] [label = '保険金の支払い拒否']].
    Sale_Contract [label = '売却契約締結']] Sale_Contract [label = '売却契約締結']].

    Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '賃貸料保証\n信用保険契約'] [label = '賃貸料保証\n信用保険契約']].
    Koreaan_Electric_Power_Corporation -> Lease_Contract
    Seoul_Guarantee_Insurance -> Insurance_Denial
    Korean_Electric_Power_Corporation -> 訴訟
    大家 -> Sale_Contract
    買主 -> Contract_Succession

    リース_契約 -> 訴訟
    訴訟 -> ソウル市_保証_保険
    Sale_Contract -> 買主
    契約_承継 -> 家主

    edge [style = invis]
    Lease_Contract -> Insurance_Contract -> Insurance_Denial -> 訴訟 -> Contract_Succession -> Sale_Contract

  }
")

DiagrammeR活用のヒント

コードのカスタマイズ

  • ノードとエッジの色、フォント、スタイルを変更してみてください。
  • 条件付きスタイリングを適用して、特定の関係を強調することができます。

高度な機能探索

  • サブグラフを使用して複雑な構造を単純化することができます。
  • 動的データを活用して自動的に更新されるグラフを作成することができます。

このような活用のヒントは、別の記事で紹介したいと思います。

整理する

RとDiagrammeRパッケージを使って複雑な関係図を簡単かつ効果的に作ってみました。 このガイドで基本的なグラフの生成からレイアウトの最適化まで知ることができました。

今、あなただけのユニークな関係図を作成する番です。どのようなプロジェクトにDiagrammeRを活用してみたいですか? 詳しくはこちら グラフ/ネットワークの可視化 - DiagrammeRでご確認ください。

#完全なソースコード
R, RStudioをインストールする - Windowsの場合 ポストを見てRの世界に入ってみてください。そして下記のコードをコピペして実際にソースコードを実行してみてください。

# DiagrammeRパッケージを読み込みます。
library(DiagrammeR)

# grViz関数を使用してグラフを生成します。
# この関数はDOT言語で書かれたグラフの仕様を受け取り、視覚化します。
grViz("
  # digraphは方向があるグラフを意味します。
  # hierarchyはグラフの名前です。
  digraph hierarchy {
  
    # graph属性を設定します。
    # rankdir = TBはグラフの方向を上から下に設定します。
    graph [rankdir = TB].
  
    # ノードの基本形状を長方形に設定します。
    node [shape = rectangle]
    
    # 各ノードを定義します。
    # [label = '...'] はノードに表示するテキストを指定します。
    # \n は改行を意味します。
    Korean_Electric_Power_Corporation [label = '原告(賃借人)\n韓国電力公社']]。
    Seoul_Guarantee_Insurance [label = '被告\nソウル保証保険']].
    Landlord [label = '被告補助参加人\n賃貸人'] [label = '被告補助参加人\n賃貸人']].
    Buyer [label = '疎外者1\n買主']]
    Lease_Contract [label = '賃貸借契約\n保証金未返還'] [label = '賃貸借契約\n保証金未返還']].
    Lawsuit [label = '被告に対して\n訴訟を提起'] [label = '被告に対して\n訴訟を提起']].
    Contract_Succession [label = '疎外者1に\n賃貸借契約承継'] [label = '疎外者1に\n賃貸借契約承継']].
    Insurance_Contract [label = '保証保険契約締結']].
    Insurance_Denial [label = '保険金の支払いを拒否'] [label = '保険金の支払い拒否']].
    Sale_Contract [label = '売却契約締結']] Sale_Contract [label = '売却契約締結']].
    
    # ノード間の関係(エッジ)を定義します。
    # A -> BはAからBへ向かう矢印を描きます。
    # [label = '...'] は、矢印に表示されるテキストを指定します。
    Korean_Electric_Power_Corporation -> Seoul_Guarantee_Insurance [label = '전세금보장\n신용보험계약']].
    Korean_Electric_Power_Corporation -> Lease_Contract
    Seoul_Guarantee_Insurance -> Insurance_Denial
    Korean_Electric_Power_Corporation -> 訴訟
    大家 -> Sale_Contract
    買主 -> Contract_Succession
    
    リース_契約 -> 訴訟
    訴訟 -> ソウル市_保証_保険
    Sale_Contract -> 買主
    契約_承継 -> 家主
    
    # 見えないエッジを追加してレイアウトを調整します。
    # style = invisはエッジを見えなくします。
    edge [style = invis]
    Lease_Contract -> Insurance_Contract -> Insurance_Denial -> Lawsuit -> Contract_Succession -> Sale_Contract
    
  }
")

類似の投稿