Question définir matplotlib 3d ratio ratio de parcelle?


import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

Réglage du rapport hauteur / largeur pour les tracés 2D:

ax = plt.axes()
ax.plot([0,1],[0,10])
ax.set_aspect('equal','box')

Mais pas pour 3d:

ax = plt.axes(projection='3d')
ax.plot([0,1],[0,1],[0,10])
ax.set_aspect('equal','box')

Existe-t-il une syntaxe différente pour le cas 3d, ou n'est-il pas implémenté?


29
2017-11-15 02:35


origine


Réponses:


Je crois comprendre que ce n’est pas encore le cas. J'espère aussi qu'il sera bientôt mis en œuvre. Voir Ce lien pour une solution possible (je ne l'ai pas testé moi-même).


4
2017-11-15 19:22



Je n'ai pas essayé toutes ces réponses, mais ce kludge l'a fait pour moi:

def axisEqual3D(ax):
    extents = np.array([getattr(ax, 'get_{}lim'.format(dim))() for dim in 'xyz'])
    sz = extents[:,1] - extents[:,0]
    centers = np.mean(extents, axis=1)
    maxsize = max(abs(sz))
    r = maxsize/2
    for ctr, dim in zip(centers, 'xyz'):
        getattr(ax, 'set_{}lim'.format(dim))(ctr - r, ctr + r)

19
2017-10-08 13:15



On dirait que cette fonctionnalité a été ajoutée depuis, alors je pense que j'ajouterais une réponse pour les personnes qui viennent par ce fil dans le futur comme je l'ai fait:

fig = plt.figure(figsize=plt.figaspect(0.5)*1.5) #Adjusts the aspect ratio and enlarges the figure (text does not enlarge)
ax = fig.gca(projection='3d')

figaspect(0.5) rend le chiffre deux fois plus large que grand. Puis le *1.5 augmente la taille de la figure. Les étiquettes, etc., n'augmenteront pas, ce qui rend le graphique moins encombré par les étiquettes.


13
2017-09-11 13:55



Si vous connaissez les limites, par exemple. + -3 centré autour de (0,0,0), vous pouvez ajouter des points invisibles comme ceci:

import numpy as np
import pylab as pl
from mpl_toolkits.mplot3d import Axes3D
fig = pl.figure()
ax = fig.gca(projection='3d')
ax.set_aspect('equal')
MAX = 3
for direction in (-1, 1):
    for point in np.diag(direction * MAX * np.array([1,1,1])):
        ax.plot([point[0]], [point[1]], [point[2]], 'w')

10
2018-02-19 12:45



Si vous connaissez les limites, vous pouvez également définir le format d'image de la manière suivante:

ax.auto_scale_xyz([minbound, maxbound], [minbound, maxbound], [minbound, maxbound])

7
2017-11-12 15:25