2017-04-10 195 views
3

我搜索了,但我没有找到重新调整seaborn库的答案。我也检查了文档lmplot()regplot(),但没有找到。 是否可以扩展和控制回归线的长度?默认情况下,seaborn根据x轴的长度来拟合回归线的长度。另一种选择是使用参数truncate=True - 这将限制回归线仅限于数据的范围。 其他选项?seaborn regplot的扩展回归线

在我的例子中,我想让下回归线向下延伸直到x = 0。上部线延伸至与下部线的交点。

example

import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

file = 'cobbles.csv' 
df = pd.read_csv(file, sep=',') 

sns.regplot(x='downward_temp', y='downward_heat', data=df, ci=None) 
sns.regplot(x='upward_temp', y='upward_heat', data=df, ci=None, order=2) 


plt.xlim([0,25]) 
plt.ylim([0,100]) 
plt.show() 

回答

1

你必须使用scipy.stats.linregress计算线性回归函数一样seaborn做。然后,您必须生成x数组以覆盖画布的新x轴限制,并在其扩展回归线上绘制阴影。有关详细信息看一下例子:

import numpy as np; np.random.seed(8) 

import seaborn as sns 
import matplotlib.pylab as plt 
import scipy.stats 

# test data 
mean, cov = [4, 6], [(1.5, .7), (.7, 1)] 
x, y = np.random.multivariate_normal(mean, cov, 80).T 
ax = sns.regplot(x=x, y=y, color="g") 

# extend the canvas 
plt.xlim([0,20]) 
plt.ylim([0,15]) 

# calculate linear regression function 
slope, intercept, r_value, p_value, std_err = \ 
scipy.stats.linregress(x=x,y=y) 

# plot the regression line on the extended canvas 
xlims = ax.get_xlim() 
new_x = np.arange(xlims[0], xlims[1],(xlims[1]-xlims[0])/250.) 
ax.plot(new_x, intercept + slope * new_x, color='g', linestyle='-', lw = 2.5) 

plt.show() 

enter image description here

+0

谢谢。这也是我解决问题的想法。但不幸的是,这可以归结为与线条相结合的散点图。在这种情况下,海豹几乎没有任何意义。 但是如果拟合线是功率曲线或对数函数或其他类型的可能函数呢? –

+0

寻找numpy.polyfit或scipy.optimize.curve_fit。这里是非常好的答案:http://stackoverflow.com/a/3433503/2666859 – Serenity

0

如果你知道密谋之前你的X限制,你可以为轴线set_xlim调用regplot和seaborn会再延长回归线和CI超过之前xlim的范围。

import matplotlib.pyplot as plt 
import pandas as pd 
import seaborn as sns 

file = 'cobbles.csv' 
df = pd.read_csv(file, sep=',') 

fig, ax = plt.subplots() 

xlim = [0,25] 
ax.set_xlim(xlim) 

sns.regplot(x='downward_temp', y='downward_heat', data=df, ci=None, ax=ax) 
sns.regplot(x='upward_temp', y='upward_heat', data=df, ci=None, order=2, ax=ax) 

ax.set_ylim([0,100]) 
plt.show()