🌛

PlantUMLのレイアウトのコツと指定方法についてのまとめ

2021/01/22に公開

PlantUMLで図を描いていて、こんな感じの図になってしまいテンションが下がってしまうことがあるのではないでしょうか。
このような残念な図にならないためのコツを書いてみようと思います。
クラス図を例に説明しますが、ユースケース図も基本的に同じです。

--- を使い分ける

図で表現したい領域において、関連性の高いものは - で結び、高くないもの(以降「普通の関連」と表記します)は -- で結ぶ。
同じアルファベットで始まる要素が関連性の高い要素で、A1, B1, C1を普通の関連 -- で結んだ例:

@startuml
A1 - A2
A1 - A3
B1 - B2
C1 - C2

A1 -- B1
A1 -- C1
@enduml
  • - で結んだものを近くに、横並びに表示しようとしてくれる
  • -- で結んだものはいい感じに配置しようとしてくれる

また、- で結んでも、関連性の高い配置にするのが無理な場合は、普通の関連性の要素として配置されます。

AとBは普通の関連で、CはA,Bどちらとも関連性の高い要素として指定した例:

@startuml
A -- B
A - C
B - C
@enduml

CがA,Bのどちらの要素とも関連性が高い配置にすることはできないので、Bとだけ高い関連性の配置となっています。

描く図によって色々あると思いますが、基本的には次のような考え方で描くと良いと思います。

  • 基本的に -- で結ぶ
  • 明らかに関連性が高いものだけ - で結ぶ

関連を作るときの順番

要素間の関連を作るときの、要素の順番もレイアウトに影響します。

-- の場合は、先に来る要素が上に配置されます。
これを意識すると、同じ A-B-C の関連でも違うレイアウトで表現できます。

@startuml
A -- B
C -- B

a -- b
b -- c
@enduml

- の場合は、先に来る要素が左に配置されます。

@startuml
A - B
C - B

a - b
b - c
@enduml

これを理解しておくと、同じリレーションでも結構違う形で表現できます。

Aを頂点にした例:

@startuml
A -- B
A -- C

B -- D

C -- E
C -- F
@enduml

Aを中央にした例:

@startuml
B -- A
A -- C

D -- B

C -- E
C -- F
@enduml

この2つのポイントを意識するだけで、図の仕上がり具合がかなり変わってくると思います。

その他レイアウトに関する指定方法

レイアウトに関して、PlantUMLの公式のフォーラムで作者は次のように言っています。
https://forum.plantuml.net/977 から一部引用:

It's true that when diagram is big (or very big) manual placement could be useful. However and unfortunatly, this is againt PlantUML concept...

(著者訳)大きい図を描く場合、レイアウトを手動で行えると便利だと思います。
しかしながら、手動でレイアウトすることはPlantUMLのコンセプトに反してしまいます。

PlantUMLはあくまで、テキストベースで簡単に図を書くためのツールであり、細かくレイアウトなどを調整したい場合は他のツールを使った方がいい、という感じでしょうか。

ということで、レイアウトを細かく制御しようとすることはナンセンスだと思いますが、指定方法にどういったものがあるかを把握しておくと役に立つことがあると思うのでリストアップしてみました。

要素を描画していく向きの指定

要素を描画していく向きを「上から下」か、「左から右」のどちらかを指定することができます。
デフォルトでは「上から下」になっています。

「上から下」の例:

@startuml
' デフォルトで選択されているので、指定しなくても同じ
top to bottom direction
A -- B
B -- C
@enduml

「左から右」の例:

@startuml
left to right direction
A -- B
B -- C
@enduml

関連を結ぶ線の長さ

--- の違いは前述しましたが、 - を増やすことで、要素間の距離を指定することができます。

@startuml
' 縦長になってしまうと見づらいので横向きのレイアウトに
left to right direction
A -- B
A --- C
A ---- D
A --------- E
@enduml

関連の向き

関連を結ぶときの要素の順番がレイアウトに影響すると前述しましたが、明示的に指定することができます。
left, right, up, downの四方向の指定が可能です。

@startuml
A -left- B
A -up- C
A -right- D
A -down- E
@enduml

省略した書き方もできます。

  • left: le, l
  • right: ri, r
  • up: u
  • down: do, d

together

togetherブロック内で宣言された要素は近くに配置されます。

AとDを近くに配置する例:

@startuml
left to right direction
together {
    class A
    class D
}

A -- B
B -- C
C -- D
@enduml

togetherを使わない場合の例:

@startuml
left to right direction
A -- B
B -- C
C -- D
@enduml

hidden

関連を結ぶ際に -[hidden]- と指定すると、線を表示されなくなるので、レイアウトのためのヒントを与える用途で使うことができます。

BとEをhiddenで結んだ例:

@startuml
left to right direction
A -- B
B -- C
C -- D
E -- F

B -[hidden]- E
@enduml

hiddenを使わない場合の例:

@startuml
left to right direction
A -- B
B -- C
C -- D
E -- F
@enduml

Discussion