Matplotlibでラベルと軸を調整して論文用のグラフの見栄えを良くする方法

Matplotlibを使ってグラフを作成したことがある人は誰しもが感じてきたと思いますが、デフォルトの設定がイケてない状態です(ラベルの文字が小さく、文字と軸が近すぎてかなり見にくい)。 論文のFigureとしてそのまま使うのは流石に厳しいと思いますので、私のMatplotlibのグラフの調整方法についてまとめることにしました。

まずGoogle先生に聞いてみるとちらほらグラフのラベル調整をしている記事が見つかると思います。 ですがMatplotlibの書き方は人によって異なる(plt.##で書く人、fig, ax = plt.subplots()で書く人)ので、そのまま使えないことも多いと思います。

この記事では、個人的にはオブジェクト指向が好みなので、fig, ax = plt.subplots() の書き方で説明します。

上で言っていることがわからない人で、Matplotlibを理解しつつ書きたいなという人は「早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話」を読むとある程度理解できるようになると思います。 かなり丁寧にわかりやすく解説されている素晴らしい記事です。

環境

  • Python: 3.6.6
  • Matplotlib: 2.2.3
  • Numpy: 1.15.1

Pythonの環境構築がまだできてないという方は「Python環境構築(pyenv + pyenv-virtualenv)」を参考にしてください。

調整する部分

論文に使われる図は基本的にはっきりとした印象を持つことが多いと思います(IF上位のジャーナルは特に)。 今回はトップジャーナルに投稿する際に意識した以下の4つのポイントについての調整法を紹介します。

  • ラベルサイズを大きくする
  • 軸ラベルを軸から離す
  • 目盛りラベルを軸から離す
  • 枠線(軸)を太くする

デフォルト設定のグラフ

以下にデフォルト設定のサンプルコードとその出力を記載します。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt


# sample data
np.random.seed(123)
x = np.random.randn(100)
y = np.random.randn(100)

# create a figure
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1,1,1)

ax.scatter(x, y)

ax.set_xlabel("Random-sampled X")
ax.set_ylabel("Random-sampled Y")
fig.show()

Output

調整後のグラフ

次に設定を調整したサンプルコードとその出力を記載します。 デフォルト設定のグラフと見比べてみてください。 ほんの少しだけ手を加えてあげるだけで見やすさが段違いに変わると思いませんか?

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import matplotlib.pyplot as plt


# sample data
np.random.seed(123)
x = np.random.randn(100)
y = np.random.randn(100)

# create a figure
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(1,1,1)

ax.scatter(x, y)

# 以下から追加分
# 枠線(軸)を太くする
for axis in ['top','bottom','left','right']:
ax.spines[axis].set_linewidth(4)

ax.xaxis.set_tick_params(direction="out", labelsize=20, width=3, pad=10) # x軸の目盛りの調整
ax.yaxis.set_tick_params(direction="out", labelsize=20, width=3, pad=10) # y軸の目盛りの調整
ax.set_xlabel("Random-sampled X", fontsize=30, labelpad=20, weight='bold') # x軸のラベルの調整
ax.set_ylabel("Random-sampled Y", fontsize=30, labelpad=20, weight='bold') # y軸のラベルの調整
fig.show()

Output

終わりに

以上、簡単ですがグラフのパラメータの設定方法について紹介しました。

Matplotlibは様々なパラメータが存在していて一筋縄では求めてるパラメータに行き着かないのですが、やりたいことはほぼできるはずなので、諦めずにMatplotlib APIから探してみてください。 またGoogle先生に聞くと、そんな複雑なことする必要があるのかなあと疑問に思うことが多々ありますが、きちんと調べれば簡単にできることがほとんどだと思いますので時間が許す範囲で調べるって感じですね。

オブジェクト指向の書き方をしている人は、追記分のコードをコピペするだけで簡単にグラフの調整ができるのでぜひお使いください。

今回説明がなかったものでも、もし紹介して欲しい処理がありましたらコメントしていただければ可能な限り対応しようと思います。

最後に、かなり基礎的な内容にはなりますが「Matplotlib&Seaborn実装ハンドブック」という本もあります。 Matplotlibを使って自分が書きたいグラフをどうやって書けば良いのか全くわからないという人はそちらも参考にすると良いかもしれません。

それでは。