[matplotlib 3D] 52. 3Dグラフでマーカーとして画像を使用する方法

matplotlib 3D

はじめに

matplotlib mplot3dによる3Dグラフ上でマーカーとして画像を表示する方法について解説する。

コード

解説

モジュールのインポート

データの生成

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”)で軸と目盛りが非表示となる。

画像の読み込みとトリミング

この画像を読み込む。

plt.imread(image_path) で画像を配列として読み込み、スイライシングによりトリミングし、ロフォフォラだけが表示されるようにしている。

画像を表示する座標を求める関数

関数(proj(X, ax1, ax2))では、3Dグラフの点を2次元に投影してデータ座標を求める。その投影データ座標をディスプレイ座標に変換する。そのディスプレイ座標をax2のデータ座標に変換するという処理を行う。

最初にproj3d.proj_transform(x,y,z, ax1.get_proj())により、データの投影を行う。x2,y2をプロットすると以下のようになる。

この投影データ座標をディスプレイ座標に変換する。
ax1.transData.transform((x2, y2))した結果は以下のようになる。

このディスプレイ座標をax2のデータ座標に変換したもの、つまり、return値である ax2.transData.inverted().transform(ax1.transData.transform((x2, y2)))は以下のようになる。

画像を表示する関数

画像を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)で画像を図に表示する。

参考

Matplotlib: 3D Scatter Plot with Images as Annotations
I am trying to generate a 3D scatter plot for tSNE embeddings of images from a dataset containing digits from 0 to 9. I would also like to annotate the points w...
Demo Annotation Box — Matplotlib 3.1.0 documentation
mplot3d API — Matplotlib 3.1.0 documentation
Transformations Tutorial — Matplotlib 3.1.0 documentation

コメント

  1. […] [matplotlib 3D] 52. 3Dグラフでマーカーとして画像を使用する方法matplotlib mplot3dによる3Dグラフ上でマーカーとして画像を表示する方法について解説する。sabopy.com2019.06.28 […]