[matplotlib] 軸を中央に配置する / 軸を好きな位置に配置する

# サンプル図
こんな感じの図を作りたかった.
(この図のソースコードを見たい方はページ最下部へ)
![vector_orthogonal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264254/73b97f25-4930-04c9-7fe4-59c7b8588534.png)


# コード
Axes内のspinesのメソッド`set_position`を利用して, 軸を移動する.
また, Axes内のspinesの`set_visible`を利用して軸を消す.

```python
from matplotlib import pyplot as plt

if __name__ == '__main__':
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    # 下軸と左軸をそれぞれ中央へもってくる
    ax.spines['bottom'].set_position(('data', 0))
    ax.spines['left'].set_position(('data', 0))

    # 上軸と右軸を表示しない
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)
```

# spinesのset_position()に関して
このメソッドは1つのタブル`position`を渡す必要があります.

```python
set_position(position)
```
`position`は以下の二つの内容からなっています.
* `position type` … 配置の指定方法を`'outward'`/`'axes'`/`'data'`の3つから選びます.
* `amount` … 位置を数値で具体的に決めます. 数値の置き方は`position type`によって異なります.

|`position type`|概要|
|:--:|:--|
|`'outward'`| 外枠の位置から**どれだけ外側へいくか**で位置を指定する. <br>`amount`が負なら内側へ |
|`'axes'`|軸の位置を**割合**で指定する.($0\leq $`amount`$ \leq 1$) <br> `amount`=0.3なら左から/下から30%の位置に軸が置かれます.|
|`'data'`| 利用している**データの値**で軸の位置を指定する. <br> `amount`=2ならその軸が2の位置へ置かれる. |

以下にそれぞれを利用したプログラムと出力図をのせます.

## `'outward'`

```python
ax.spines['bottom'].set_position(('outward', 20))
ax.spines['left'].set_position(('outward', -20))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
```

![set_position_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264254/f202910e-2e37-3137-7377-70724ab315d3.png)

下軸が最初の位置から**外側**へ, 左軸が**内側**へ移動しているのがわかります.

## `'axes'`

```python
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.2))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
```

![set_position_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264254/8e60d175-867b-2bdf-34f7-478177950a1b.png)

下軸が50%上の位置に, 左軸が20%右の位置へずれています.

## `'data'`

```python
ax.spines['bottom'].set_position(('data', 2))
ax.spines['left'].set_position(('data', -3))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
```

![set_position_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264254/7fd304b0-792b-41b4-834d-f71384ee2cb6.png)

下軸がy軸方向の`2`の位置に, 左軸がx軸方向の`-3`の位置に移動しています.

## その他
特殊な引数として`'center'`と`'zero'`も利用できます.
これらは下記のように省略版となっています.

|引数|実際の意味|
|:-:|:-:|
|`'center'`|('axes', 0.5)|
|`'zero'`|('data', 0.0) |

以下のようなコードで実行した時の図も載せておきます.

```python
ax.spines['bottom'].set_position('center')
ax.spines['left'].set_position('center')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
```

```python
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
```

![set_position_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264254/6cf16998-0bc3-0aae-131f-3aef3a752227.png)


# おまけ
冒頭の図のソースコードをのせておきます.

```python
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
import os
import re


def main():
    font = {"family": "IPAexGothic"}
    mpl.rc('font', **font)

    point_list = [
        {'p': [2, 1], 'name': 'A', 'c': 'red'},
        {'p': [-1, 2], 'name': 'B', 'c': 'blue'},
    ]

    fig = plt.figure()
    ax = fig.add_subplot(111)

    for p in point_list:
        ax.annotate(s=p['name'], xy=[0, 0], xytext=p['p'], fontsize=13,
                    arrowprops=dict(arrowstyle='<-',
                                    connectionstyle='arc3',
                                    facecolor=p['c'], edgecolor=p['c'])
                    )

    lim = [-4, 4]

    ax.set_xlim(lim)
    ax.set_ylim(lim)

    ax.grid()

    ax.spines['bottom'].set_position('center')
    ax.spines['left'].set_position('center')
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)

    for label in ax.get_xticklabels() + ax.get_yticklabels():
        label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.6))

    plt.savefig(re.sub(".py", "", os.path.basename(__file__))+".png")


if __name__ == '__main__':
    main()
```