Potrzebuję figury w matplotlib, gdzie obie osie są zawsze tej samej długości. Do tego używam opcji "równy". W większości przypadków działa całkiem dobrze i otrzymuję oczekiwane wyniki (patrz rysunek 1), ale gdy wartości osi y są znacznie wyższe niż x, rysunek pokazuje nieoczekiwane zachowanie (patrz rysunek 2). Czy ktoś wie, to zachowanie matplotlib?matplotlib axes.set_aspect ("równy") nie zachowuje się jak oczekiwano
Danke Jörg
host = SubplotHost(fig, 111)
try:
min_x_val = min(x for x in self.x_values if x is not None)
max_x_val = max(self.x_values)
except ValueError:
return
max_y_val = list()
for n, evaluator in enumerate(self.cleaned_evaluators):
max_y_val.append(max(self.y_values[n]))
# axis settings
host.axis['left'].label.set_fontsize('small')
host.axis['left'].major_ticklabels.set_fontsize('small')
host.axis['bottom'].label.set_fontsize('small')
host.axis['bottom'].major_ticklabels.set_fontsize('small')
host.axis['bottom'].major_ticklabels.set_rotation(0)
host.set_ylabel(y_label)
host.set_xlabel(x_label)
host.set_xlim(0, max_x_val)
host.set_ylim(0, max_y_val)
host.minorticks_on()
host.toggle_axisline(False)
host.axes.set_aspect('equal')
host.grid(True, alpha=0.4)
return fig
Figura 1:
Figura 2:
rzeczywistości zachowuje się jak expected.'set_aspect („równy”) 'oznacza, że jednostki na osi x jest tej samej długości co jednej jednostki na oś Y, jak widać na rysunku 1. – hooy
Możesz przekazać wartość liczbową do 'set_aspect', patrz [dokumentacja] (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_aspect). Biorąc iloraz "x" i "y", powinieneś być w stanie przeskalować osie tak, aby miały tę samą długość. – Bakuriu
Zauważ, że twój pierwszy przykład (rysunek 1) w rzeczywistości nie jest kwadratowy; ma około 430 pikseli szerokości i 400 pikseli wysokości. Jest to zgodne z nieco odmiennymi zakresami danych dla dwóch osi (0 do 3.5 dla osi X, 0 do 3.25 dla osi y), ponieważ 'set_aspect ('equal')' wymusza takie samo skalowanie danych (dane wartości na piksel) dla obu osi. –