es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: Agregando matrices 2D desde una rejilla de malla

Estoy graficando dos grafos superficiales en Python obtenidos de np.meshgrid, los cuales quiero unir para crear solo un grafico. Por ejemplo:

fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(projection='3d')

Primera superficie:

x1 = np.linspace(0,1,100)
y1 = np.linspace(0,1,100)
X1,Y1 = np.meshgrid(x1,y1)
Z1 = 2*Y1
solid = ax.plot_surface(X1,Y1,Z1,cmap=cm.coolwarm,linewidth=0, antialiased=True)

Segunda superficie:

x2 = np.linspace(0,1,100)
y2 = np.linspace(1,2,100)
X2,Y2 = np.meshgrid(x2,y2)
Z2 = 2*Y2
solid = ax.plot_surface(X2,Y2,Z2,cmap=cm.coolwarm,linewidth=0, antialiased=True)

Mi primera idea fue unirlos con np.append, como tal:

X = np.append(X1,X2)
Y = np.append(Y1,Y2)
Z = np.append(Z1,Z2)
solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True)

Pero como era de esperar, se produjo un error ya que Z estaba aplanado y, además, no estoy seguro de si X e Y son correctos. En el ejemplo anterior, es trivial cómo podría crear solo una superficie ya que ambos tienen el mismo ángulo, pero quiero resolver el caso general donde podrían tener diferentes inclinaciones. ¿Cómo puedo superar este problema? ¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear una gráfica de superficie combinada, necesitamos apilar las mallas individuales a lo largo del eje perpendicular a la superficie, que es la dirección z en nuestro caso. Sin embargo, como las dos superficies tienen diferentes rangos en la dirección y, debemos ajustar los valores de z de una de las superficies para que coincida con la otra superficie en el punto de interfaz.

    Aquí hay una versión modificada del código que hace esto:

    # Primera superficie:
    x1 = np.linspace(0, 1, 100)
    y1 = np.linspace(0, 1, 100)
    X1, Y1 = np.meshgrid(x1, y1)
    Z1 = 2 * Y1
    
    # Segunda superficie:
    x2 = np.linspace(0, 1, 100)
    y2 = np.linspace(1, 2, 100)
    X2, Y2 = np.meshgrid(x2, y2)
    Z2 = 2 * Y2
    
    # Encuentra el índice del punto de interfaz en la dirección y:
    idx = np.argmin(np.abs(y1 - y2[0]))
    
    # Ajusta la segunda superficie para que coincida con la primera superficie en el punto de interfaz:
    Z2 -= Z2[idx, 0] - Z1[idx, 0]
    
    # Combina las mallas:
    X = np.vstack((X1, X2))
    Y = np.vstack((Y1, Y2))
    Z = np.vstack((Z1, Z2))
    
    # Crea la gráfica:
    fig = plt.figure(figsize=(8, 4))
    ax = fig.add_subplot(projection='3d')
    solid = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0, antialiased=True)
    

    La función np.vstack se utiliza para apilar las mallas verticalmente a lo largo del eje z y el ajuste de la segunda superficie se realiza restando la diferencia en los valores z en el punto de interfaz. Esto asegura que las dos superficies se conecten suavemente en el punto de interfaz.

    Aquí está la gráfica resultante:

    combined_surface_plot.png

Comments are closed.