12

matplotlibによって生成された線の3Dプロットがあります。特定のxy(またはyz、xz)スライスで画像をオーバーレイしたい。Pythonを使用してそれを行うにはどうすればよいですか?ありがとう。

私は次のような単純な3Dプロットコードを持っています:

fig = plt.figure(1),<br>
ax = Axes3D(fig)<br>
ax.plot(f[:,0], f[:,1], f[:,2], color='r')

画像「Im」(2D配列)もあるので、次のようなものが必要です。

ax.overlay(Im, slice='xy', sliceNo=10)
4

3 に答える 3

35

背景画像の上に3D表面プロットオーバーレイを1回実行しました。

背景画像の上に3D表面プロット

これがあなたが望むものに似ているなら、私はそれから実用的な例を作ることを試みることができます。

または、画像を3D空間で表示するだけの場合は、サーフェスプロットを使用できます。

from pylab import *
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.cbook import get_sample_data
from matplotlib._png import read_png
fn = get_sample_data("lena.png", asfileobj=False)
img = read_png(fn)
x, y = ogrid[0:img.shape[0], 0:img.shape[1]]
ax = gca(projection='3d')
ax.plot_surface(x, y, 10, rstride=5, cstride=5, facecolors=img)
show()

もちろん、ストライド値を1に減らして画質を向上させることもできますが、描画には時間がかかります=)

上記のコードから得られた画像:

ここに画像の説明を入力してください

2020年11月の編集:

興味深いと思われるので、最初の画像を生成するために使用したコードを次に示します(これは、光励起後の多結晶シリコンウェーハの少数電荷キャリアの減衰です)。

bg_img = Image.open(datadir + "DSC_1495_dark.jpg")
bg_img = bg_img.crop((0, 0, 4000, 2848))
dpi = pl.rcParams['figure.dpi']
figsize = float(bg_img.size[0]) / dpi, float(bg_img.size[1]) / dpi

fig = pl.figure(figsize=figsize)
ax = pl.axes([0, 0, 1, 1], frameon=False)
ax.set_axis_off()
im = pl.imshow(bg_img)

ax = pl.axes([0.01, -0.005, 1.01, 1], projection='3d')
data = (loadtxt(datadir + "pl-image.txt")[14:950, 14:950] - 30) / 270
height, width = data.shape
bin = 1
print data.min(), data.max()
X = arange(data.shape[1])
Y = arange(data.shape[0])
tau = data[:, data.shape[1] // 2][:, None]
T = 5.0
t = linspace(0, T, data.shape[1])[None, :]
f = 1 / (1 + exp(-T / (2 * tau)))
Z = where(t < T / 2, 1 - f * exp(-t / tau), f * exp(-(t - T / 2) / tau))
X, Y = meshgrid(X, Y)
colors = rbow(data)
colors[:, :, -1] = 0.6
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
        linewidth=0, antialiased=True, shade=True)
ax.set_xlim3d(0, data.shape[0] + 36.0 / bin)
ax.set_ylim3d(18.0 / bin, data.shape[0] + 30.0 / bin)
ax.set_zlim3d(-0.8, 1.1)
ax.grid(False)
ax.view_init(38, -55.5)
ax.dist = 9.4
for a in (ax.w_xaxis, ax.w_yaxis, ax.w_zaxis):
    for t in a.get_ticklines() + a.get_ticklabels():
        t.set_visible(False)
    a.line.set_visible(False)
    a.pane.set_visible(False)
pl.savefig(picdir + "3d-plot.png", transparent=True)
于 2013-03-23T21:17:10.623 に答える