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() 函數中,只用某一個曲線的橫坐標,那么就會將一個橫坐標的列表去對應兩個縱坐標的列表,這樣就會出現亂圖,我就做出了這樣的亂圖。那么該怎么解決呢,應該將兩個曲線的填充分別進行。各畫個的。在網上的教程中,也是,本身兩個曲線就是用的同一個橫坐標因此,他們才能使用一個橫坐標那樣畫圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM