2017-08-10 114 views
0

我繪製二項式分佈的概率密度函數:Matplotlib y軸的比例不擬合值

fig=plt.figure(figsize=(10,10)) 
binom=[scs.binom.pmf(k,100,0.2) for k in range(100)] 
print(np.max(binom)) #0.0993002148088 
[plt.axvline(k,ymax=scs.binom.pmf(k,100,0.2)) for k in range(100)] 
plt.ylim(ymax=0.1) 

plt.show() 

正如你看到binom的最大值爲0.099300指情節應該幾乎達到的上限y軸,但結果如下:

enter image description here

那我做錯了嗎?爲什麼圖表不符合極限?

回答

2

我想你可能想要使用stem plot

import matplotlib.pyplot as plt 
import numpy as np 
import scipy.stats as scs 

fig=plt.figure(figsize=(10,10)) 
binom=[scs.binom.pmf(k,100,0.2) for k in range(100)] 

# Scale the yvalues by ymax 
plt.stem(binom, linefmt='b-', markerfmt='none', basefmt='none') 

plt.show() 

enter image description here

1

問題是axvline接受ymax(即座標軸座標,而不是數據座標)範圍爲0到1的值。從文檔:

ymax:標量,可選,默認爲1

應該是0和1,0之間的情節,1圖頂部的底部。

所以,你告訴它只能在座標軸上方0.1的位置繪製。如果您希望堅持使用axvline來繪製繪圖,您需要在繪製它們之前縮放這些值。

例如

fig=plt.figure(figsize=(10,10)) 
binom=[scs.binom.pmf(k,100,0.2) for k in range(100)] 
print(np.max(binom)) #0.0993002148088 
# Set ymax here 
ymax = 0.1 
# Scale the yvalues by ymax 
[plt.axvline(k,ymax=scs.binom.pmf(k,100,0.2)/ymax) for k in range(100)] 
# Use ymax again here 
plt.ylim(ymax=ymax) 

plt.show() 

或者,您可能想要看看使用plt.bar來製作此圖;例如:

plt.bar(range(len(binom)), binom) 
+0

好,不過這不是,如果我不得不重新大規模每次YMAX值非常方便。那我怎麼才能解決它通過使用plt.bar()? – 2Obe

+0

類似於:'plt.bar(範圍(len(binom),binom)'應該這樣做 – tom