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

### イントロダクション
図と言っても、用途や見せ方によって多くの種類があり、世の中には自分の知らないものがあるものです。
そこでよく使われる図をまとめ、議事録やプログラムでも使えるように、`python`や`mermaid`(markdownエディタでよくサポートされているjavascriptライブラリ)のコードも作りました。
[こちらの記事](https://www.snova301.work/entry/2019/06/01/142608)をベースに一部内容を編集して共有します。


### 一覧

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

|名前|用途|サンプル|備考|
|---|---|---|---|
|[折れ線グラフ](#折れ線グラフ)|時系列データ、スペクトル|p||
|[棒グラフ](#棒グラフ)|量の比較|p||
|[円グラフ](#円グラフ)|割合|p||
|[ヒストグラム](#ヒストグラム)|データの分布|p||
|[レーダーチャート](#レーダーチャート)|項目の評価|p||
|[散布図](#散布図)|離散データ|p||
|[パレート図](#パレート図)|重要な項目抽出|p||
|[クラス図](#クラス図)|モデルを表す|m|UML|
|[シーケンス図](#シーケンス図)|オブジェクト間のやり取り|m|UML|
|[フローチャート](#フローチャート)|流れ|m||
|[ガントチャート](#ガントチャート)|進捗確認|m||
|[樹形図](#樹形図)|枝分かれ|m||
|[箱ひげ図](#箱ひげ図)|誤差|p||
|[等値線図](#等値線図)|天気図|p||
|[アローダイアグラム](#アローダイアグラム)|矢印で工期|m||
|[サイクル図](#サイクル図)|ループ|m||
|[流線図](#流線図)|矢印でベクトルを示す|p||
|[テーブル](#テーブル)|表|-||

`mermaid`はデスクトップエディタなら[Typora](https://typora.io/)、`vscode`で書くなら`Markdown Preview Mermaid Support`、ブラウザなら[mermaid live editor](https://mermaidjs.github.io/mermaid-live-editor/)で読み込むことができます。
mermaidについては以前の記事も参考にしてください。

- [Typoraでシーケンス図、フローチャート、ガントチャートを描くための書き方まとめ](https://qiita.com/snova301/items/037ebb66658b181e659c)



### 折れ線グラフ
- 時系列データ、スペクトル、運行ダイヤグラムを示す
- 必ずしも軸は線形でなくてもよい(片対数、両対数グラフ等)

```python
import numpy as np
import matplotlib.pyplot as plt

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

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

![折れ線グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/5b7682d1-b3fa-1a0b-f365-aa24a862f0b1.png)



### 棒グラフ
- 他者と量を比較

```python
import numpy as np
import matplotlib.pyplot as plt

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

![棒グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/448b535c-ea68-7bed-e40a-c765d33dc807.png)


### 円グラフ
- 割合を円で示す

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/8d6f904a-a46e-ae03-8312-bde8d0a853c9.png)



### ヒストグラム
- データの分布を示す

```python
import numpy as np
import matplotlib.pyplot as plt

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

![ヒストグラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/1de100d1-26cd-be03-7182-460185295099.png)



### レーダーチャート
- 項目を数値で評価するときに使用

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/b0d9e543-1670-02f6-20e8-451afe737edf.png)



### 散布図
- 離散データを示す

```python
import numpy as np
import matplotlib.pyplot as plt

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

![散布図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/68f36e7a-9525-2220-9eca-9b16f08d6461.png)



### パレート図
- 重要な項目を抽出

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/78802ffd-71c2-ff30-65aa-45dfad11217b.png)




### クラス図
- システムの構造を表す
- 状態遷移図、オブジェクト図、パッケージ図へ応用可
- `mermaid`使用(`classDiagram`は実験的機能)

```mermaid
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/be7417ce-8b81-3419-0a54-56539f616c5d.png)


### シーケンス図
- オブジェクト間のやり取りを時系列に沿って表現
- `mermaid`使用

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/e7613873-c68a-0b04-8b05-17acd6f06cc1.png)



### フローチャート
- 流れを示す
- アクティビティ図へ応用可
- `mermaid`使用

```mermaid
graph TD

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

![フローチャート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/6f1fb87d-989a-b987-23ae-df251155b5cc.png)


### ガントチャート
- 時系列でタスクの進捗を示す
- `mermaid`使用

```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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/a5812999-be6d-48ae-2ca8-2b823db37ac9.png)


### 樹形図
- 事象の場合分け、家系図で使用
- マインドマップ(思考を整理するための図)や特性要因図(問題を洗い出すための図)
- `mermaid`を応用

```mermaid
graph LR

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

![樹形図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/286c0fb1-0641-7059-db88-d56b588415df.png)



### 箱ひげ図
- データのばらつきを示す

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/de20d0fe-3443-5f36-c8b2-fdf748a35371.png)



### 等値線図
- 等高線図や天気図
- [matplotlib](https://matplotlib.org/gallery/images_contours_and_fields/contour_demo.html#sphx-glr-gallery-images-contours-and-fields-contour-demo-py)を使用

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/2c3207c3-f213-d8a0-4bf2-ffcb684de5ae.png)



### アローダイアグラム
- 日程計画を決定するための図
- `mermaid`使用

```mermaid
graph TD

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

![アローダイアグラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/b06be0a3-353c-ffa1-1d25-e655676436ee.png)



### サイクル図
- PDCAやリサイクルを示す
- 要は無限ループ
- `mermaid`使用

```mermaid
graph LR

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

![サイクル図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/2cc213b7-057d-9feb-a179-21e62abfe411.png)



### 流線図
- ものや人の流れを矢印で示した図
- 統計地図、流体解析、電磁界解析へ応用

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176652/eafc00fe-c2c1-0258-8ac3-2921510771c4.png)



### テーブル
- エクセルなどの表
- マトリックス図

|a|n|
|---|---|
|b|1|
|c|2|


### 終わりに
コードや説明にミスがあればご連絡ください。
また、追加すべき図があればできる範囲で対応します。



### 参考文献
- [よく使う図のまとめとpython、markdownのコード - snova301のブログ](https://www.snova301.work/entry/2019/06/01/142608)
- [ダイアグラム - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)
- [ダイアグラム - artscape](https://artscape.jp/artword/index.php/%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)
- [Category:グラフ - Wikipedia](https://ja.wikipedia.org/wiki/Category:%E3%82%B0%E3%83%A9%E3%83%95)
- [統計をグラフにあらわそう（種類と特徴） - 統計局](https://www.stat.go.jp/naruhodo/c1graph.html)
- [プレゼンや思考整理に役立つ【図・表・グラフ】25パターン - NAVERまとめ](https://matome.naver.jp/odai/2143342543411469501)
- [覚えておきたいチャート図7種類を紹介！ - ferret](https://ferret-plus.com/10807)
- [コバトンと学ぶこども統計クラブ - 埼玉県](https://www.pref.saitama.lg.jp/a0206/kodomo/kodomotoukei-club_top.html)
- [箱ひげ図の見方 - 統計WEB](https://bellcurve.jp/statistics/course/5220.html)
- [mermaid - GitHub](https://github.com/knsv/mermaid)
- [matplotlib公式](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot)
- [Python でデータサイエンス](https://pythondatascience.plavox.info/)
- [DeepAge](https://deepage.net/blog/)
- [Matplotlibでレーダーチャートを描く（16行） - Qiita](https://qiita.com/1007/items/80406e098a4212571b2e)
- [【厳選】Python実務データ分析でよく使う手法（分析手法編） - Qiita](https://qiita.com/takubb/items/286916434ce44889d0fd)
- [matplotlibで左右に２つの軸があるグラフを書く方法 - Qiita](https://qiita.com/supersaiakujin/items/e2ee4019adefce08e381)
- [mermaid live editor](https://mermaidjs.github.io/mermaid-live-editor/)
- [QC七つ道具 - 日科技研](https://www.i-juse.co.jp/statistics/product/func/qc7/)
- [品質管理の基礎 - 品質管理の知識](https://www.sk-quality.com/qc7/qc701_general.html)
- [QC7つ道具 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%93%81%E8%B3%AA%E7%AE%A1%E7%90%86)
- [UML超入門 - ObjectClub](http://objectclub.jp/technicaldoc/uml/umlintro2)
- [よく聞くUMLって何？ - Qiita](https://qiita.com/github129/items/80d39f2f043489033076)