Как одинаково масштабировать оси X и Y, войдя в Seaborn? - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу создать регплот с линейной регрессией в Seaborn и масштабировать обе оси одинаково по журналу, чтобы регрессия оставалась прямой линией.

Пример:

import matplotlib.pyplot as plt
import seaborn as sns

some_x=[0,1,2,3,4,5,6,7]
some_y=[3,5,4,7,7,9,9,10]

ax = sns.regplot(x=some_x, y=some_y, order=1)
plt.ylim(0, 12)
plt.xlim(0, 12)
plt.show()

Что я получаю:

Linear regression

Если я масштабирую оси x и y по логарифму, я ожидаю, что регрессия останется прямой линией.Что я пробовал:

import matplotlib.pyplot as plt
import seaborn as sns

some_x=[0,1,2,3,4,5,6,7]
some_y=[3,5,4,7,7,9,9,10]

ax = sns.regplot(x=some_x, y=some_y, order=1)
ax.set_yscale('log')
ax.set_xscale('log')
plt.ylim(0, 12)
plt.xlim(0, 12)
plt.show()

Как это выглядит:

Linear regression becomes a curve

1 Ответ

0 голосов
/ 29 декабря 2018

Проблема в том, что вы подгоняете свои данные в обычном масштабе, но позже вы переводите оси в логарифмический масштаб.Таким образом, линейное соответствие больше не будет линейным в логарифмическом масштабе.

Вместо этого вам нужно преобразовать данные в логарифмический масштаб (основание 10) и затем выполнить линейную регрессию.Ваши данные в настоящее время список.Было бы легко преобразовать ваши данные в масштабирование журнала, если вы преобразуете свой список в массив NumPy, потому что тогда вы можете использовать векторизованную операцию.

Внимание: одна из ваших x-записей - 0, для которых журналне определено.Там вы увидите предупреждение.

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

some_x=np.array([0,1,2,3,4,5,6,7])
some_y=np.array([3,5,4,7,7,9,9,10])

ax = sns.regplot(x=np.log10(some_x), y=np.log10(some_y), order=1)

Решение с использованием полифита NumPy , где вы исключаете точку данных x = 0 из фитинга

import matplotlib.pyplot as plt
import numpy as np

some_x=np.log10(np.array([0,1,2,3,4,5,6,7]))
some_y=np.log10(np.array([3,5,4,7,7,9,9,10]))

fit = np.poly1d(np.polyfit(some_x[1:], some_y[1:], 1))

plt.plot(some_x, some_y, 'ko')
plt.plot(some_x, fit(some_x), '-k')

enter image description here

...