KNIMEとか倉庫

KNIMEやEXCELなどの備忘録です。

【Python】散布図に矢印で画像を表示したい。

・お題:散布図を描いたところ、画像をデータとして反映させたくなった。矢印で散布図に対応する画像を表示させたい。

 

・画像はIcooonmonoから拝借した。png画像として落とし、ワーキングディレクトリに保存した。

icooon-mono.com

・画像情報を矢印で追加するのは、matplotlibの機能で見つかったので、これを参考に設定したい。

matplotlib.org

・とりあえず、プロットするならこんな感じ。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

fig, ax = plt.subplots()

#エビ画像
# ポジション設定
xy = (1, 2)
ax.plot(xy[0], xy[1], ".r")#".r"を付けないと、プロットされないっぽい。

・画像を読み込む

arr_img = plt.imread("エビ.png", format='png')

・ちなみに、読み込んだ画像を確認するとこんな感じ。

fig, ax = plt.subplots()
ax.imshow(arr_img)
plt.show()

・次に、OffsetImageで、画像を格納

imagebox = OffsetImage(arr_img, zoom=0.2)

・次に、矢印で示すオブジェクトを作成して、グラフに追加する。

ab = AnnotationBbox(imagebox, xy=(0,0),
                    xybox=(50, -50),
                    xycoords='data',
                    boxcoords="offset points",
                    arrowprops=dict(arrowstyle="->"))
ax.add_artist(ab)

・最後に、表示する。

plt.show()

・これを全部くっつけて、エビとピザを表示できるようにすると、以下のような感じ。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

fig, ax = plt.subplots()

#エビ画像
# ポジション設定
xy = (1, 2)
ax.plot(xy[0], xy[1], ".r")

#表示する画像を作成
arr_img = plt.imread("エビ.png", format='png')
imagebox = OffsetImage(arr_img, zoom=0.2)

#画像を表示
ab = AnnotationBbox(imagebox, xy=(0,0),
                    xybox=(50, -50),
                    xycoords='data',
                    boxcoords="offset points",
                    arrowprops=dict(arrowstyle="->"))
ax.add_artist(ab)

#ピザ画像
# ポジション設定
xy = (2, 3)
ax.plot(xy[0], xy[1], ".r")

#表示する画像を作成
arr_img = plt.imread("ピザ.png", format='png')
imagebox = OffsetImage(arr_img, zoom=0.2)

#画像を表示
ab = AnnotationBbox(imagebox, xy=(0,0),
                    xybox=(50, -50),
                    xycoords='data',
                    boxcoords="offset points",
                    arrowprops=dict(arrowstyle="->"))
ax.add_artist(ab)

ax.set_xlim(0, 3)
ax.set_ylim(1, 4)

plt.show()

・プロットと画像が被らなければこれでも良いかも。

 

おわり