初めに
神は細部に宿る,と云う.
論文を読んでいると,偶に,「変に引き伸ばしたグラフだな」とか「ちょっと横に長いな」とか思うことがある.逆の立場になって,自分の論文を読んでもらうときには,「綺麗だな」と思ってもらえなくても,少なくともストレスなく読んでもらいたい.
というわけで,論文に貼り付けるグラフのアスペクト比を幾つか検討する.
一般的に「美しい」とされる貴金属比と幾つかの比率で,グラフを描画してみる.
貴金属比
貴金属比(metallic mean / ratios)とは,1と次のような連分数(continued fraction)で表される(第$n$)貴金属数との比のことを指す.
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$は自然数.
すなわち,
1 : \frac{n + \sqrt{n^2 + 4}}{2}
が(第$n$)貴金属比である.$n = 1, 2, 3$のとき,特別に名前がついている.
黄金比(第1貴金属比)
第1貴金属比は黄金比と呼ばれる.
1 : \frac{1 + \sqrt{5}}{2}
\simeq 1 : 1.618
\simeq 5 : 8
白銀比(第2貴金属比)
第2貴金属比は白銀比と呼ばれる.
1 : 1 + \sqrt{2}
\simeq 1 : 2.414
\simeq 5 : 12
青銅比(第3貴金属比)
第3貴金属比は青銅比と呼ばれる.
1 : \frac{3 + \sqrt{13}}{2}
\simeq 1 : 3.303
\simeq 5 : 16
大和比
「白銀比」という言葉は,第2貴金属比と大和比の2つを指すらしい.先に記したのは,「第2貴金属比としての白銀比」である.「大和比としての白銀比」は,以下である.
1 : \sqrt{2}
\simeq 1 : 1.414
\simeq 5 : 7
白金比
白金比は貴金属比ではない(白金は貴金属なのに).が,美しいとされるらしい.大和比に似ている.
1 : \sqrt{3}
\simeq 1 : 1.732
\simeq 5 : 9
比較
第2,第3貴金属比はグラフのアスペクト比として使うには縦長 / 横長すぎる.
白金比($5:9$),黄金比($5:8$),大和比($5:7$)を比較する.
比較に使う図は,MatplotlibのStyle sheets referenceを基に作成する(一つの図に載せるデータは高々4~5程度にすべきと思っているので,若干修正している).
白金比($5:9$) | 黄金比($5:8$) | 大和比($5:7$) |
---|---|---|
plt.style.use("default")
などとして,図化のスタイルを変更できるので,幾つかのスタイルで試す(クリックしてズーム).
seaborn | classic | bmh | ggplot | |
---|---|---|---|---|
白金比 | ||||
黄金比 | ||||
大和比 |
終わりに
個人的には大和比($5:7$)が好きな気がする.
Appendix
Simple figure
MatplotlibのStyle sheets referenceを基に作成した.
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
上記のコードに,様々な意味の無い情報を付け足してみた.
取り敢えず気に入っている設定を書き込み,今のところ論文執筆中のダミーとして使っている.
以下のような図ができる.本当に意味の無い情報ばかりだ.
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()