はじめに
matplotlib mplot3dによる3Dグラフ上でマーカーとして画像を表示する方法について解説する。
コード
![](https://sabopy.com/wp/wp-content/uploads/2019/06/anotate3Dpic.jpg)
解説
モジュールのインポート
データの生成
np.random.rand(6,3)により、0以上1未満のデータ6点を生成する。
figの作成とプロット
figを作成し、データを散布図でプロットし、ラベルの設定をする。
画像を表示するためのダミーaxesの生成
figの同じ111の位置に3Dグラフと2Dグラフを作成し、2Dグラフ上に画像を表示させる。ax2.axis([0,1,0,1])とすることでfig全体にax2を表示する。
frame_on=Falseとすることで背景が透明となり、ax2.axis(“off”)で軸と目盛りが非表示となる。
画像の読み込みとトリミング
この画像を読み込む。
![](https://sabopy.com/wp/wp-content/uploads/2019/06/rofofora-800x800.jpg)
plt.imread(image_path) で画像を配列として読み込み、スイライシングによりトリミングし、ロフォフォラだけが表示されるようにしている。
画像を表示する座標を求める関数
関数(proj(X, ax1, ax2))では、3Dグラフの点を2次元に投影してデータ座標を求める。その投影データ座標をディスプレイ座標に変換する。そのディスプレイ座標をax2のデータ座標に変換するという処理を行う。
最初にproj3d.proj_transform(x,y,z, ax1.get_proj())により、データの投影を行う。x2,y2をプロットすると以下のようになる。
![](https://sabopy.com/wp/wp-content/uploads/2019/06/x2_y2.jpg)
この投影データ座標をディスプレイ座標に変換する。
ax1.transData.transform((x2, y2))した結果は以下のようになる。
![](https://sabopy.com/wp/wp-content/uploads/2019/06/trans_display.jpg)
このディスプレイ座標をax2のデータ座標に変換したもの、つまり、return値である ax2.transData.inverted().transform(ax1.transData.transform((x2, y2)))は以下のようになる。
![](https://sabopy.com/wp/wp-content/uploads/2019/06/trans_ax2.jpg)
画像を表示する関数
画像をOffsetImageに取り込む
imはmatplotlib.offsetbox.OffsetImage at #####となり、zoomで画像の拡大縮小ができる。
OffsetImageをAnnotationBboxに取り込んで表示
AnnotationBboxにより画像を表示する。
im, xy, xybox=(0,0),でimをxyの位置から(0,0)離れたところに表示するという意味になるので、xyの位置に画像が表示される。xycoords=’data’でxyの表示にデータ座標系が使用され、 boxcoords=”offset points”では、画像を表示するboxをずらす設定にポイント座標系が使用されることを示している。
ax.add_artist(ab)で画像を図に表示する。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント
[…] [matplotlib 3D] 52. 3Dグラフでマーカーとして画像を使用する方法matplotlib mplot3dによる3Dグラフ上でマーカーとして画像を表示する方法について解説する。sabopy.com2019.06.28 […]