127 votes

Comment puis-je définir le ratio d'aspect ?

Je cherche à faire un graphique carré (en utilisant imshow), c'est-à-dire un rapport de 1:1, mais je ne peux pas. Aucun de ces travaux:

import matplotlib.pyplot as plt

ax = fig.add_subplot(111,aspect='equal')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect('equal')
plt.axes().set_aspect('equal')

Il semble que les appels soient simplement ignorés (un problème que j'ai souvent avec matplotlib).

6 votes

Avez-vous essayé ax.axis('equal'), par hasard ? Comme tout le monde l'a dit, ce que vous avez fait devrait fonctionner, mais ax.axis pourrait être une autre option à essayer pour contourner le problème.

3voto

Joel Points 9427

Cette réponse est basée sur la réponse de Yann. Elle définira le rapport d'aspect pour les graphiques linéaires ou log-log. J'ai utilisé des informations supplémentaires provenant de https://stackoverflow.com/a/16290035/2966723 pour tester si les axes sont à l'échelle logarithmique.

def forceAspect(ax,aspect=1):
    #aspect is width/height
    scale_str = ax.get_yaxis().get_scale()
    xmin,xmax = ax.get_xlim()
    ymin,ymax = ax.get_ylim()
    if scale_str=='linear':
        asp = abs((xmax-xmin)/(ymax-ymin))/aspect
    elif scale_str=='log':
        asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect
    ax.set_aspect(asp)

Évidemment, vous pouvez utiliser n'importe quelle version de log que vous voulez, j'ai utilisé scipy, mais numpy ou math devraient fonctionner.

1voto

Dans mon cas, le réglage suivant fonctionne le mieux :

plt.figure(figsize=(16,9))

où (16,9) est le rapport d'aspect de votre graphique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X