Trzeci razy urok. Domyślam się, że jest to błąd, a odpowiedź Zhenya sugeruje, że został naprawiony w najnowszej wersji. Mam wersję 0.99.1.1 i stworzyłem następujące rozwiązanie:
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')
To jest „force.png”:
Poniżej znajdują się moje nieudane, ale miejmy nadzieję, próby informacyjne.
Druga odpowiedź:
Moja „oryginalna odpowiedź” poniżej jest przesada, ponieważ robi coś podobnego do axes.set_aspect()
. Myślę, że chcesz użyć axes.set_aspect('auto')
. Nie rozumiem, dlaczego tak jest, ale generuje dla mnie kwadratowy wykres obrazu, na przykład ten skrypt:
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')
Tworzy wykres obrazu o „równych” proporcjach:
i jeden z „automatycznym” współczynnikiem proporcji:
Kod podany poniżej w „oryginalnej odpowiedzi” stanowi punkt wyjścia dla wyraźnie kontrolowanego współczynnika proporcji, ale wydaje się być ignorowany po wywołaniu imshow.
Oryginalna odpowiedź:
Oto przykład procedury, która dostosuje parametry subplotu, aby uzyskać pożądany współczynnik proporcji:
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')
Daje to następującą liczbę:
Mogę sobie wyobrazić, że jeśli masz wiele wykresów podrzędnych na rysunku, chciałbyś uwzględnić liczbę wykresów podrzędnych y i x jako parametry słów kluczowych (domyślnie 1 każdy) do podanej procedury. Następnie używając tych liczb oraz słów kluczowych hspace
i wspace
, możesz sprawić, że wszystkie działki podrzędne będą miały prawidłowe proporcje.
ax.axis('equal')
przez przypadek? Jak wszyscy powiedzieli, to, co zrobiłeś, powinno działać, aleax.axis
może być inną drogą do wypróbowania obejścia.