How to build two 3D matrix graphics on the same shape with the same scale in Python

I have two matrices, and I would like to have their respective two 3D graphics on two subheadings in the same figure with the same z axis.

This is my code:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D

def myplot(matrix1, matrix2):
    mymin = np.min(np.array([np.min(matrix1), np.min(matrix2)]))
    mymax = np.max(np.array([np.max(matrix1), np.max(matrix2)]))

    xsize, ysize = matrix1.shape
    x = np.arange(0, ysize, 1)
    y = np.arange(0, xsize, 1)

    xs, ys = np.meshgrid(x, y)
    z1 = matrix1
    z2 = matrix2

    fig, (ax1, ax2) = plt.subplots(1, 2)
    ax1 = Axes3D(fig)
    ax1.plot_surface(xs, ys, z1, rstride=1, cstride=1)
    ax2 = Axes3D(fig)
    ax2.plot_surface(xs, ys, z2, rstride=1, cstride=1)
    plt.tight_layout
    plt.show()

mat1 = np.random.random(size = (10, 10))
mat2 = np.random.random(size = (10, 10))

myplot(mat1, mat2)
  • Why do I see only one 3D graph?
  • How can I have the same z axis on both graphs?
+2
source share
1 answer

I think you need to generate helper charts

See the chart below (I also changed the coloring)

def myplot(matrix1, matrix2):
    mymin = np.min(np.array([np.min(matrix1), np.min(matrix2)]))
    mymax = np.max(np.array([np.max(matrix1), np.max(matrix2)]))

    xsize, ysize = matrix1.shape
    x = np.arange(0, ysize, 1)
    y = np.arange(0, xsize, 1)

    xs, ys = np.meshgrid(x, y)
    z1 = matrix1
    z2 = matrix2
    fig=plt.figure()
    ax1 = fig.add_subplot(2, 1, 1, projection='3d')
    ax1.plot_surface(xs, ys, z1,color="blue",alpha=0.5,rstride=1, cstride=1)
    ax2 = fig.add_subplot(2, 1, 2, projection='3d')
    ax2.plot_surface(xs, ys, z2,color="green",alpha=0.5, rstride=1, cstride=1)
    plt.tight_layout
    plt.show()

mat1 = np.random.random(size = (10, 10))
mat2 = np.random.random(size = (10, 10))

myplot(mat1, mat2)

enter image description here

Edit: To overlay myminand mymaxas the boundaries of the two z axes, use

ax1.set_zlim(mymin, mymax)
ax2.set_zlim(mymin, mymax)
+3
source

Source: https://habr.com/ru/post/1535543/


All Articles