如何通过登录Seaborn来相等地缩放x和y轴? [英] How to scale the x and y axis equally by log in Seaborn?
问题描述
我想在Seaborn中创建具有线性回归的regplot,并通过对数均等地缩放两个轴,以使回归保持直线.
I want to create a regplot with a linear regression in Seaborn and scale both axes equally by log, such that the regression stays a straight line.
一个例子:
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轴,则期望回归保持直线.我尝试过的:
If I scale the x and y axis by log, I would expect the regression to stay a straight line. What I tried:
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()
外观:
推荐答案
问题是您正以常规比例拟合数据,但后来又将轴转换为对数比例.因此,线性拟合在对数刻度上将不再是线性的.
The problem is that you are fitting to your data on a regular scale but later you are transforming the axes to log scale. So linear fit will no longer be linear on a log scale.
您需要的是将数据转换为对数刻度(以10为底),然后执行线性回归.您的数据当前是一个列表.如果将列表转换为NumPy数组,则很容易将数据转换为对数比例,因为这样您就可以利用矢量化操作了.
What you need instead is to transform your data to log scale (base 10) and then perform a linear regression. Your data is currently a list. It would be easy to transform your data to log scale if you convert your list to NumPy array because then you can make use of vectorised operation.
警告:您的x条目之一是 0
,该条目未定义日志.您将在那里遇到警告.
Caution: One of your x-entry is 0
for which log is not defined. You will encounter a warning there.
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数据点
Solution using NumPy polyfit where you exclude x=0 data point from the fit
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来相等地缩放x和y轴?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!