パンナの学生生活

地方大学の大学生/プログラミング言語【python】を中心に紹介しています。/日々の脳内をアウトプット/麻雀とワインと日本酒が好き/将来は幸せになりたい

matplotlibでグラフ上に画像を張り付ける方法【python】

今日はプログラミングの話をします。【Python】【AnnotationBbox】今回の内容は、グラフ上に画像を張り付ける方法について説明します。この手の方法も調べるてもあんまり出ない方法ですので参考になればと思っています。

 1.画像付きグラフの作成について

2.Pythonコード

3.AnnotationBboxについて

4.最後に

画像付きグラフの作成について

私が研究補助をしていた時に研究データのグラフに画像を挿入してほしいという要望をいただき付けようとしたのですが、なかなか参考となる日本語の記事が見つからなかったので今回はめっちゃ簡単なコードで分かりやすく説明していきたいです。

今回のグラフと画像に関しては関係ないです。

イメージはこんな感じです。

f:id:panNakotta:20191003130433p:plain

画像付きグラフ

矢印は不要な場合は消すことが出来ます。なぜSinグラフに花火の写真を張り付けたかはマジで適当です。あとで説明を加えたいのですが、画像の位置や矢印の指す位置はAnnotationBboxの引数で変えることが可能です。

Pythonコード

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

x=np.arange(-10,10,0.01)
y=np.sin(x)
plt.xlim(-10,10)
plt.ylim(-2,2)

#以降が画像を張り付ける方法
ax = plt.gca()
img = plt.imread("IMG_3469.jpg")
imagebox = OffsetImage(img, zoom=0.02)
ab = AnnotationBbox(imagebox, (7.37,0.8),
                        xybox=(7.5,-1.5),
                        xycoords='data'
                        ,arrowprops=dict(arrowstyle="->"),pad=0.5,frameon=False)
ax.add_artist(ab)
ax.plot(x,y)
figsize=(16,9)
plt.savefig("sample.png",format='png',dpi=300)
plt.show()

AnnotationBboxについて

AnnotationBboxi(imagebox,(x座標,y座標),xybox=(x座標,y座標),xycoords='data',arrowprops=dict(arrowstyle='->'),pad=0.5,frameon=False)

と表記してますが、imageboxは挿入する画像のことです。AnnotationBboxの前にplt.read('画像名')で読み込み、offsetImageで読み込んだ画像の縮尺を変えることが出来ます。

 

AnnotationBbox内の二番目の引数(x,y)は矢印の指す座標を示しています。矢印をなくした場合はこの座標は関係ないのですが消してしまうとエラー表示されたはずですので注意してください。

xyboxの座標は画像の真ん中の位置のことを表します。arrowprops=dict()は矢印の種類を変えることが出来ます。これは矢印がいらない場合は消してください。消してもエラーは吐かないです。

最後のframeonで画像の枠ぶちの有無を変えることが出来ます。

少し遊ぶとこんなこともできます。

f:id:panNakotta:20191003142344p:plain

for文を使用

このコードは以下になります。

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

x=np.arange(-10,10,0.01)
y=np.sin(x)
plt.xlim(-10,10)
plt.ylim(-2,2)

img = plt.imread("IMG_3469.jpg")
imagebox = OffsetImage(img, zoom=0.02)
for i in range(-5,5,1):
    ab = AnnotationBbox(imagebox,(0,0),
                        xybox=(2*i,i*0.5),
                        xycoords='data'
                        ,pad=0.5,frameon=False)
    ax = plt.gca()
    ax.add_artist(ab)
ax.plot(x,y)
figsize=(16,9)
plt.savefig("sample.png",format='png',dpi=300)
plt.show()

最後に

他にも画像を張る方法はありますが今日説明した方法が無難な気がします。この方法をやってみて質問があればtwitterで質問をお願いします。また、このコンテンツはプログラミングの様々な情報を発信していくのでフォローをお願いします。

@panNakott25(ツイッター)