目录python
(1)建立画布
figure()建立一个空白画布,能够指定画布的大小figsize和设置分辨率dpi数组
plt.figure() plt.figure(figsize=(8,6),dpi=80) #(8,6)表明图像的长和宽单位是英寸,dpi表明分辨率
(2)建立子图
figure.add_subplot方法用来建立子图,也能够直接使用subplot.ide
fig=plt.figure() fig.add_subplot(2,2,1) 或 subplot(2,2,1) 例如: plt.figure() x=np.linspace(-np.pi,np.pi,100) y1=np.sin(x) y2=np.cos(x) plt.subplot(211) #表示2x1的画布中的第一个 plt.plot(x,y1,'-r') plt.title('sin') plt.subplot(212) #等同 fig.add_subplot(212) 2x1画布中第二个 plt.title('cos') plt.plot(x,y2,'-.b') plt.show()
(3)添加画布内容
注意:
对于中文乱码问题,能够在做图以前添加以下代码:函数
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False
添加图例必定是在绘图(plot)以后,设置标签等和绘图没有前后顺序,而且图例中的顺序和绘图的顺序一致。字体
函数 | 做用 |
---|---|
plt.title | 添加标题 |
plt.xlabel | 设置x轴的名称 |
plt.ylabel | 设置y轴的名称 |
plt.xlim | 设置x轴的范围(参数是上下限的tuple) |
plt.ylim | 设置y轴的范围 |
plt.xticks | 设置x轴的刻度数目和取值(参数是list)【其参数rotation表明倾斜角度】 |
plt.yticks | 设置y轴的刻度数目和取值 |
plt.legend | 设置图例 |
plt.grid | 设置网格线 |
示例(应用上面的所有设置):spa
%matplotlib inline import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False fig=plt.figure() plt.title('sin&cos') x=np.linspace(-np.pi,np.pi,100,endpoint=False) y1=np.sin(x) y2=np.cos(x) plt.plot(x,y1,'-r') #实线 plt.plot(x,y2,'-.b') #虚线 a=[-np.pi,-1/2*np.pi,0,1/2*np.pi,np.pi] label=[r'$-\pi$',r'$-\pi/2$',0,r'$\pi/2$',r'$\pi$'] #使用laTex plt.xticks(a,label) #设置x轴的记号,若是仅有a,则为设置x轴的ticks,其还有个参数rotation表明倾斜角度,若是x轴的刻度标签太长能够设置角度让其倾斜,例如rotation=45,表明倾斜45度 plt.xlim((0,np.pi)) #设置x轴的显示范围[0,pi) plt.xlabel('x的取值') plt.ylabel('y的值') plt.grid(linestyle=':',color='y')#添加背景网格线 plt.legend(['sin','cos'],loc='lower left') #调整图例的位置在左下,注意图例中的sin,与cos对应绘图时的顺序 plt.show()
结果:
(4)保存与显示图形
savefig能够用来保存绘制的图形
show()用来显示图形3d
plt.savefig('1.png') #能够添加路径
散点图能够利用scatter函数来绘制,这个是专门绘制散点图的,也可使用plot函数来绘制。
利用plot直接将关于链接线的部分去掉,加上marker部分就能够了就由折线图变成了散点图,对于上面例子中的:code
plt.plot(x,y1,'-r') 将其改成 plt.plot(x,y1,'ro') 就变成了散点图(用o表明点) 也能够经过scatter函数 plt.scatter(x,y1,c='r',marker='o')
结果:
blog
对于3D图的绘制须要引入from mpl_toolkits.mplot3d import Axes3D
3D图和2D图的区别就是将x和y进行了meshgrid操做
对于meshgrid函数的做用是将x,y向量 编织成二维的栅格.
例如:
二维坐标系中X轴的取值是1,2,3,而Y轴的取值是4,5,那么能够得到(1,4)(1,5)
(2,4)(2,5)
(3,4)(3,5)这些坐标,这就构成了一个二维的网格,而meshgrid的做用就是这个。图片
%matplotlib inline import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False a=np.array([1,2,3]) b=np.array([4,5]) c,d=np.meshgrid(a,b) #c[[1,2,3],[1,2,3]] d[[4,4,4],[5,5,5]] e=np.array([[1,2,1],[7,8,9]]) fig=plt.figure() #在画布上添加3D坐标轴 ax=Axes3D(fig) #画出3d图:rstride 和 cstride 分别表明 row 和 column 的跨度,通常选择默认就行,不设置。 ax.plot_surface(c,d,e,rstride=1,cstride=1,cmap='rainbow') ax.scatter(c, d,e, c = 'g', marker = '^') #将点标出来
结果:
我感受对于3D图的绘制,由于此时x轴和y轴都是二维数组,按照2d中二维数组绘图时,会对以对其进行横向分割的方式,而后去进行链接。对于3d中,首先就是根据横向分割,而后按照构成点的顺序进行链接,而后再根据纵向分割,而后按照构成点的顺序进行链接,这样就链接成了3d图。对于3D图的绘制只须要作的就是构成网格矩阵,而后根据x,y的值去求z的值,这样x,y,z所有有了后就能够对其绘制三维图。
注意:
当x和y是二维数组时,会对以对其进行横向分割的方式,而后去进行链接。
x=np.array([[0,0.5,1],[0,0.5,1],[2,1,4]]) y=np.array([[0,0,0],[1,1,1],[3,3,4]]) plt.plot(x,y,'-rx') 按照(0,0)(0,1)(2,3)链接,而后再(0.5,0)(0.5,1)(1,3)以此类推.
2D的结果:
三维的话就至关于多了个z,设z=np.array([[0,1,2],[1,2,3],[4,5,6]]) 那么绘图能够理解为: 按照(0,0,1)(0.5,1,1)(2,3,4)连结,而后再(0.5,0,1)(0.5,1,2)(1,3,5)以此类推,而后再横向(0,0,1)(0.5,0,1)(1,0,2)链接,以此类推。 能够理解成横向分割后链接,而后再纵向分割后链接。
等高线图:
plt.figure() plt.xlabel(r'$\theta_0$') plt.ylabel(r'$\theta_1$') theta0_val=np.linspace(-10,10,100) theta1_val=np.linspace(-1,4,100) xs,ys=np.meshgrid(theta0_val,theta1_val) #使用contour生成三维结构表面的等值线图, np.logspace(-2,3,20)表明z值10^-2到10^3的20元素的等比数列,即那些等高线 CS = plt.contour(xs, ys, J_val, np.logspace(-2,3,20)) #最后加入Label,inline控制是否将Label画在线里面,字体大小为10。 plt.clabel(CS, inline=1, fontsize=10) # 绘制最优解 plt.plot(theta[0,0], theta[1,0], 'rx', markersize=10, linewidth=2) #theta[0,0], theta[1,0]为最优解的值 plt.show()
结果: