¿Cómo puedo recortar un diagtwig de Axes3D con relación de aspecto cuadrado?

Aquí hay un ejemplo de barebones:

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() f = fig.add_subplot(2, 1, 1, projection='3d') t = fig.add_subplot(2, 1, 2, projection='3d') # axes for d in {f, t}: d.plot([-1, 1], [0, 0], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [-1, 1], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [0, 0], [-1, 1], color='k', alpha=0.8, lw=2) f.dist = t.dist = 5.2 # 10 is default plt.tight_layout() f.set_aspect('equal') t.set_aspect('equal') r = 6 f.set_xlim3d([-r, r]) f.set_ylim3d([-r, r]) f.set_zlim3d([-r, r]) t.set_xlim3d([-r, r]) t.set_ylim3d([-r, r]) t.set_zlim3d([-r, r]) f.set_axis_off() t.set_axis_off() plt.draw() plt.show() 

Esto es lo que obtengo:

ventanas cuadradas

Esto es lo que quiero:

viewports rectangulares

    En otras palabras, quiero que las plots tengan una relación de aspecto cuadrada, no todas estiradas de esta manera:

    extendido

    y obtuve esa parte trabajando gracias a https://stackoverflow.com/a/31364297/125507

    pero quiero que las ventanas que miran esas plots sean rectangulares, con la parte superior e inferior recortadas (ya que solo habrá espacio en blanco en la parte superior e inferior y estoy generando varios GIF animados, por lo que no puedo procesarlo fácilmente) a la forma que quiero).

    Básicamente estoy haciendo esta animación, y quiero lo mismo pero sin todo el espacio en blanco:

    animación

    Para hacer un seguimiento de mis comentarios y mostrar ejemplos, establezca una r más pequeña y elimine los márgenes de subplot usando subplots_adjust :

     import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() f = fig.add_subplot(2, 1, 1, projection='3d') t = fig.add_subplot(2, 1, 2, projection='3d') # axes for d in {f, t}: d.plot([-1, 1], [0, 0], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [-1, 1], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [0, 0], [-1, 1], color='k', alpha=0.8, lw=2) f.dist = t.dist = 5.2 # 10 is default plt.tight_layout() f.set_aspect('equal') t.set_aspect('equal') r = 1 f.set_xlim3d([-r, r]) f.set_ylim3d([-r, r]) f.set_zlim3d([-r, r]) t.set_xlim3d([-r, r]) t.set_ylim3d([-r, r]) t.set_zlim3d([-r, r]) f.set_axis_off() t.set_axis_off() fig.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0) plt.draw() plt.show() 

    Esto dará subplots más ajustados, ya que los valores predeterminados para SubplotParams son los siguientes:

    izquierda: 0.125

    derecha: 0.9

    parte inferior: 0.1

    arriba: 0.9

    wspace: 0.2

    hspace: 0.2

    Aunque no estoy seguro de que esto sea lo que el OP está buscando …

    introduzca la descripción de la imagen aquí

    Dado que desea un gráfico rectangular, no puede usar set_aspect('equal') , en su lugar, debe ajustar los límites de sus gráficos para tener en cuenta la diferencia en las relaciones de aspecto.

    En el bash a continuación, he usado el bbox del eje para obtener la height y el width de los ejes y he usado la relación de aspecto para volver a escalar los ejes X e Y (Supuse que ambas plots tienen la misma dimensión, pero también podrías tener plots con diferentes dimensiones, solo tendrás que ajustar los límites de los ejes de forma independiente para cada una).

     import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() f = fig.add_subplot(2, 1, 1, projection='3d') t = fig.add_subplot(2, 1, 2, projection='3d') # axes for d in {f, t}: d.plot([-1, 1], [0, 0], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [-1, 1], [0, 0], color='k', alpha=0.8, lw=2) d.plot([0, 0], [0, 0], [-1, 1], color='k', alpha=0.8, lw=2) f.dist = t.dist = 5.2 # 10 is default plt.tight_layout() # Cannot use 'equal' aspect for a rectangular plot # f.set_aspect('equal') # t.set_aspect('equal') # get the dimensions of the axes from its bbox f_bbox = f.get_position() f_height = f_bbox.height f_width = f_bbox.width r = 6 f.set_xlim3d([-1 * f_width/f_height * r, f_width/f_height * r]) f.set_ylim3d([-1 * f_width/f_height * r, f_width/f_height * r]) f.set_zlim3d([-r, r]) t.set_xlim3d([-1 * f_width/f_height * r, f_width/f_height * r]) t.set_ylim3d([-1 * f_width/f_height * r, f_width/f_height * r]) t.set_zlim3d([-r, r]) f.set_axis_off() t.set_axis_off() plt.draw() plt.show() 

    Nota: En esta imagen, he agregado un color de fondo para resaltar la forma rectangular de las plots