1. 程式人生 > 實用技巧 >matplotlib 畫出正太分佈圖 , alpha beta 引數 , 填充斜線, fill between(), 任意位置新增數學符號,新增直線

matplotlib 畫出正太分佈圖 , alpha beta 引數 , 填充斜線, fill between(), 任意位置新增數學符號,新增直線

#object: 畫出兩個正太分佈圖,並標出效應量,置信水平,幫楊海波老師做的圖
#writer: mike
#time:2020,11,17

import numpy as np
import matplotlib.pyplot as plt
import math

#均值
u = 0  
u2 = 2
#標準差
sig = math.sqrt(1)  
sig01 = math.sqrt(1)

#製作橫座標
x = np.linspace(u - 3*sig, u + 3*sig, 50)
x_01 = np.linspace(u2 - 3 * sig, u2 + 3 * sig, 50)

#製作縱座標
y_sig 
= np.exp(-(x - u) ** 2 /(2* sig **2))/(math.sqrt(2*math.pi)*sig) y_sig01 = np.exp(-(x_01 - u2) ** 2 /(2* sig01 **2))/(math.sqrt(2*math.pi)*sig01) # print(x_01[21]) # print(x[37]) #畫出一條線 #找到那條直線的橫座標與縱座標 #找到橫座標等於1.5附近的那個點,那個點是第37個點 # print(np.where(x>1.5)) # print(np.where(x<1.6)) #只能用這種方法確定兩個範圍之間的點 #那麼它的縱座標對應的也是第37個點 xL
= [x[37],x[37]] yL = [0,y_sig[37]] #上面是對於一個曲線來說,那麼對於另一條曲線呢, # print(np.where(x_01>1.5)) # print(np.where(x_01<1.6)) #結果是第21個點 xL2 = [x_01[21],x_01[21]] yL2 = [0,y_sig01[21]] #畫出直線直接用plot函式,畫出的圖是最高的哪一個圖 plt.plot(xL2,yL2,color="red") #畫出指向alpha, beta 引數值的虛線 #首先固定住座標,alpha的座標(2,0.05) 到(2.5,1),beta的座標(1
,0.05)到(-0.5,1)這兩個座標是用肉眼看出來的 alphaLx = [2.3,2.7] alphaLy = [0.03,0.07] betaLx = [-0.4,-1] betaLy = [0.02,0.06] #畫出這兩條虛線,這是用一條語句畫出了兩條直線,難道說對型別的設定只能設定一次嗎? # 如果是使用linestyle就是隻能設定一次,如果使用‘’,就可以設定多次,為什麼呢? plt.plot(alphaLx,alphaLy,"-",betaLx,betaLy,'-') #新增均值上的虛線 #找到均值位置上的縱座標 # print(np.where(x>0)[0]) # print(np.where(x<0)[-1]) # print(np.where(x_01>2)[0]) # print(np.where(x_01<2)[-1]) #這是找到的點,這是關於第一個圖的 meanLx = [x[25],x[25]] meanLy = [0,y_sig[25]] #找到關於第二個圖的點 meanLx2 = [x_01[25],x_01[25]] meanLy2 = [0,y_sig01[25]] #畫出均值的虛線圖,這是一個語句畫出了兩個圖 plt.plot(meanLx,meanLy,'--',meanLx2,meanLy2,'--') #在圖中的任意位置新增文字性的說明,注意這是text的用法 plt.text(2.7,0.07,r'$\alpha$') plt.text(-1,0.06,r'$\beta$') #一張圖裡,使用兩個plot那麼兩個橫座標的範圍都會包括 plt.plot(x, y_sig, "r-", linewidth=2) plt.plot(x_01, y_sig01, "g-", linewidth=2) #print(x[33:]) #首先對在下方的曲線進行填充, 注意interpolate會自動補全顏色的空隙,但是好像沒什麼用 res5 = plt.fill_between(x[37:],0,y_sig[37:],hatch="//",color="green",alpha=0.3,interpolate=True) #其次對第二個圖進行填充,注意這裡是從[:22]開始,因為如果是[:21]那麼就不會包括21號數字。這是列表的下表的表示方法 res6 = plt.fill_between(x_01[:22],0,y_sig01[:22],hatch="\\\\",color="blue",alpha=0.3,interpolate=True) #res5.set_hatch(hatch="//") #print(x[1:]) #將網格去掉 #plt.grid(True) plt.show()

對 fill_ between () 的理解

它的橫座標只有一個,而縱座標有兩個,怎麼理解呢,應該從列表的角度去理解,就像使用plot 函式,它的橫座標與縱座標的列表是意義對應的關係,因此

如果在圖形中,兩條曲線使用了不同的橫座標,那麼在 fill_between() 函式中,只用某一個曲線的橫座標,那麼就會將一個橫座標的列表去對應兩個縱座標的列表,這樣就會出現亂圖,我就做出了這樣的亂圖。那麼該怎麼解決呢,應該將兩個曲線的填充分別進行。各畫個的。在網上的教程中,也是,本身兩個曲線就是用的同一個橫座標因此,他們才能使用一個橫座標那樣畫圖。