Das dritte Mal ist der Charme. Ich vermute, dass dies ein Fehler ist und Zhenyas Antwort legt nahe, dass er in der neuesten Version behoben ist. Ich habe Version 0.99.1.1 und habe die folgende Lösung erstellt:
import matplotlib.pyplot as plt
import numpy as np
def forceAspect(ax,aspect=1):
im = ax.get_images()
extent = im[0].get_extent()
ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')
Dies ist 'force.png':
Nachfolgend sind meine erfolglosen, aber hoffentlich informativen Versuche aufgeführt.
Zweite Antwort:
Meine 'ursprüngliche Antwort' unten ist übertrieben, da sie etwas Ähnliches tut axes.set_aspect()
. Ich denke du willst es benutzen axes.set_aspect('auto')
. Ich verstehe nicht, warum dies der Fall ist, aber es erzeugt für mich ein quadratisches Bilddiagramm, zum Beispiel dieses Skript:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
Erzeugt ein Bilddiagramm mit dem gleichen Seitenverhältnis:
und eines mit dem automatischen Seitenverhältnis:
Der unten in der 'ursprünglichen Antwort' angegebene Code bietet einen Ausgangspunkt für ein explizit gesteuertes Seitenverhältnis, scheint jedoch ignoriert zu werden, sobald eine Imshow aufgerufen wird.
Ursprüngliche Antwort:
Hier ist ein Beispiel für eine Routine, die die Subplot-Parameter so anpasst, dass Sie das gewünschte Seitenverhältnis erhalten:
import matplotlib.pyplot as plt
def adjustFigAspect(fig,aspect=1):
'''
Adjust the subplot parameters so that the figure has the correct
aspect ratio.
'''
xsize,ysize = fig.get_size_inches()
minsize = min(xsize,ysize)
xlim = .4*minsize/xsize
ylim = .4*minsize/ysize
if aspect < 1:
xlim *= aspect
else:
ylim /= aspect
fig.subplots_adjust(left=.5-xlim,
right=.5+xlim,
bottom=.5-ylim,
top=.5+ylim)
fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))
fig.savefig('axAspect.png')
Dies ergibt eine Figur wie folgt:
Ich kann mir vorstellen, dass Sie, wenn Sie mehrere Unterzeichnungen in der Abbildung haben, die Anzahl der Unterzeichnungen y und x als Schlüsselwortparameter (standardmäßig jeweils 1) in die bereitgestellte Routine aufnehmen möchten. Wenn Sie dann diese Zahlen und die Schlüsselwörter hspace
und verwenden wspace
, können Sie sicherstellen, dass alle Unterzeichnungen das richtige Seitenverhältnis haben.
ax.axis('equal')
zufällig versucht ? Wie alle gesagt haben, sollte das, was Sie getan haben, funktionieren,ax.axis
könnte aber ein anderer Weg sein, um eine Problemumgehung zu versuchen.