matplotlibをダークテーマにしたい

matplotlibはデフォルトでは下の画像のように背景が真っ白で, 長時間見ていると目が痛くなるから別の色に変更したい. しかし, スタイルシートをわざわざ自作するのも億劫である. 調べてみるとプリセットのスタイルシートが使えるとのことなので, 使い方を簡単に書き留めておこうと思う.

![default_sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546214/69a44122-dc01-be0b-cd9c-1c75e6a12a3c.png "default_sin.png")


## import

```python:
import matplotlib.pyplot as plt
```

## スタイルシート一覧

```python:
plt.style.available
```
利用可能なスタイルシート一覧を配列として取得できる.
配列の中身は以下の通り.

```python:
['bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark-palette',
 'seaborn-dark',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'seaborn',
 'Solarize_Light2',
 'tableau-colorblind10',
 '_classic_test']
```

黒い方がかっこいいので, `dark_background`あたりが良さそう.


## スタイルを適用する

```python:
plt.style.use('dark_background')
```

最初にこの一行でスタイルを適用したら, 後はいつも通りにグラフを描いたり画像を表示したりするだけ.


## サインカーブを描いてみる
こういうときはサインカーブと相場は決まっているので, さっそく描いて確かめてみる.

```python:
import numpy as np

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

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y)
```

![dark_sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546214/6ad7bd20-543f-9c28-84cd-6136b51c98d0.png "dark_sin.png")

良いと思う.
がしかし, 少し黒すぎる気もする.


## 簡単な自作スタイルシート
自作のスタイルシートは作らないつもりだったが, 少しだけいじってみる.

スタイルシートが入っているフォルダはpythonのフォルダから`Lib/site-packages/matplotlib/mpl-data/stylelib/`と下っていけば見つかる. その中に`dark_background.mplstyle`というファイルがあるので, それを開く.　内容は以下の通り.

```mplstyle:dark_background.mplstyle
# Set black background default line colors to white.

lines.color: white
patch.edgecolor: white

text.color: white

axes.facecolor: black
axes.edgecolor: white
axes.labelcolor: white
axes.prop_cycle: cycler('color', ['8dd3c7', 'feffb3', 'bfbbd9', 'fa8174', '81b1d2', 'fdb462', 'b3de69', 'bc82bd', 'ccebc4', 'ffed6f'])

xtick.color: white
ytick.color: white

grid.color: white

figure.facecolor: black
figure.edgecolor: black

savefig.facecolor: black
savefig.edgecolor: black


```

見ての通り, それぞれの項目に色が割り振られてあるだけで, それほど難しくはない.
このファイルに登場するすべての`black`を別のもう少しマイルドな黒に置換すれば, 求めるスタイルシートになりそうだ.
カラーコード一覧を見て適当な色を選ぶ.
`2e2e2e`あたりがちょうど良さそうなので, このファイルをコピーし, すべての`black`を`2e2e2e`に置換したものを`darkgray_background.mplstyle`などのファイル名で同じフォルダに保存する.

```mplstyle:gray_background.mplstyle
# Set 2e2e2e background default line colors to white.

lines.color: white
patch.edgecolor: white

text.color: white

axes.facecolor: 2e2e2e
axes.edgecolor: white
axes.labelcolor: white
axes.prop_cycle: cycler('color', ['8dd3c7', 'feffb3', 'bfbbd9', 'fa8174', '81b1d2', 'fdb462', 'b3de69', 'bc82bd', 'ccebc4', 'ffed6f'])

xtick.color: white
ytick.color: white

grid.color: white

figure.facecolor: 2e2e2e
figure.edgecolor: 2e2e2e

savefig.facecolor: 2e2e2e
savefig.edgecolor: 2e2e2e


```

## 自作のスタイルを適用する

シェルを開きなおし, `plt.style.available`で確認すると, `darkgray_background`が新たに追加されている.
例のごとくサインカーブをプロットしてみる.

```python:
import numpy as np

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

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y)
```

![gray_sin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546214/59ff5997-3c18-dca1-8424-7c7f6a297f78.png "gray_sin.png")

これでだいぶグレーになった.

このように自作スタイルを適用したい場合も, 基本的にはプリセットのスタイルシートを参考に自分好みにマイナーチェンジしていけば, それほど労力はかからないだろう.