はじめに
Matplotlib でグラフを描いていると、破線が少し密すぎると感じることがあります。
例えば、デフォルト設定で描画すると次のようになります。
plt.plot(x, y, linestyle="--")
仕様としては正しいのですが、
もう少し余白があったほうが読みやすいのでは、と思うことがあります。
では、人はどんな破線を見やすいと感じるのでしょうか。
その基準は、どこから来るのでしょうか。
Matplotlib の破線の基準
Matplotlib のデフォルト破線の間隔は、次のように確認できます。
import matplotlib as mpl
print(mpl.rcParams["lines.linewidth"]) # 1.5
print(mpl.rcParams["lines.dashed_pattern"]) # [3.7, 1.6]
内部的には、以下のように定義されています。
- 太さ:1.5 pt
- 線:3.7 pt
- 空白:1.6 pt
pt は印刷由来の単位で、
線に比べて空白が短い間隔で設定されていることが分かります。
つまりこの破線は、
静止した図として「破線らしく見えること」を意識して設計されているように見えます。
人は別の破線に慣れている
一方で、私たちは日常的に道路の白線を見ています。
高速道路でも一般道でも、破線は当たり前の存在です。
実は、これらの破線は Matplotlib の破線より粗いにもかかわらず、
とても見やすく感じられることが多いように思います。
例えば図のように、高速道路の破線は次のようになっています。
- 線の太さ:約 0.15 m
- 線の長さ:8 m
- 空白の長さ:12 m
空白の占める割合が比較的多いことが分かります。
仮説:人は見慣れた構造を好む
ここから、ひとつの仮説が考えられます。
人は、見慣れてきた構造を持つ破線を見やすいと感じるのではないか、というものです。
もしそうだとすると、Matplotlib の破線が少し密に感じられるのは、
日常で慣れ親しんだ破線構造と異なっているためかもしれません。
比べてみる
道路の破線をそのままコピーする必要はありません。
8 m を pt に変換する必要もありません。
重要なのは、
0.15 : 8 : 12 という三項の比率を保つこと
だと考えられます。
Matplotlib ではすべて pt 単位になるため、
スケールを自由に取って次のように書くことができます。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = x
k = 5
fig, ax = plt.subplots(figsize=(5, 5))
ax.plot(x, y, linestyle="--", label="matplotlib default (--)")
ax.plot(
x, y - 1,
linewidth=0.15 * k,
linestyle=(0, (8 * k, 12 * k)),
label="road (highway): 0.15 : 8 : 12"
)
ax.set_title("Dashed line patterns inspired by road markings")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend()
plt.tight_layout()
plt.show()
デフォルト破線と比べると、線と空白が間延びした、高速道路を意識した破線が得られました。
見慣れた構造のためか、デフォルトよりも美しく感じられます。
線幅や破線の間隔に悩んだとき、高速道路の設計は参考になりそうです。
おわりに
Matplotlib のデフォルト破線は間違っているわけではありません。
ただ、それが唯一の正解とも限りません。
可視化はデータの問題であると同時に、
人がどんな構造に慣れてきたかという側面も持っているように思います。
破線が少し見づらいと感じたとき、
足りないのはデータではなく、
私たちが慣れ親しんできた「比率」なのかもしれません。
参考


