Matplotlib Tips - 基本プロット編 -

ここでは[Matplotlib](https://matplotlib.org/)の基本的なプロットの部品をまとめていきます。
基本的な項目としては、日本語表示、図枠、図の配置、軸、目盛り、マーカーとライン、凡例あたりかなと思います。（Matplotlibにはたくさんの機能がありますが、まずはこのあたりが自由自在に作れるのが基本と思います。）
解説については、冒頭に挙げた参考ページに詳しく書いてあります。また、各項目にもリンクを貼ってあります。項目ごとのリンク集としても使えるかなと思います。

まだ途中ですが、随時更新していきます。

動作確認：Python 3.7.9､Matplotlib 3.3.1

# よく参考にするページ
 - [グラフの基本構造 -Anatomy of a figure-(本家サイトより)](https://matplotlib.org/gallery/showcase/anatomy.html#sphx-glr-gallery-showcase-anatomy-py)  
 - [matplotlib/cheatsheets](https://github.com/matplotlib/cheatsheets)
 - [Python♪提出資料で使えるmatplotlibグラフ書式例1](https://snowtree-injune.com/2020/02/02/matplotlib-example1-py001/)
 - [Python♪提出資料で使えるmatplotlibグラフ書式例2](https://snowtree-injune.com/2020/05/16/matplotlib-example2-py004/)
 - [Python matplotlib 説明図を書いてみる（改訂版）](https://qiita.com/damyarou/items/eafcf27aa1a7852d32e9) 
 - [matplotlibのめっちゃまとめ](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51)

# 日本語表示
- [matplotlibで日本語](https://qiita.com/yniji/items/3fac25c2ffa316990d0c)
- [Matplotlib が PC で追加のフォントをインストールしなくても日本語を表示できるようになった] (https://blank-oldstranger.com/2018/11/08/matplotlib-japanese/)
- [参考：フォントについて](https://tsutawarudesign.com/yomiyasuku3.html)


 ```python
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

# 日本語の使用
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Meirio', 'Hiragino Maru Gothic Pro', 'Yu Gothic', 
                               'Takao', 'IPAexGothic', 'IPAPGothic', 
                               'VL PGothic', 'Noto Sans CJK JP']
```

# 色の設定
- [List of named colors](https://matplotlib.org/stable/gallery/color/named_colors.html#sphx-glr-gallery-color-named-colors-py)
- [matplotlib 色一覧の作成](https://qiita.com/damyarou/items/f8af87a62681161afce5)
- [matplotlib で指定可能な色の名前と一覧](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)


- 『Python Data Science Handbook』（英語の無料オンライン版あり）


# 目盛（Major Ticks､ Minor Ticks）のカスタマイズ
-[『Python Data Science Handbook』（英語の無料オンライン版あり）](https://note.nkmk.me/book-python-data-science-handbook/) ｢4.12 目盛のカスタマイズ｣

## 目盛（Tick Locator）の設定
-[Tick locators(matplotlib.orgより)](https://matplotlib.org/stable/gallery/ticks_and_spines/tick-locators.html)

>![tick-locators.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/be0147fc-afb1-c6cd-9f2d-540e2271d386.png)




 ```python
#https://matplotlib.org/stable/gallery/ticks_and_spines/tick-locators.htmlを編集

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

#日本語fontの設定
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Meirio', 'Hiragino Maru Gothic Pro', 'Yu Gothic', 
                               'Takao', 'IPAexGothic', 'IPAPGothic', 
                               'VL PGothic', 'Noto Sans CJK JP']


def setup(ax, title):
    """Set up common parameters for the Axes in the example."""
    # only show the bottom spine
    ax.yaxis.set_major_locator(ticker.NullLocator())
    ax.spines['right'].set_color('none') #ver.3.4.1では、ax.spines.right.set_color('none')
    ax.spines['left'].set_color('none') #ver.3.4.1では、ax.spines.left.set_color('none')
    ax.spines['top'].set_color('none') #ver.3.4.1では、ax.spines.top.set_color('none')

    ax.xaxis.set_ticks_position('bottom')
    ax.tick_params(which='major', width=1.00, length=5)
    ax.tick_params(which='minor', width=0.75, length=2.5)
    ax.set_xlim(0, 5)
    ax.set_ylim(0, 1)
    ax.text(0.0, 0.2, title, transform=ax.transAxes,
            fontsize=14, color='tab:blue')


fig, axs = plt.subplots(8, 1, figsize=(8, 6))

# Null Locator
setup(axs[0], title="NullLocator() 目盛の非表示")
axs[0].xaxis.set_major_locator(ticker.NullLocator())
axs[0].xaxis.set_minor_locator(ticker.NullLocator())

# Multiple Locator
setup(axs[1], title="MultipleLocator(0.5)  倍数目盛")
axs[1].xaxis.set_major_locator(ticker.MultipleLocator(0.5))
axs[1].xaxis.set_minor_locator(ticker.MultipleLocator(0.1))

# Fixed Locator
setup(axs[2], title="FixedLocator([0, 1, 5]) リストで固定された目盛")
axs[2].xaxis.set_major_locator(ticker.FixedLocator([0, 1, 5]))
axs[2].xaxis.set_minor_locator(ticker.FixedLocator(np.linspace(0.2, 0.8, 4)))

# Linear Locator
setup(axs[3], title="LinearLocator(numticks=3)  minからmaxまで等間隔の目盛")
axs[3].xaxis.set_major_locator(ticker.LinearLocator(3))
axs[3].xaxis.set_minor_locator(ticker.LinearLocator(31))

# Index Locator
setup(axs[4], title="IndexLocator(base=0.5, offset=0.25)  indexをもつ目盛")
axs[4].plot(range(0, 5), [0]*5, color='white')
axs[4].xaxis.set_major_locator(ticker.IndexLocator(base=0.5, offset=0.25))

# MaxN Locator
setup(axs[5], title="MaxNLocator(n=4)  最大値に適切に割り振られた目盛")
axs[5].xaxis.set_major_locator(ticker.MaxNLocator(4))
axs[5].xaxis.set_minor_locator(ticker.MaxNLocator(40))

# Auto Locator
setup(axs[6], title="AutoLocator() MaxNLocatorと単純なデフォルト値")
axs[6].xaxis.set_major_locator(ticker.AutoLocator())
axs[6].xaxis.set_minor_locator(ticker.AutoMinorLocator())

# Log Locator
setup(axs[7], title="LogLocator(base=10, numticks=15) minからmaxまでの対数目盛")
axs[7].set_xlim(10**3, 10**10)
axs[7].set_xscale('log')
axs[7].xaxis.set_major_locator(ticker.LogLocator(base=10, numticks=15))

plt.savefig("tick-locators.png")

plt.tight_layout()
plt.show()
 ```

## 目盛フォーマット（Tick Formatters）の設定
- [Tick formatters(matplotlib.orgより)](https://matplotlib.org/stable/gallery/ticks_and_spines/tick-formatters.html?highlight=tick%20format)

>![tick-formatter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/829923b3-154e-8644-4f48-7ca820502f98.png)
![tick-formatter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/39b94670-ae84-d955-dcda-f5332addba97.png)




 ```python
# https://matplotlib.org/stable/gallery/ticks_and_spines/tick-formatters.html?highlight=tick%20formatを編集
import matplotlib.pyplot as plt
from matplotlib import ticker

#日本語fontの設定
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Meirio', 'Hiragino Maru Gothic Pro', 'Yu Gothic', 
                               'Takao', 'IPAexGothic', 'IPAPGothic', 
                               'VL PGothic', 'Noto Sans CJK JP']

def setup(ax, title):
    """Set up common parameters for the Axes in the example."""
    # only show the bottom spine
    ax.yaxis.set_major_locator(ticker.NullLocator())
    ax.spines['right'].set_color('none') #ver.3.4.1では、ax.spines.right.set_color('none')
    ax.spines['left'].set_color('none') #ver.3.4.1では、ax.spines.left.set_color('none')
    ax.spines['top'].set_color('none') #ver.3.4.1では、ax.spines.top.set_color('none')

    # define tick positions
    ax.xaxis.set_major_locator(ticker.MultipleLocator(1.00))
    ax.xaxis.set_minor_locator(ticker.MultipleLocator(0.25))

    ax.xaxis.set_ticks_position('bottom')
    ax.tick_params(which='major', width=1.00, length=5)
    ax.tick_params(which='minor', width=0.75, length=2.5, labelsize=10)
    ax.set_xlim(0, 5)
    ax.set_ylim(0, 1)
    ax.text(0.0, 0.2, title, transform=ax.transAxes,
            fontsize=14, color='tab:blue')


# Tick formatters can be set in one of two ways, either by passing a ``str``
# or function to `~.Axis.set_major_formatter` or `~.Axis.set_minor_formatter`,
# or by creating an instance of one of the various `~.ticker.Formatter` classes
# and providing that to `~.Axis.set_major_formatter` or
# `~.Axis.set_minor_formatter`.

# The first two examples directly pass a ``str`` or function.

fig0, axs0 = plt.subplots(2, 1, figsize=(8, 2))
fig0.suptitle('Simple Formatting')

# A ``str``, using format string function syntax, can be used directly as a
# formatter.  The variable ``x`` is the tick value and the variable ``pos`` is
# tick position.  This creates a StrMethodFormatter automatically.
setup(axs0[0], title="'{x} km'")
axs0[0].xaxis.set_major_formatter('{x} km')

# A function can also be used directly as a formatter. The function must take
# two arguments: ``x`` for the tick value and ``pos`` for the tick position,
# and must return a ``str``  This creates a FuncFormatter automatically.
setup(axs0[1], title="lambda x, pos: str(x-5)")
axs0[1].xaxis.set_major_formatter(lambda x, pos: str(x-5))

fig0.tight_layout()
plt.savefig("tick-formatter1.png", bbox_inches='tight', pad_inches=0.1)

# The remaining examples use Formatter objects.

fig1, axs1 = plt.subplots(7, 1, figsize=(8, 6))
fig1.suptitle('Formatter Object Formatting')

# Null formatter
setup(axs1[0], title="NullFormatter() 目盛を表示しない")
axs1[0].xaxis.set_major_formatter(ticker.NullFormatter())

# StrMethod formatter
setup(axs1[1], title="StrMethodFormatter('{x:.3f}') フォーマットを指定")
axs1[1].xaxis.set_major_formatter(ticker.StrMethodFormatter("{x:.3f}"))

# FuncFormatter can be used as a decorator
@ticker.FuncFormatter
def major_formatter(x, pos):
    return f'[{x:.2f}]'

setup(axs1[2], title='FuncFormatter("[{:.2f}]".format 表示するラベルを返すユーザ定義関数を使用')
axs1[2].xaxis.set_major_formatter(major_formatter)

# Fixed formatter
setup(axs1[3], title="FixedFormatter(['A', 'B', 'C', ...]) 指定したラベルを表示")
# FixedFormatter should only be used together with FixedLocator.
# Otherwise, one cannot be sure where the labels will end up.
positions = [0, 1, 2, 3, 4, 5]
labels = ['A', 'B', 'C', 'D', 'E', 'F']
axs1[3].xaxis.set_major_locator(ticker.FixedLocator(positions))
axs1[3].xaxis.set_major_formatter(ticker.FixedFormatter(labels))

# Scalar formatter
setup(axs1[4], title="ScalarFormatter() スカラー値（デフォルト）")
axs1[4].xaxis.set_major_formatter(ticker.ScalarFormatter(useMathText=True))

# FormatStr formatter
setup(axs1[5], title="FormatStrFormatter('#%d') 各ラベルに指定したらフォーマットの文字列を使用")
axs1[5].xaxis.set_major_formatter(ticker.FormatStrFormatter("#%d"))

# Percent formatter
setup(axs1[6], title="PercentFormatter(xmax=5) パーセント表示 (目盛の最大値/xmax)×100")
axs1[6].xaxis.set_major_formatter(ticker.PercentFormatter(xmax=5))

fig1.tight_layout()
plt.savefig("tick-formatter2.png", bbox_inches='tight', pad_inches=0.1)

#plt.show()
 ```


# LineとMarkerのパターン
- [matplotlib.axes.Axes.plot](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.plot.html?highlight=plot)
- [8.スタイルの設定に関して（matplotlibのめっちゃまとめ より）](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#8-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6)
- [Markers(matplotlib/cheatsheetsより)](https://github.com/matplotlib/cheatsheets/blob/master/scripts/markers.py)
- [Lines(matplotlib/cheatsheetsより)](https://github.com/matplotlib/cheatsheets/blob/master/scripts/line.py)

>![MarkerandLines.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/8d8aa4df-bc17-c63d-6f77-69a42966d227.png)

 ```python
fig = plt.figure(figsize=(20,3))
ax = fig.add_subplot(111, xlim=(-1, 40), ylim=(0.05, 0.2), frameon=False, xticks=[], yticks=[])

# Lineをプロット
ls_list = ['-','--', ':', '-.']

for i, ls in enumerate(ls_list):
    text = "'%s'" % ls
    ax.text(10*i+4, 0.17, text, size=30, va='center')
    ax.plot([10*i+2, 10*i+7], [0.15, 0.15], ls, color='black', linewidth=2)
ax.text(-1, 0.16, 'Lines', size=20, ha='left');

# Markerをプロット
m_list = ['.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4', '8', 's',
          'p', '*', 'h', 'H', '+', 'P', 'x', 'X', 'D', 'd', '|', '_',
          0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, '']

for i, m in enumerate(m_list):
    ax.plot(i+3, 0.1, c='gainsboro',
            marker=m, ms=15, mfc='lightsteelblue', mew=1.5, mec='royalblue')
    ax.text(i+3, 0.12, m, size=20, ha='center')
ax.text(-1, 0.12, 'Markers', size=20, ha='left')

fig.savefig('MarkerandLines.png')
```






# シンプルなプロット(パターン1)
```python
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator, MultipleLocator
import numpy as np

#日本語fontの設定
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Meirio', 'Hiragino Maru Gothic Pro', 'Yu Gothic', 
                               'Takao', 'IPAexGothic', 'IPAPGothic', 
                               'VL PGothic', 'Noto Sans CJK JP']
%matplotlib inline


# データの作成
x = np.linspace(0, 20, 1000)
y1 = 0.8 * np.sin(x)
y2 = 0.8 * np.cos(x)


# 作図パラメータの設定
figsize = (10, 5)  #図のプロットサイズ
hspace, wspace = 0.4, 0.4  #プロットの間隔(サブプロットの幅と高さに対する比率(0.2→20%))

xmin, xmax, dx = 0, 20, 1.0 # lower limit, upper limit and increment of of axis
ymin, ymax, dy = -1, 1, 0.2 

nAutoMinorLoc_x, nAutoMinorLoc_y = 4, 4  # Number of AutoMinorLocator
 
title = 'Fig. Sample1'
xlabel, ylabel = 'x軸 [単位]', 'y axis [Unit]'


# 作図
fig = plt.figure(figsize=figsize)
fig.subplots_adjust(hspace=hspace, wspace=wspace)

ax = fig.add_subplot(1, 1, 1)
ax.plot(x, y1, linewidth=2, color='royalblue', label="sin x")
ax.plot(x, y2, '--', linewidth=1, color='orangered', label="cos x")
ax.plot(x[100], y1[100], 'o', markersize=10, markeredgecolor='navy', 
        markeredgewidth=2.0, markerfacecolor='0.8', label='')

# 図のタイトル
ax.set_title(title, fontsize=20)

# 軸の設定
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))

ax.set_xlabel(xlabel, fontsize=12)
ax.set_ylabel(ylabel, fontsize=12)

ax.xaxis.set_major_locator(MultipleLocator(dx)) #指定した数の倍数に主目盛りが設定される
ax.xaxis.set_minor_locator(AutoMinorLocator(nAutoMinorLoc_x))
ax.yaxis.set_major_locator(MultipleLocator(dy))
ax.yaxis.set_minor_locator(AutoMinorLocator(nAutoMinorLoc_y))

ax.tick_params(which='both', direction='in', width=1.0, labelsize=12, labelcolor='black')
ax.tick_params(which='major', length=6)
ax.tick_params(which='minor', length=3);

ax.grid(which='major', axis='both', linestyle="-", linewidth=0.5, color='0.5') #, zorder=-10

# y=0のラインの追加
ax.axhline(0, 0, 1, linestyle="-", linewidth=1, color='black')


# 凡例の設定
ax.legend(bbox_to_anchor=(1.01, 1), loc='upper left', borderaxespad=0, fontsize=12)

# 図の出力
fig.savefig("case1.jpg", bbox_inches='tight', pad_inches=0.1, dpi=200);

```
>![case1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201444/6465db36-2a79-d85b-6937-6659a8f7d39f.jpeg)


以下、更新中