0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1000007824.jpg
近所の池にいたバン

Overview

この記事では、ビジュアライゼーションの観点で、グラフの枠(spine)に注目し、データインクを減らす具体的な方法を示します。

spineを削除する具体的な方法は以下のとおりです。

matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
seaborn
import seaborn as sns

sns.despine()

なぜ、グラフを作るのか

データサイエンティストであっても、そうでなくてもビジネスマンであれば誰しもグラフを作ると思います。
グラフを作る目的はなんでしょうか?

  • 細かい数字を上司に見せたくない
  • 顧客に数字を良く見せたい

・・・といった不純な動機は脇に置きます。
あるべき論としては「意味のある結果を、誰かに伝え、次のアクションに繋げる」というのが、グラフに課された使命だと思っています。

グラフの「檻」とはなにか

下図、grid+spineを「檻」と定義する。

image.png
一般に脱獄という文脈では、gridを指すことが多いですが、この記事では外枠を含むgrid+spineを檻と定義しています。
このグラフを見せたい誰かに、より分かりやすく情報を伝えるためにはこの檻を見やすく調整することも、一つの手です。

インクを減らす

多くの一般的なグラフでは、右と上のspineはデータの読み取りに直接寄与しないことが多い。

伝えたいことがある場合、基本的には情報量を減らし、聴衆を伝えたいことに集中させるべきです。
グラフにおける情報量の1つの変数として「データインク」という考え方があります。
spineや濃いgridは、データそのものではないため、必要以上に目立つと読み手の注意を分散させます。

左図はmatplotlibのデフォルトの設定、右図はgridを薄くし、右と上のspineを削除した例です。
image.png
左右の図を見比べると、右図のほうが「データインク」が少なく、よりすっきりとした印象に感じる方が多いかと思います。

脱獄のススメ

gridを薄くする

matplotlibの仕様では、デフォルトでgridがOFFです。
そのため、gridが必要だと感じたときに、gridを有効にすればよいです。
デフォルトそのままのgridが濃すぎる場合、下例のように調整が可能です。

matplotlib
# linestyleに破線を設定し、50%透過
ax.grid(linestyle="--", alpha=0.5)

spineを消す

一方のspineについては、グラフに占めるインク量がgridに比べ少ないです。
ただし、目盛を打たない場合、右と上のspineは明らかに必要のないインクです。
image.png
spineの設定方法については、gridに比べメジャーではないと認識しています。
そのため詳しい設定方法を以下に示します。

実装方法

データの準備

今回は例として、0から2πまでのサインカーブを描画します。

import numpy as np

x = np.linspace(0, 2 * np.pi, 500)
y = np.sin(x)

matplotlibでの実装例

matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(x, y, label="sin(x)")
ax.set_title("Sine Curve")
ax.set_xlabel("x")
ax.set_ylabel("sin(x)")
ax.legend()

ax.spines["top"].set_visible(False)    # 天井を非表示
ax.spines["right"].set_visible(False)    # 右の壁を非表示

plt.show()

seabornでの実装例

import seaborn as sns

fig, ax = plt.subplots()
sns.lineplot(x=x, y=y, ax=ax, label="sin(x)")
ax.set_title("Sine Curve")
ax.set_xlabel("x")
ax.set_ylabel("sin(x)")
ax.legend()

sns.despine(ax=ax)    # 天井と右の壁を非表示

plt.show()

本文は以上です。

Closing

spine単体をビジュアライゼーションの観点から扱う記事を見かけたことがなかったため、本記事を作成しました。
spineの消し方自体は、他記事・生成AIツールを使えば知ることができます。
一方で、なぜspineを消すのか/どのspineを消すべきか、という観点では一般にあまり整理されておらず、「spineを消す」という選択肢を記事にするだけで価値があると考え記事を書きました。

要素 基本方針
grid 必要なときだけ表示し、薄くする
top spine 多くの場合は削除してよい
right spine 多くの場合は削除してよい
left/bottom spine 軸の基準として残すことが多い

参考文献

本記事を書くにあたり、以下の書籍を参考にしました。
両著とも、ビジュアライゼーションに多くのページを割き、体系的に解説がなされています。

  • 市川 真樹(著)『資料作成研修講師が教える プレゼン資料改善術』
    特に「第5章 グラフのルールと選択方法」を参考にしました。
    全体を通じて「伝える」フェーズを徹底的に解説されています。
    ただ方法を示すだけでなく、チェックリストを提示することで、読者が実践に踏み出せるような構成となっています。

相手が動くことによって、あなたが提供する価値を相手が享受することができる。

  • Steven S. Skiena(著)/小野 陽子(監訳)/長尾 高弘(訳)『データサイエンス設計マニュアル』
    特に「6章 データの可視化」を参考にしました。
    この章ではデータサイエンティストが持つべき矜持と、具体的な方法について、体系的にまとめられています。

意味のある結果は、共有されて初めて行動につながる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?