はじめに
jupyter notebookで画像を複数表示したい、さらにタイトルに各変数名を表示したいとなった。
変数名のタイトルの方はいつ使うねんという話はある(リスト名で与えるとできないので)
(思いつきで書いたものをそのまま貼り付けるので、もっといい方法はあるのかも。)
やりたかったこと
画像表示関数を作る。
それに引数として与えた変数名のリストから、変数名をタイトルとして表示する。
画像表示関数
jupyter notebookで複数の画像を1つずつplt.show()していては、画像を比較したいときに不便だったので、きれいに表示してくれる関数を作った。
% matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
#画像のリスト、列数、画像サイズ
def show_imgs(lis,col,size=15):
row = -(-len(lis)//col)
fig,ax = plt.subplots(row,col,figsize = (size,size))
if row == 1:
for i, img in enumerate(lis):
ax[i].imshow(img)
else:
for i, img in enumerate(lis):
j = i//col
k = i%col
ax[j][k].imshow(img)
plt.show()
タイトルを変数名にする
show_imgs([img1,img2,img3],3)
などと与えた時に、タイトルをimg1,img2,...という風に付ける。
titles = ["img1","img2","img3"]
というリストを用意したり、
dic = {"img1":img1,"img2":img2,"img3":img3}
という辞書を引数としてもいいが、コンパクトになるなら、という動機。
(注)引数群を文字列として取得するので、リストが変数で与えられているとできない。(実用性あるの?)
#画像のリスト、列数、画像サイズ、フォントサイズ
def show_imgs(lis,col,size=15,f=20):
#引数を取得
frame = inspect.currentframe()
stack = inspect.getouterframes(frame)
arg_names = stack[1].code_context[0].split('(')[1].split(')')[0] #type : str ex, ["img1","img2","img3"],arg1
vals = arg_names.split('[')[1].split(']')[0].split(',')
row = -(-len(lis)//col)
fig,ax = plt.subplots(row,col,figsize = (size,size))
if row == 1:
for i, img in enumerate(lis):
ax[i].set_title(vals[i],fontsize=f)
ax[i].imshow(img)
else:
for i, img in enumerate(lis):
j = i//col
k = i%col
ax[j][k].set_title(vals[i],fontsize=f)
ax[j][k].imshow(img)
plt.show()
stackは、以下のようなリストになっている。
[
FrameInfo(frame=, filename='', lineno=15, function='show_imgs', code_context=[' stack = inspect.getouterframes(frame)\n'], index=0),
FrameInfo(frame=, filename='', lineno=25, function='', code_context=['show_imgs(["img1","img2","img3"],arg1)\n'], index=0),
...
出力例
## おわりに
画像処理をしていて、処理を施しても微小な変化しかない時に並べて比較したかったので作りました。