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