2017-04-10 162 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()