1 说明:
======
1.1 python的matplotlib画直线,看似简单,其实很难,从简单到复杂,逐步深入,小白秒懂。
1.2 内容:画直线,画圆,画圆点,动画的单摆和圆套圆,好东西在后面,值得收藏。
1.3 环境:
python3.8+matplotlib3.2.0
2 静态画直线:
=======
2.1 line-1.py
import matplotlib.pyplot as pltimport numpy as npx = np.linspace(-3,3,100)y = 2*xplt.plot(x, y, '-r', label='y=2x')plt.show()
2.2 图1
2.2 line2.py
import matplotlib.pyplot as pltimport numpy as np#坐标点为0,0x = np.linspace(0,3,100)y = xplt.plot(x, y, '-r', label='y=x')#显示x和y坐标轴刻度起点和终点plt.xlim(-4, 4)plt.ylim(-4, 4)plt.show()
2.3 图2:
2.4 复杂一些,加入画圆、画直线和画圆点,代码如下:
#第1步:导入模块import matplotlib.pyplot as pltimport numpy as np#第2步:画圆#定义圆的半径r=3.0#角度theta = np.arange(0, 2*np.pi, 0.01)#圆的圆弧线的x和y坐标x = r * np.cos(theta)y = r * np.sin(theta)#画圆的圆弧线,因为直线很小,所以就是圆的圆弧看起来很平滑plt.plot(x, y)#第3步:画直线#画直线的坐标点为0,0x1 = np.linspace(0,3,100)y1 = x1#画直线plt.plot(x1, y1, '-r')#补充:画原点==圆点plt.scatter(0, 0, marker="o",c='r')#第4步:相关设置#显示x和y坐标轴刻度起点和终点plt.xlim(-4, 4)plt.ylim(-4, 4)plt.title('Graph of circle、line & scatter')plt.grid()plt.axis('equal')plt.show()
2.5 图3:
3 动态直线:
========
3.1 圆和单摆,代码:
#第1步:导入模块import numpy as npfrom scipy.integrate import odeintimport matplotlib.pyplot as pltimport matplotlib.animation as animation#第2步:初始化画布和ax定义#注意动画需要这个,静态图片可以省略,采用默认fig, ax = plt.subplots()ax.grid() #显示网格#第3步:画圆#定义圆的半径r=3.0#角度theta = np.arange(0, 2*np.pi, 0.01)#圆的圆弧线的x和y坐标x = r * np.cos(theta)y = r * np.sin(theta)#画圆的圆弧线plt.plot(x, y)#第4步:单摆设置g = 9.8 #重力 #无阻力函数定义def pendulumno(w, t, l): th, v = w dth = v dv = - g/l * np.sin(th) return dth, dv #20==20秒t = np.arange(0, 20, 0.1)#调用scipy的一个函数odeinttrack = odeint(pendulumno, (1.0, 0), t, args=(r,))xdata = [r*np.sin(track[i, 0]) for i in range(len(track))]ydata = [-r*np.cos(track[i, 0]) for i in range(len(track))]#画单摆线line, = ax.plot([], [], 'o-', lw=2)#初始化函数def init(): ax.set_xlim(-4, 4) ax.set_ylim(-4, 4) return line,#刷新函数def update(i): #提示0,0为直线的圆点坐标是不变的 newx = [0, xdata[i]] newy = [0, ydata[i]] line.set_data(newx, newy) return line,#第5步:相关设置plt.title('Graph of circle & pendulumno')plt.axis('equal')ani = animation.FuncAnimation(fig, update, range(1, len(xdata)), init_func=init, interval=50)plt.show()
3.2 效果图:
4 圆和可转动的半径:
===============
4.1 代码:
#第1步:导入模块import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation#第2步:初始化画布和ax定义#注意动画需要这个,静态图片可以省略,采用默认fig, ax = plt.subplots()ax.grid() #显示网格#第3步:画圆#定义圆的半径r=3.0#角度theta = np.arange(0, 2*np.pi, 0.01)#圆的圆弧线的x和y坐标x = r * np.cos(theta)y = r * np.sin(theta)#画圆的圆弧线plt.plot(x, y)#第4步:单摆设置#半径直线数据xdata = [r*np.sin(theta[i]) for i in range(len(theta))]ydata = [r*np.cos(theta[i]) for i in range(len(theta))]#画半径直线line, = ax.plot([], [], 'o-', lw=2)#初始化函数def init(): ax.set_xlim(-4, 4) ax.set_ylim(-4, 4) return line,#刷新函数def update(i): #提示0,0为直线的圆点坐标是不变的 newx = [0, xdata[i]] newy = [0, ydata[i]] line.set_data(newx, newy) return line,#第5步:相关设置plt.title('Graph of circle & radius')plt.axis('equal')ani = animation.FuncAnimation(fig, update, range(1, len(xdata)), init_func=init, interval=10)plt.show()
4.2 效果图:
===再复杂一些===
5 加入sin和cos:
============
5.1 代码:
#第1步:导入模块import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation#第2步:初始化画布和ax定义#注意动画需要这个,静态图片可以省略,采用默认fig, ax = plt.subplots()ax.grid() #显示网格#第3步:画圆#定义圆的半径r=3.0#角度theta = np.arange(0, 2*np.pi, 0.01)#圆的圆弧线的x和y坐标#水平向左移动4个单位x = -4+r * np.cos(theta)y = r * np.sin(theta)#画圆的圆弧线plt.plot(x, y)#第4步:画线设置#半径直线数据xdata = [-4+r*np.sin(theta[i]) for i in range(len(theta))]ydata = [r*np.cos(theta[i]) for i in range(len(theta))]#画半径直线line, = ax.plot([], [], 'o-', lw=2)#sin波动线linesin, = ax.plot([], [], lw=2)#cos波动线linecos, = ax.plot([], [], lw=2)#初始化函数def init(): ax.set_xlim(-4, 4) ax.set_ylim(-4, 4) #sin和cos线 linesin.set_data([], []) linecos.set_data([], []) return line,linesin,linecos, #刷新函数def update(i): #提示0,0为直线的圆点坐标是不变的 newx = [-4, xdata[i]] newy = [0, ydata[i]] line.set_data(newx, newy) #+1就是水平向右移动1个单位 sinx = 1+np.linspace(0, 4, 1000) siny = 2+np.sin(2 * np.pi * (sinx - 0.01 * i)) linesin.set_data(sinx, siny) #+1就是水平向右移动1个单位 cosx = 1+np.linspace(0, 4, 1000) cosy = -2+np.cos(2 * np.pi * (cosx - 0.01 * i)) linecos.set_data(cosx, cosy) return line,linesin,linecos,#第5步:相关设置plt.title('Graph of circle、radius、sin & cos')plt.axis('equal')ani = animation.FuncAnimation(fig, update, range(1, len(xdata)), init_func=init, interval=10)plt.show()
5.2 效果图:
6 再复杂些:
========
6.1 代码:
#第1步:导入模块import numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation#第2步:初始化画布和ax定义#注意动画需要这个,静态图片可以省略,采用默认fig, ax = plt.subplots()ax.grid() #显示网格#第3步:画圆#定义圆的半径r=3.0#角度,0.01越小,速度越慢theta = np.arange(0, 2*np.pi, 0.01)#圆的圆弧线的x和y坐标#水平向左移动4个单位x = -4+r * np.cos(theta)y = r * np.sin(theta)#画圆的圆弧线plt.plot(x, y)#第4步:直线设置#半径直线数据xdata = [-4+r*np.sin(theta[i]) for i in range(len(theta))]ydata = [r*np.cos(theta[i]) for i in range(len(theta))]#画半径直线line, = ax.plot([], [], 'o-', lw=2)#sin波动线linesin, = ax.plot([], [], lw=2,label='sin')#cos波动线linecos, = ax.plot([], [], lw=2,label='cos')#连接sin和cos的线linesinl, = ax.plot([], [], 'o-', lw=2,label='sinline')linecosl, = ax.plot([], [], 'o-', lw=2,label='cosline')#水平线==lineshui==xs和ysxs = np.linspace(-6,6,100)ys =[0]*len(xs)plt.plot(xs, ys, '-b', label='lineshui')#垂直线==linechui==xc和ycyc = np.linspace(-4,4,100)xc =[0]*len(yc)plt.plot(xc, yc, '-y', label='linechui')#初始化函数def init(): ax.set_xlim(-4, 4) ax.set_ylim(-4, 4) #sin和cos的动态波动线 linesin.set_data([], []) linecos.set_data([], []) #sin和cos的连接线 linesinl.set_data([], []) linecosl.set_data([], []) return line,linesin,linecos, linesinl,linecosl,#刷新函数def update(i): #提示-4,0为直线的圆点坐标是不变的 newx = [-4, xdata[i]] newy = [0, ydata[i]] #圆的半径直线 line.set_data(newx, newy) #+1就是水平向右移动1个单位 sinx = 1+np.linspace(0, 4, 1000) siny = 2+np.sin(2 * np.pi * (sinx - 0.01 * i)) #sin波动线 linesin.set_data(sinx, siny) #+1就是水平向右移动1个单位 cosx = 1+np.linspace(0, 4, 1000) cosy = -2+np.cos(2 * np.pi * (cosx - 0.01 * i)) #cos波动线 linecos.set_data(cosx, cosy) newxsinl=[1,xdata[i]] newysinl=[siny[i],ydata[i]] #sin连接线,bug linesinl.set_data(newxsinl,newysinl) newxcosl=[1,xdata[i]] newycosl=[cosy[i],ydata[i]] #cos连接线,bug linecosl.set_data(newxcosl,newycosl) return line,linesin,linecos,linesinl,linecosl,#第5步:相关设置plt.title('Graph of circle、radius、sin & cos')plt.axis('equal')ani = animation.FuncAnimation(fig, update, range(1, len(xdata)), init_func=init, interval=10)plt.legend(loc='upper right')plt.show()
6.2 效果图: