matplotlib (égal unité de longueur): avec "égales" ratio d'aspect de l'axe z n'est pas égal à x et y
Lorsque j'ai créé l'égalité de rapport d'aspect pour la 3d graphique de l'axe z ne change pas "égales". Donc, c':
fig = pylab.figure()
mesFig = fig.gca(projection='3d', adjustable='box')
mesFig.axis('equal')
mesFig.plot(xC, yC, zC, 'r.')
mesFig.plot(xO, yO, zO, 'b.')
pyplot.show()
me donne les éléments suivants:
où, évidemment, de l'unité de longueur de l'axe z n'est pas égal à x et y des parts.
Comment puis-je faire l'unité de longueur de chacun des trois axes de l'égalité? Toutes les solutions que j'ai pu trouver ne fonctionne pas. Merci.
Vous devez vous connecter pour publier un commentaire.
Je crois matplotlib n'a pas encore réglé correctement l'égalité de l'axe en 3D... Mais j'ai trouvé un truc il y a quelques temps (je ne me souviens plus où) que j'ai adapté à l'utiliser. Le concept est de créer un faux cubes de la boîte englobante autour de vos données.
Vous pouvez le tester avec le code suivant:
z données sont environ un ordre de grandeur plus grand que x et y, mais même avec une égale option d'axe, matplotlib autoscale axe z:
Mais si vous ajoutez de la boîte englobante, vous obtenir une bonne mise à l'échelle:
equal
de l'instruction, il sera toujours égale.equal
déclaration.J'ai simplifié Remy F de la solution à l'aide de la
set_x/y/zlim
fonctions.midpoint_x = np.mean([X.max(),X.min()])
et ensuite définir les limites demidpoint_x
+/-max_range
. En utilisant la moyenne ne fonctionne que si la moyenne est situé au milieu de la base de données, ce qui n'est pas toujours vrai. Aussi, un conseil: vous pouvez mettre à l'échelle max_range pour rendre le graphique look plus agréable si il y a des points à proximité ou sur les limites.J'aime les solutions ci-dessus, mais ils ont l'inconvénient que vous avez besoin de garder une trace de la plages et des moyens sur l'ensemble de vos données. Cela pourrait être gênant si vous avez plusieurs jeux de données qui seront représentés ensemble. Pour résoudre ce problème, j'ai fait usage de la hache.get_[xyz]lim3d() les méthodes et mettre le tout dans une fonction autonome qui peut être appelé une seule fois avant d'appeler le plt.show(). Voici la nouvelle version:
x_mean
était en fait pas le dire, mais le milieu. Votre code doit fonctionner correctement, alors, mais je suggère de renommer les variables, et pour une raison quelconque, j'ai fait la même erreur dans ma réponse ci-dessous. 😉Adapté de @karlo réponse pour rendre les choses encore plus propre:
Utilisation:
EDIT: user2525140 du code devrait fonctionner parfaitement bien, même si cette réponse soi-disant tenté de fixer un non-existant erreur. La réponse ci-dessous est juste un doublon (de rechange) application:
ax.set_aspect('equal')
ou la tique valeurs peuvent être vissé vers le haut. Sinon bonne solution. Merci,