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'$eta$')


#一张图里,使用两个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() 函数中,只用某一个曲线的横坐标,那么就会将一个横坐标的列表去对应两个纵坐标的列表,这样就会出现乱图,我就做出了这样的乱图。那么该怎么解决呢,应该将两个曲线的填充分别进行。各画个的。在网上的教程中,也是,本身两个曲线就是用的同一个横坐标因此,他们才能使用一个横坐标那样画图。

原文地址:https://www.cnblogs.com/zijidefengge/p/13999062.html