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() 函数中,只用某一个曲线的横坐标,那么就会将一个横坐标的列表去对应两个纵坐标的列表,这样就会出现乱图,我就做出了这样的乱图。那么该怎么解决呢,应该将两个曲线的填充分别进行。各画个的。在网上的教程中,也是,本身两个曲线就是用的同一个横坐标因此,他们才能使用一个横坐标那样画图。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律