我對seaborn完全陌生,所以如果這是一個簡單的問題,我很抱歉,但我無法在文檔中的任何位置找到如何在kdeplot中控制由n_levels繪製的級別的描述。這是一個例子:在seaborn kdeplot中設置置信度
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
x,y=np.random.randn(2,10000)
fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,shade_lowest=False, ax=ax,n_levels=3,cmap="Reds")
plt.show()
這是導致情節:
我希望能夠知道顯示什麼樣的信心水平,這樣我可以標註我的情節「陰影區域顯示( a,b,c)百分比置信區間。「我會天真地認爲n_levels在某種程度上與高斯等價的「sigma」有關,但從看起來並非如此的例子。
理想情況下,我想可以指定傳遞一個元組kdeplot,如顯示的時間間隔:
levels=[68,95,99]
並繪製這些置信區域。
編輯:感謝@Goyo和@tom我想我可以澄清我的問題,並來到我正在尋找的答案的中途。正如指出的那樣,n_levels
作爲levels
傳遞給plt.cotourf
,所以的列表可以通過。但sns.kdeplot
繪製PDF,並且PDF中的值與我正在查找的置信區間不符(因爲這些對應於PDF的集成)。
我需要做的是通過sns.kdeplot
x,y
值的集成(和規範化)的PDF,然後我將能夠進入例如n_levels=[0.68,0.95,0.99,1]
。
編輯2:我現在已經解決了這個問題。見下文。我使用2d規範直方圖來定義置信區間,然後將其作爲水平傳遞給規範的kde圖。對於重複的道歉,我可以做一個函數來返回關卡,但是我明確地輸入了它。
import numpy as np
import scipy.optimize
import matplotlib.pyplot as plt
import seaborn as sns
# Generate some random data
x,y=np.random.randn(2,100000)
# Make a 2d normed histogram
H,xedges,yedges=np.histogram2d(x,y,bins=40,normed=True)
norm=H.sum() # Find the norm of the sum
# Set contour levels
contour1=0.99
contour2=0.95
contour3=0.68
# Set target levels as percentage of norm
target1 = norm*contour1
target2 = norm*contour2
target3 = norm*contour3
# Take histogram bin membership as proportional to Likelihood
# This is true when data comes from a Markovian process
def objective(limit, target):
w = np.where(H>limit)
count = H[w]
return count.sum() - target
# Find levels by summing histogram to objective
level1= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target1,))
level2= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target2,))
level3= scipy.optimize.bisect(objective, H.min(), H.max(), args=(target3,))
# For nice contour shading with seaborn, define top level
level4=H.max()
levels=[level1,level2,level3,level4]
# Pass levels to normed kde plot
fig,ax=plt.subplots()
sns.kdeplot(x,y, shade=True,ax=ax,n_levels=levels,cmap="Reds_d",normed=True)
ax.set_aspect('equal')
plt.show()
所得的情節現在是以下幾點:
的水平稍寬比我預期的,但我認爲這是正確的。
我認爲* n_levels簡單地將最小/最大值之間的範圍劃分爲「n」個相同大小的步驟。 – kazemakase
它似乎應該能夠刪除'n_levels'並傳入'levels = [X,Y,Z]'(因爲關卡會傳遞給'plt.contourf')。但我不確定X,Y,Z應該是什麼水平,因爲等值線圖的值不會等於您的百分比置信水平。 – tom
@大衛我認爲你應該澄清你的問題。這是關於「設置seaborn kdeplot的置信水平」,現在我認爲我的答案不會增加它,但我無法弄清楚這可能意味着什麼。你想計算哪個參數的置信區間?它是如何與kde相關的,這是一個非參數估計? – Goyo