Matplotlib
基本 初期設定 スタイル レイアウト調整 線種・マーカー 色・カラーマップ 描画関連 ラベルと凡例
グラフ関連: ヒストグラム 散布図 棒グラフ その他のグラフ
subplot(複数グラフ) x軸共有y2軸表示 画像の表示 保存 日本語表示 その他
基本
・基本
初期設定
スタイル
レイアウト調整
・シンプル
線種・マーカー
・線種・線幅
色・カラーマップ
・色名とコード
描画関連
・直線
ラベルと凡例
・ラベルと凡例
ヒストグラム
・ヒストグラム
散布図
・散布図
棒グラフ
・通常
その他のグラフ
・箱ひげ図
subplot(複数グラフ)
・subplot(複数グラフ)
x軸共有y2軸表示
・twinx
画像の表示
・画像の表示
保存
・保存
日本語表示
・日本語表示
その他
・対数軸
基本 初期設定 スタイル レイアウト調整 線種・マーカー 色・カラーマップ 描画関連 ラベルと凡例
グラフ関連: ヒストグラム 散布図 棒グラフ その他のグラフ
subplot(複数グラフ) x軸共有y2軸表示 画像の表示 保存 日本語表示 その他
基本
・基本
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# サイズ調整
plt.figure(figsize=(8,5))
plt.plot(x, y)
# 通常
# plt.show()
# グリッド線(ls:line style, alpha:透明度)
plt.grid(ls=':', alpha=0.5)
基本に戻る
初期設定
rcParams(外部リンク):https://matplotlib.org/stable/api/matplotlib_configuration_api.html#default-values-and-styling
・初期設定import matplotlib as mpl
import matplotlib.pyplot as plt
# グラフサイズ
print(mpl.rcParams['figure.figsize'])
print(plt.rcParams["figure.figsize"])
初期設定に戻る
スタイル
・スタイル
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
y = np.arange(10)
print('使えるスタイル')
print(plt.style.available, '\n')
print('dark_background')
plt.style.use('dark_background')
plt.plot(x, y)
plt.show()
スタイルに戻る
レイアウト調整
・シンプル
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# サイズ
plt.figure(figsize=(5,3))
# プロット、凡例用ラベル
plt.plot(x, y, label='y')
plt.plot(x, y**2, label='y**2')
# タイトル、軸ラベル
plt.title('title')
plt.xlabel('x')
plt.ylabel('y')
# 目盛り表示に角度つける
plt.xticks(rotation=30)
# 目盛りの非表示
# plt.xticks([])
# 凡例表示
plt.legend()
plt.show()
レイアウト調整に戻る
・詳細tick_params(外部リンク):https://matplotlib.org/3.5.0/api/_as_gen/matplotlib.axes.Axes.tick_params.html#matplotlib.axes.Axes.tick_params
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# サイズ
fig = plt.figure(figsize=(5,3))
# 始点座標(x,y), 幅(0-1-), 高さ(0-1-)
ax = fig.add_axes([0,0,1,1])
ax.plot(x, y)
# 目盛り設定
ax.set_xticks(list(x))
# 間引き表示
for i, label in enumerate(ax.get_xticklabels()):
if i%3 == 0:
continue
label.set_visible(False)
# タイトル、軸ラベル
ax.set_title('title')
ax.set_xlabel('x')
ax.set_ylabel('y')
# 目盛りラベル角度
ax.tick_params(axis='x', labelrotation=30)
# グラフ追加(始点座標x,y, 幅, 高さ)
ax2 = fig.add_axes([0.1,0.6,0.3,0.3])
ax2.plot(x, y**2)
# タイトル、軸ラベル
ax2.set_title('sub_title')
ax2.set_xlabel('sub_x')
ax2.set_ylabel('sub_y')
# 目盛りの非表示
ax2.get_xaxis().set_ticks([])
# 目盛り・軸ラベルの非表示
# ax2.get_xaxis().set_visible(False)
plt.show()
レイアウト調整に戻る
線種・マーカー
・線種・線幅
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
plt.plot(x, y)
# 線種、線幅調整
plt.plot(x, y*0.9, ls='--', lw=2)
plt.plot(x, y*0.8, ls=':', lw=4)
plt.plot(x, y*0.7, ls='-.', lw=6)
plt.show()
線種・マーカーに戻る
・マーカーmarkers(外部リンク):https://matplotlib.org/stable/api/markers_api.html
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
print('ms default:', mpl.rcParams['boxplot.flierprops.markersize'])
plt.plot(x, y, marker='.')
plt.plot(x, y*0.9, marker='o', ms=8)
plt.plot(x, y*0.8, marker='^', ms=10)
plt.plot(x, y*0.7, marker='s', ms=12)
plt.show()
線種・マーカーに戻る
色・カラーマップ
・色名とコード
色名(外部リンク):https://matplotlib.org/stable/gallery/color/named_colors.html
import matplotlib as mpl
# 色名と16進数カラーコード
print(mpl.colors.cnames)
色・カラーマップに戻る
・色の指定import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# カラーストリング
# b:青, g:緑, r:赤, c:シアン, m:マゼンタ, y:黄, k:黒, w:白
plt.plot(x, y, color='y')
# 色名
plt.plot(x, y, color='yellow')
# 16進数カラーコード(RGB)
plt.plot(x, y, color='#ff0')
plt.plot(x, y, color='#ffff00')
plt.show()
色・カラーマップに戻る
・カラーマップカラーマップ(外部リンク):https://matplotlib.org/stable/tutorials/colors/colormaps.html#sequential
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# カラーマップ
plt.set_cmap(plt.cm.spring)
plt.scatter(x, y, c=y, s=50)
# カラーバー
plt.colorbar()
plt.show()
色・カラーマップに戻る
描画関連
・直線
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
plt.plot(x, y)
# 横線
# y
plt.axhline(1)
# 範囲指定
# [xmin,xmax], [ymin,ymax]
plt.plot([0,9], [5,5])
# y, xmin, xmax
plt.hlines(8, 3, 5)
# 縦線
# x
plt.axvline(3)
# 範囲指定
# [xmin,xmax], [ymin,ymax]
plt.plot([7,7], [0,5])
# x, ymin, ymax
plt.vlines(5, 2, 4)
plt.show()
描画関連に戻る
・テキストpyplot.text(外部リンク):https://matplotlib.org/3.5.0/api/_as_gen/matplotlib.pyplot.text.html
import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
text = 'text'
plt.figure()
plt.plot(x, y)
# データの数値で指定
plt.title('データの数値で指定')
plt.text(1, 8, text, fontsize=16, color='yellow')
plt.show()
print()
fig, ax = plt.subplots()
ax.plot(x, y)
# 座標比率で指定(0-1-)
ax.set_title('座標比率で指定')
ax.text(0.5, 0.5, text, fontsize=20, color='yellow',
transform=ax.transAxes)
plt.show()
描画関連に戻る
ラベルと凡例
・ラベルと凡例
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
# lebel引数は凡例ラベル
plt.plot(x, y, label='y')
plt.plot(x, y**2, label='y**2')
# 軸ラベル
plt.xlabel('xlabel')
plt.ylabel('ylabel')
# 指定なし(default='best')
# plt.legend()
# 数値で指定
# 0:最良, 1:右上(default), 2:左上, 3:左下, 4:右下, 5:右,
# 6:左中, 7:右中, 8:中下, 9:中上, 10:中央
# plt.legend(loc=1)
# 座標で指定
plt.legend(loc=(1.05, 0.8))
plt.show()
ラベルと凡例に戻る
ヒストグラム
・ヒストグラム
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.random.randn(10000)
# ec: edge color
plt.hist(x, bins=50, ec='b');
ヒストグラムに戻る
散布図
・散布図
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
# loc:平均, scale:標準偏差, size:数
x = np.random.normal(1, 1, 100)
y = np.random.normal(1, 1, 100)
# colorbar用データ
c = np.arange(100)
# バブル用データ(size)
b = np.random.rand(100)*100
plt.scatter(x, y, c=c, s=b, cmap='spring')
plt.colorbar();
散布図に戻る
棒グラフ
・通常
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = [1,2,3,4]
y = [4,2,6,3]
fig, ax = plt.subplots(1,2, figsize=(10,4))
ax[0].bar(x, y)
ax[0].set_title('bar')
ax[1].barh(x, y)
ax[1].set_title('barh');
棒グラフに戻る
・複数グループimport matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = [1,2]
y1, y2, y3 = [1,2], [2,4], [3,6]
# 表示幅
w = 0.3
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
# x軸の値をwずらして並べて表示させる
ax.bar(np.array(x)-w, y1, width=w, label='y1')
ax.bar(x, y2, width=w, label='y2')
ax.bar(np.array(x)+w, y3, width=w, label='y3')
ax.set_xticks([1,1,1,2,2,2])
plt.legend();
棒グラフに戻る
・積み上げimport matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(5)
y1, y2, y3 = np.random.rand(15).reshape((3,5))
plt.bar(x, y1, label='y1')
plt.bar(x, y2, bottom=y1, label='y2')
plt.bar(x, y3, bottom=y1+y2, label='y3')
plt.legend();
棒グラフに戻る
その他のグラフ
・箱ひげ図
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
plt.boxplot([x, y], labels=['x', 'y']);
その他のグラフに戻る
・円グラフimport matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
rate_list = [0.5, 0.3, 0.1, 0.1]
labels = ['A', 'B', 'C', 'D']
plt.pie(rate_list, labels=labels);
その他のグラフに戻る
subplot(複数グラフ)
・subplot(複数グラフ)
import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
fig, ax = plt.subplots(1,2, figsize=(10,5))
ax[0].plot(x, y)
ax[1].plot(x, y)
fig.suptitle('全体のタイトル')
plt.show()
print()
# 複数行(subplots)
fig, ax = plt.subplots(2,2, figsize=(10,5))
ax[0,0].plot(x, y)
ax[0,1].plot(x, y)
ax[1,0].plot(x, y**2)
ax[1,1].plot(x, y**2)
# 余白調整
# left-top: 全体としての位置
# wspace, hspace: 個々のグラフ間余白
# 初期値確認
# import matplotlib as mpl; mpl.rcParams["figure.subplot.left"]
# fig.subplots_adjust(left=0.125, right=0.9, bottom=0.125, top=0.88,
# wspace=0.2, hspace=0.2)
fig.suptitle('複数行(subplots)')
plt.show()
print()
# add_subplot
fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax1.plot(x, y**2)
ax2 = fig.add_subplot(122)
ax2.plot(x, y**2)
fig.suptitle('add_subplot')
plt.show()
print()
# subplot
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.plot(x, y**0.5)
plt.subplot(1,2,2)
plt.plot(x, y**0.5)
plt.suptitle('subplot')
plt.show()
subplot(複数グラフ)に戻る
x軸共有y2軸表示
・twinx
import numpy as np
from matplotlib.image import imread
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
fig, ax1 = plt.subplots()
l1, = ax1.plot(x, y, c='lightblue', label='y')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax2 = ax1.twinx()
l2, = ax2.plot(y**2, c='pink', label='y**2')
ax2.set_ylabel('y**2')
ax1.legend(handles=[l1, l2])
plt.show()
x軸共有y2軸表示に戻る
・pandasimport matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('dark_background')
df = pd.DataFrame({'x': np.arange(10),
'y': np.arange(10),
'y**2': np.arange(10)**2})
df.plot(x='x', secondary_y='y**2');
x軸共有y2軸表示に戻る
画像の表示
・画像の表示
import numpy as np
from matplotlib.image import imread
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
plt.plot(x, y**2)
plt.savefig('test.png')
plt.close()
img = imread('test.png')
plt.axis('off')
plt.imshow(img)
# 並べて表示
plt.figure(figsize=(10,3))
for i in range(10):
plt.subplot(2, 5, i+1)
# img[i]などで画像を変更可
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.tight_layout()
画像の表示に戻る
保存
・保存
import numpy as np
from matplotlib.image import imread
import matplotlib.pyplot as plt
plt.style.use('dark_background')
x = np.arange(10)
y = np.arange(10)
plt.plot(x, y**2)
# dpi(dot per inch): 1インチあたりの解像度
plt.savefig('test.png', dpi=100)
# レイアウト調整
plt.close()
img = imread('test.png')
plt.imshow(img)
plt.axis('off')
plt.show()
画像の表示に戻る
日本語表示
・日本語表示
import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
plt.title('日本語表示')
plt.text(0.5, 0.5, 'にほんご', fontsize=20, ha='center')
plt.show()
日本語表示に戻る
その他
・対数軸
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('dark_background')
x = np.arange(10)
y = 10**x
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_yscale('log')
plt.show()
その他に戻る
・塗りつぶすimport matplotlib.pyplot as plt
plt.style.use('dark_background')
# x, y1, y2(y1とy2の間を塗りつぶす)
plt.fill_between([1,2,3], [2,4,6], [0,0,0])
plt.show()
その他に戻る
・gridspec(柔軟レイアウト)# gridspec: 複数グラフを場所・範囲を指定して表示
import japanize_matplotlib
import matplotlib.gridspec as gridspec
import numpy as np
x = np.arange(10)
y = np.arange(10)
# サンプル1
fig = plt.figure()
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :2])
ax2 = plt.subplot(gs[1:, :2])
ax3 = plt.subplot(gs[:, 2:])
ax1.plot(x, y)
ax2.plot(x, y**2)
ax3.plot(x, y**0.5)
fig.suptitle('サンプル1')
fig.tight_layout()
plt.show()
print()
# サンプル2
fig = plt.figure()
gs = gridspec.GridSpec(2, 3, height_ratios=[4,1], width_ratios=[2,4,2])
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1])
ax3 = fig.add_subplot(gs[2])
ax4 = fig.add_subplot(gs[3])
ax5 = fig.add_subplot(gs[4])
ax6 = fig.add_subplot(gs[5])
ax1.plot(x,y)
ax2.plot(x,y**2)
ax3.plot(x,y**3)
ax4.plot(x,y**0.5)
ax5.plot(x,y*2)
ax6.plot(x,y*0.5)
fig.suptitle('サンプル2')
fig.tight_layout()
その他に戻る