グラフのアスペクト比はどれくらいが良いか

# 初めに
神は細部に宿る，と云う．

論文を読んでいると，偶に，「変に引き伸ばしたグラフだな」とか「ちょっと横に長いな」とか思うことがある．逆の立場になって，自分の論文を読んでもらうときには，「綺麗だな」と思ってもらえなくても，少なくともストレスなく読んでもらいたい．

というわけで，論文に貼り付けるグラフのアスペクト比を幾つか検討する．

一般的に「美しい」とされる貴金属比と幾つかの比率で，グラフを描画してみる．

# 貴金属比
貴金属比（metallic mean / ratios）とは，1と次のような連分数（continued fraction）で表される（第$n$）貴金属数との比のことを指す．

```math
n + \cfrac{1}{n+\cfrac{1}{n+\cfrac{1}{n+\cfrac{1}{n+\cdots}}}}
= [n; n, n, n, n, \cdots]
= \frac{n + \sqrt{n^2 + 4}}{2}
```

ただし，$n$は自然数．

すなわち，

```math
1 : \frac{n + \sqrt{n^2 + 4}}{2}
```

が（第$n$）貴金属比である．$n = 1, 2, 3$のとき，特別に名前がついている．

## 黄金比（第1貴金属比）
第1貴金属比は黄金比と呼ばれる．

```math
1 : \frac{1 + \sqrt{5}}{2}
\simeq 1 : 1.618
\simeq 5 : 8
```

## 白銀比（第2貴金属比）
第2貴金属比は白銀比と呼ばれる．

```math
1 : 1 + \sqrt{2}
\simeq 1 : 2.414
\simeq 5 : 12
```

## 青銅比（第3貴金属比）
第3貴金属比は青銅比と呼ばれる．

```math
1 : \frac{3 + \sqrt{13}}{2}
\simeq 1 : 3.303
\simeq 5 : 16
```

## 大和比
「白銀比」という言葉は，第2貴金属比と大和比の2つを指すらしい．先に記したのは，「第2貴金属比としての白銀比」である．「大和比としての白銀比」は，以下である．

```math
1 : \sqrt{2}
\simeq 1 : 1.414
\simeq 5 : 7
```

## 白金比
白金比は貴金属比ではない（白金は貴金属なのに）．が，美しいとされるらしい．大和比に似ている．

```math
1 : \sqrt{3}
\simeq 1 : 1.732
\simeq 5 : 9
```

# 比較
第2，第3貴金属比はグラフのアスペクト比として使うには縦長 / 横長すぎる．

白金比（$5:9$），黄金比（$5:8$），大和比（$5:7$）を比較する．

比較に使う図は，Matplotlibの[Style sheets reference](https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html)を基に作成する（一つの図に載せるデータは高々4~5程度にすべきと思っているので，若干修正している）．

| 白金比（$5:9$） | 黄金比（$5:8$） | 大和比（$5:7$） |
|:-:|:-:|:-:|
| ![style_default_ratio_(9, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/0d2aa06d-0ab1-962f-8efb-7206b53c7341.png) | ![style_default_ratio_(8, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/1f72bf65-b671-7127-7a5d-2eb7ce506ab8.png)| ![style_default_ratio_(7, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/d3fff91b-205f-702d-217e-4408e8a991ee.png) |

`plt.style.use("default")`などとして，図化のスタイルを変更できるので，幾つかのスタイルで試す（クリックしてズーム）．

|   | seaborn | classic | bmh | ggplot |
|:-:|:-:|:-:|:-:|:-:|
| 白金比 | ![style_seaborn_ratio_(9, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/884bc86f-f211-1814-0dc5-8a669006c804.png) | ![style_classic_ratio_(9, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/eb3a76bd-578b-c1c2-4c14-b121b08168e2.png) | ![style_bmh_ratio_(9, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/4c6e2ec3-fab9-6f35-10af-31a38b7dc6f7.png) | ![style_ggplot_ratio_(9, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/9a651f4c-4e0a-a0e6-e4e5-0b4c17d5f980.png) |
| 黄金比 | ![style_seaborn_ratio_(8, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/330742e8-5970-fceb-8b21-6a54be33eec3.png) | ![style_classic_ratio_(8, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/ae0acbd4-d426-9ec4-f84a-c29d65e2f8aa.png) | ![style_bmh_ratio_(8, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/289b49b1-fe0e-9069-0a12-4fe7f3d0be13.png) | ![style_ggplot_ratio_(8, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/1921d6e7-d5de-3c7b-0712-238820f9afac.png) |
| 大和比 | ![style_seaborn_ratio_(7, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/7ef20751-5c8a-7500-8a5a-f60df62ed0ab.png) | ![style_classic_ratio_(7, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/428c2246-7c29-95ac-0add-4bff172a5544.png) | ![style_bmh_ratio_(7, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/000bd633-506d-83c8-dab3-a8144e59457f.png) | ![style_ggplot_ratio_(7, 5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/edb680ea-597d-d0de-f739-22534aad6b8a.png) |

# 終わりに
個人的には大和比（$5:7$）が好きな気がする．

# Appendix
## Simple figure
Matplotlibの[Style sheets reference](https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html)を基に作成した．

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

x = np.linspace(-10., 10., 21)

shifts = np.linspace(-5, 5, 5)
amplitudes = np.linspace(1., 2., 5)

def sigmoid(x, x0):
    return 1 / (1 + np.exp(-(x - x0)))

style = "default"
plt.style.use(style)

ratio = (9, 5)
plt.figure(figsize=ratio)

for i, (x0, a) in enumerate(zip(shifts, amplitudes)):
    plt.plot(x, a * sigmoid(x, x0), marker="s", label=f"Series-{i}")

plt.legend(loc="upper left", facecolor="w", framealpha=1.)
plt.xlim([-10., 10.])
plt.ylim([-.2, 2.2])
plt.tight_layout()
plt.show()
```

## Dummy figure
上記のコードに，様々な意味の無い情報を付け足してみた．

取り敢えず気に入っている設定を書き込み，今のところ論文執筆中のダミーとして使っている．

以下のような図ができる．本当に意味の無い情報ばかりだ．

![dummy_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/df7a07e5-f1e1-f32a-1640-4549dda10cc2.png)

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

def main():
    x = np.linspace(-10., 10., 21)

    def sigmoid(x, x0):
        return 1 / (1 + np.exp(-(x - x0)))

    markers = ["o", "s", "D", "H"]
    linestyles = ["-", "--", "-.", ":"]
    n_data = len(markers)
    shifts = np.linspace(-5, 5, n_data)
    amplitudes = np.linspace(1., 2., n_data)

    plt.figure()

    for i, (x0, a, marker, ls) in enumerate(zip(shifts, amplitudes, markers, linestyles)):
        plt.plot(x, a * sigmoid(x, x0), marker=marker, ls=ls, label=f"dummy-series-{i}")

    offset = 40
    # plt.annotate(
    #     text="Lorem ipsum",
    #     xy=(-5., .5),
    #     xytext=(-offset, offset), 
    #     textcoords="offset points",
    #     bbox=dict(
    #         boxstyle="round", 
    #         facecolor="lightgray",
    #     ),
    #     arrowprops = dict(
    #         arrowstyle="->",
    #         facecolor="lightgray",
    #         connectionstyle="angle, rad=20"
    #     )
    # )
    plt.annotate(
        text="¿¿¿Gott ist tot¡¡¡",
        xy=(0., 2.2),
        xytext=(offset, -offset), 
        textcoords="offset points",
        fontsize=14,
        bbox=dict(
            boxstyle="round", 
            facecolor="turquoise",
            alpha=.5
        ),
        arrowprops = dict(
            arrowstyle="-|>",
            facecolor="k",
            connectionstyle="arc3, rad=-.3"
        )
    )

    plt.text(
        -9., 1.2,
        "$u (x^{\prime}) = \int_{\Omega} u (x) \delta (x - x^{\prime}) \, dx$",
        color="k",
        rotation=0,
        fontsize=14,
        bbox=dict(
            boxstyle="round", 
            facecolor="w", 
            alpha=.5
        )
    )

    plt.legend(loc="upper left", ncols=1)
    plt.xlim(-10., 10.)
    plt.ylim(-.2, 2.2)
    plt.xlabel("DUMMY INPUT, $X$")
    plt.ylabel("dummy output, $y$")
    plt.title("!!!Dummy Figure???")
    plt.tight_layout()
    plt.savefig(f"dummy_figure.pdf")
    plt.show()

def plot_settings():
    # visualization setting
    plt.style.use("default")
    plt.style.use("seaborn-v0_8-deep")   # seaborn-v0_8-<style>
    plt.style.use("seaborn-v0_8-talk")   # paper / notebook / talk / poster
    plt.rcParams["font.family"] = "Times New Roman"
    plt.rcParams["mathtext.fontset"] = "cm"
    plt.rcParams["figure.figsize"] = (7, 5)
    plt.rcParams["figure.autolayout"] = True
    plt.rcParams["axes.grid"] = True
    plt.rcParams["grid.alpha"] = .3
    plt.rcParams["legend.framealpha"] = 1.
    plt.rcParams["legend.facecolor"] = "w"
    plt.rcParams["savefig.dpi"] = 300

if __name__ == "__main__":
    plot_settings()
    main()
```