Añadir imagen de fondo a la ttwig 3d

Este tema se ha tratado aquí , pero no se dieron indicaciones sobre cómo crear una gráfica 3D e insertar una imagen en el plano (x,y) , a una altura z especificada.

Así que para crear un caso simple y reproducible, digamos que creo una ttwig 3D como esta con mplot3d :

 from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.winter, linewidth=0, antialiased=True) ax.set_zlim(-1.01, 1.01) ax.zaxis.set_major_locator(LinearLocator(10)) ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) plt.show() 

Visualmente tenemos: introduzca la descripción de la imagen aquí

En el nivel z=min(z)-1 , donde -1 es un desplazamiento visual para evitar la superposición, quiero insertar una imagen que represente los elementos para los cuales la curva muestra un cierto valor. ¿Cómo hacerlo?

En este ejemplo, no me importa una combinación perfecta entre el elemento y su valor, así que no dude en subir cualquier imagen que desee. Además, ¿hay una manera de dejar que la imagen gire, en caso de que uno no esté satisfecho con la coincidencia?

EDITAR

Este es un ejemplo visual de algo similar hecho para un histogtwig 3D. Las formas grises en el nivel z=0 son los elementos para los cuales las barras muestran un cierto valor de z . Fuente. introduzca la descripción de la imagen aquí

Use plot_surface para dibujar la imagen a través del argumento facecolors

 from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np from matplotlib._png import read_png from matplotlib.cbook import get_sample_data fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(-5, 5, .25) Y = np.arange(-5, 5, .25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.winter, linewidth=0, antialiased=True) ax.set_zlim(-2.01, 1.01) ax.zaxis.set_major_locator(LinearLocator(10)) ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) fn = get_sample_data("./lena.png", asfileobj=False) arr = read_png(fn) # 10 is equal length of x and y axises of your surface stepX, stepY = 10. / arr.shape[0], 10. / arr.shape[1] X1 = np.arange(-5, 5, stepX) Y1 = np.arange(-5, 5, stepY) X1, Y1 = np.meshgrid(X1, Y1) # stride args allows to determine image quality # stride = 1 work slow ax.plot_surface(X1, Y1, -2.01, rstride=1, cstride=1, facecolors=arr) plt.show() 

introduzca la descripción de la imagen aquí

Si necesita agregar valores use PathPatch :

 from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm from matplotlib.ticker import LinearLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D import mpl_toolkits.mplot3d.art3d as art3d from matplotlib.text import TextPath from matplotlib.transforms import Affine2D from matplotlib.patches import PathPatch def text3d(ax, xyz, s, zdir="z", size=None, angle=0, usetex=False, **kwargs): x, y, z = xyz if zdir == "y": xy1, z1 = (x, z), y elif zdir == "y": xy1, z1 = (y, z), x else: xy1, z1 = (x, y), z text_path = TextPath((0, 0), s, size=size, usetex=usetex) trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) p1 = PathPatch(trans.transform_path(text_path), **kwargs) ax.add_patch(p1) art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) # main fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(-5, 5, .25) Y = np.arange(-5, 5, .25) Xg, Yg = np.meshgrid(X, Y) R = np.sqrt(Xg**2 + Yg**2) Z = np.sin(R) surf = ax.plot_surface(Xg, Yg, Z, rstride=1, cstride=1, cmap=cm.winter, linewidth=0, antialiased=True) ax.set_zlim(-2.01, 1.01) ax.zaxis.set_major_locator(LinearLocator(10)) ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) # add pathces with values for i,x in enumerate(X[::4]): for j,y in enumerate(Y[::4]): text3d(ax, (x, y, -2.01), "{0:.1f}".format(Z[i][j]), zdir="z", size=.5, ec="none", fc="k") plt.show() 

introduzca la descripción de la imagen aquí