Подтвердить что ты не робот

Почему matplotlib требует установки логарифмической шкалы перед plt.scatter(), но не plt.plot()?

В этом plt.scatter() ответе я обнаружил, что plt.scatter() и plt.plot() ведут себя по-разному, когда на оси y используется логритмический масштаб.

С помощью plot я могу изменить журнал в любое время, прежде чем использовать plt.show(), но перед использованием plt.show() журнал должен быть настроен plt.show().

Это просто исторический и необратимый артефакт в matplotlib, или это категория "неожиданное поведение"?

enter image description here

import matplotlib.pyplot as plt

X = [0.997, 2.643, 0.354, 0.075, 1.0, 0.03, 2.39, 0.364, 0.221, 0.437]
Y = [15.487507, 2.320735, 0.085742, 0.303032, 1.0, 0.025435, 4.436435,
     0.025435, 0.000503, 2.320735]

plt.figure()

plt.subplot(2,2,1)
plt.scatter(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('scatter - scale last')   

plt.subplot(2,2,2)
plt.plot(X, Y)
plt.xscale('log')
plt.yscale('log')
plt.title('plot - scale last')   

plt.subplot(2,2,3)
plt.xscale('log')
plt.yscale('log')
plt.scatter(X, Y)
plt.title('scatter - scale first')   


plt.subplot(2,2,4)
plt.xscale('log')
plt.yscale('log')
plt.plot(X, Y)
plt.title('plot - scale first')   


plt.show()
4b9b3361

Ответ 1

Это как-то связано с областью отображения (пределы осей), рассчитанной с помощью matplotlib.

Это поведение исправляется путем ручного редактирования диапазона осей с использованием set_xlim и set_ylim.

plt.figure()
plt.scatter(X, Y)
plt.yscale('log')
plt.xscale('log')
axes = plt.gca()
axes.set_xlim([min(X),max(X)])
axes.set_ylim([min(Y),max(Y)])
plt.show()

Image

Точная причина такого поведения, однако, еще не выяснена мной. Предложения приветствуются.

РЕДАКТИРОВАТЬ

Как упомянуто в разделе комментариев, очевидно, что Matplotlib определил, что у Autoscaling есть фундаментальные проблемы в качестве критической проблемы при выпуске в их официальном репозитории Github, которая будет исправлена в следующих версиях. Благодарю.