よく使う図とmarkdown、pythonでの作り方


イントロダクション

図と言っても、用途や見せ方によって多くの種類があり、世の中には自分の知らないものがあるものです。

そこでよく使われる図をまとめ、議事録やプログラムでも使えるように、pythonmarkdownのコードも作りました。

こちらの記事をベースに一部内容を編集して共有します。


一覧

サンプル : pはpython(主にmatplotlibで作成した図), mはmarkdown(主にmermaidで作成した図)で作ったサンプルを載せています。

名前
用途
サンプル
備考

折れ線グラフ
時系列データ、スペクトル
p

棒グラフ
量の比較
p

円グラフ
割合
p

ヒストグラム
データの分布
p

レーダーチャート
項目の評価
p

散布図
離散データ
p

パレート図
重要な項目抽出
p

クラス図
モデルを表す
m
UML

シーケンス図
オブジェクト間のやり取り
m
UML

フローチャート
流れ
m

ガントチャート
進捗確認
m

樹形図
枝分かれ
m

箱ひげ図
誤差
p

等値線図
天気図
p

アローダイアグラム
矢印で工期
m

サイクル図
ループ
m

流線図
矢印でベクトルを示す
p

テーブル

-

mermaidはデスクトップエディタならTyporavscodeで書くならMarkdown Preview Mermaid Support、ブラウザならmermaid live editorで読み込むことができます。

mermaidについては以前の記事も参考にしてください。


折れ線グラフ


  • 時系列データ、スペクトル、運行ダイヤグラムを示す

  • 必ずしも軸は線形でなくてもよい(片対数、両対数グラフ等)

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(5)
y = x**2

plt.plot(x, y)
plt.show()

折れ線グラフ.png


棒グラフ


  • 他者と量を比較

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(3)
y = np.array([100, 30, 70])
plt.bar(x, y)

棒グラフ.png


円グラフ


  • 割合を円で示す

import numpy as np

import matplotlib.pyplot as plt

x = np.array([12, 23, 100])
str_label = ['a', 'b', 'c']
plt.pie(x, labels=str_label, counterclock=False, startangle=90)

円グラフ.png


ヒストグラム


  • データの分布を示す

import numpy as np

import matplotlib.pyplot as plt

x = np.random.normal(50, 10, 100)
plt.hist(x)

ヒストグラム.png


レーダーチャート


  • 項目を数値で評価するときに使用

import numpy as np

import matplotlib.pyplot as plt

labels = ['a', 'b', 'c', 'd']
values = [10, 20, 30, 40]
angles = np.linspace(0, 2*np.pi, len(labels) + 1, endpoint=True)
values = np.concatenate((values, [values[0]]))

fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, values, 'o-')
ax.fill(angles, values, alpha=0.25)
ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels)

レーダーチャート.png


散布図


  • 離散データを示す

import numpy as np

import matplotlib.pyplot as plt

x = np.random.rand(10)
y = np.random.rand(10)
plt.scatter(x, y)

散布図.png


パレート図


  • 重要な項目を抽出

import numpy as np

import matplotlib.pyplot as plt

x = np.arange(4)
y1 = np.array([10, 5, 3, 2])
sum_y1 = np.sum(y1)
y2 = np.cumsum(y1) / sum_y1

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twinx()

ax1.bar(x, y1)
ax2.plot(x, y2, c='r')

パレート図.png


クラス図


  • システムの構造を表す

  • 状態遷移図、オブジェクト図、パッケージ図へ応用可


  • mermaid使用(classDiagramは実験的機能)

classDiagram

Class01 <|-- AveryLongClass : Cool
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 --> C2 : Where am i?
Class09 --* C3
Class09 --|> Class07
Class07 : equals()
Class07 : Object[] elementData
Class01 : size()
Class01 : int chimp
Class01 : int gorilla
Class08 <--> C2: Cool label

クラス図.png


シーケンス図


  • オブジェクト間のやり取りを時系列に沿って表現


  • mermaid使用

sequenceDiagram

participant Alice
participant Bob
Alice->>John: Hello John, how are you?
loop Healthcheck
John->>John: Fight against hypochondria
end
Note right of John: Rational thoughts <br/>prevail...
John-->>Alice: Great!
John->>Bob: How about you?
Bob-->>John: Jolly good!

シーケンス図.png


フローチャート


  • 流れを示す

  • アクティビティ図へ応用可


  • mermaid使用

graph TD

A-->B
A-->C
B-->D
C-->D

フローチャート.png


ガントチャート


  • 時系列でタスクの進捗を示す


  • mermaid使用

gantt

dateFormat YYYY-MM-DD
title Adding GANTT diagram to mermaid

section A section
Completed task :done, des1, 2014-01-06,2014-01-08
Active task :active, des2, 2014-01-09, 3d
Future task : des3, after des2, 5d
Future task2 : des4, after des3, 5d

ガントチャート.png


樹形図


  • 事象の場合分け、家系図で使用

  • マインドマップ(思考を整理するための図)や特性要因図(問題を洗い出すための図)


  • mermaidを応用

graph LR

A---B
A---C
B---D
B---E
C---F

樹形図.png


箱ひげ図


  • データのばらつきを示す

import numpy as np

import matplotlib.pyplot as plt

spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low))

plt.boxplot(data)(self, parameter_list):

箱ひげ図.png


等値線図

import numpy as np

import matplotlib.pyplot as plt

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

CS = plt.contour(X, Y, Z)

等値線図.png


アローダイアグラム


  • 日程計画を決定するための図


  • mermaid使用

graph TD

1 -->|1 day| 2
2 -->|2 days| 3
2 -->|4 days| 4
3 -->|3 days| 5
4 -->|3 hours| 5

アローダイアグラム.png


サイクル図


  • PDCAやリサイクルを示す

  • 要は無限ループ


  • mermaid使用

graph LR

P-->D
D-->C
C-->A
A-->P

サイクル図.png


流線図


  • ものや人の流れを矢印で示した図

  • 統計地図、流体解析、電磁界解析へ応用

import numpy as np

import matplotlib.pyplot as plt

X = [1, 3]
Y = [2, 4]
U = [5, 60]
V = [70, 8]
plt.quiver(X, Y, U, V)

流線図.png


テーブル


  • エクセルなどの表

  • マトリックス図

a
n

b
1

c
2


終わりに

コードや説明にミスがあればご連絡ください。

また、追加すべき図があればできる範囲で対応します。


参考文献