Matplotlib関連

頻繁にグラフを描画する場合のメモリー消費を抑える

import matplotlib
matplotlib.interactive(False)

グラフ間の描画領域を調整する

import matplotlib.pyplot as plt
plt.figure()

#それぞれ0.0~1.0の実数で指定
#left   : 描画領域左端
#right  : 描画領域右端
#bottom : 描画領域下端
#top    : 描画領域上端
plt.subplots_adjust(left=left, right=right, bottom=bottom, top=top)

任意のカラーマップを作成する

from matplotlib.colors import LinearSegmentedColormap
import cv2
import numpy as np

### main ###
#各列はR,G,Bの順, alpha値を使用する場合は列を追加
#0~1の値で指定
color_table =  [(1.0,0.0,0.0),
                (0.0,1.0,0.0),
                (0.0,0.0,1.0)]
color_list = []
n= len(color_table)

#0~1の値でcolor_tableの色を対応させる
#等間隔であればfor文が便利
for i in range(n):
    color_list.append((i/(n - 1), color_table[i]))
colormap = LinearSegmentedColormap.from_list("any_name", color_list)


### for sample ###
row = 100
col = 300
img = np.full((row,col,3),0,dtype=np.uint8)
for i in range(col):
    img[:,i,:] = np.array(colormap(i/(col-1))[:3])*255
img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
cv2.imwrite("sample.png",img)

実行結果

参考文献

pythonとかいろいろ>matplotlibのカラーマップ

OpenCVを使った動画生成

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

fourcc = cv2.VideoWriter_fourcc(*"h264")
video  = cv2.VideoWriter("sample.mp4", fourcc, 30.0, (800, 450))

fig = plt.figure(figsize=(8, 4.5),dpi=100)
plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0)

t = np.linspace(0, 10*np.pi, 10000)
for i in range(301):
    r = np.sin(i*t/300)
    plt.plot(r*np.cos(t), r*np.sin(t))
            
    plt.xlim(-1.6/0.9, 1.6/0.9)
    plt.ylim(-1.0, 1.0)
    
    fig.canvas.draw()
    image_array = np.array(fig.canvas.renderer.buffer_rgba())
    img = cv2.cvtColor(image_array, cv2.COLOR_RGBA2BGR)
    video.write(img)
    plt.gca().clear()

plt.close()
video.release()

参考文献 matplotlib : Agg Buffer To Array