如何通过登录 Seaborn 来平均缩放 x 轴和 y 轴?
How to scale the x and y axis equally by log in Seaborn?
我想在 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()
我得到的:
如果我按对数缩放 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()
外观:
问题是您正在以常规比例拟合数据,但后来您将轴转换为对数比例。所以线性拟合在对数尺度上将不再是线性的。
您需要的是将数据转换为对数刻度(以 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 polyfit 的解决方案 从拟合中排除 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')
我想在 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()
我得到的:
如果我按对数缩放 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()
外观:
问题是您正在以常规比例拟合数据,但后来您将轴转换为对数比例。所以线性拟合在对数尺度上将不再是线性的。
您需要的是将数据转换为对数刻度(以 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 polyfit 的解决方案 从拟合中排除 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')