2021年1月24日日曜日

Matplotlibで作成したグラフの一部を切り取る

Matplotlibで作成したグラフの一部だけ画像として切り取る方法を調べたのでまとめておく。


環境


Dockerコンテナ上のJupyter Lab(DockerコンテナでJupyterLab環境を作成する)。


グラフの作成

まずは切り取る対象のグラフとして散布図作成する。

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

np.random.seed(100)

N = 100
x = 0.9 * np.random.rand(N)
y = 0.9 * np.random.rand(N)
c = np.random.randint(1, 10, (N)) 
plt.scatter(x, y, marker='^', c=c)
plt.scatter(x, y, marker='o', c=c)

次のような散布図が作成される。











グラフの一部を切り取る

画像処理ライブラリPillowを使ってグラフを切り取る。Matplotlibで作成したグラフをPillowで画像として読み込んで、cropメソッドで切り取りを行う。cropメソッドで指定するのは切り取る長方形の左上右下の位置。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import io
from PIL import Image

# グラフ作成
N = 100
x = 0.9 * np.random.rand(N)
y = 0.9 * np.random.rand(N)
c = np.random.randint(1, 10, (N)) 
plt.scatter(x, y, marker='^', c=c)
plt.scatter(x, y, marker='o', c=c)

# グラフをpngとしてPillowで読み込む
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close()
buf.seek(0)
im = Image.open(buf)

# 画像サイズ確認
# (432, 288)
print(im.size)

# Pillowで読み込んだ画像を切り取り
# boxで切り取る長方形の左上右下の位置を指定
box = (60, 100, 380, 200)
im_cropped = im.crop(box)

buf.close()
display(im_cropped)

次のようにグラフが切り取られた。





0 件のコメント:

コメントを投稿