Python数学建模三剑客之Matplotlib
Matplotliblib,三剑客
matplotlib 它是python最著名的绘图库,它提供了一套类似于Matlab的命令API,非常适合互动绘图。它也可以很容易地嵌入到GUI应用程序中作为绘图控制器。matplotlib 可以绘制各种形式的图形,包括普通线图、直方图、饼图、散点图和误差线图;可以更方便地定制图形的各种属性,如图形线的类型、颜色、厚度、字体大小等;它可以很好地支持一部分 TeX 排版命令可以更漂亮地显示图形中的数学公式。
有关Matplotlib的更多知识,请参考本文:“使用PythonMatplotlib库进行数据可视化”
3.1 pylot介绍
Matplotlib 它包含几十个不同的模块, 如 matlab、mathtext、finance、dates 等,而 pylot 它是我们最常用的绘图模块,这也是本文介绍的重点。
3.1.1 中文显示问题的解决方案
有很多方法可以解决这个问题,但以下方法可能是最简单的解决方案(我只在windows平台上测试过,其他平台请参考官员自我测试)。如果你想知道更多,你也可以参考我几年前的一篇博客文章:matplotlib显示中文解决方案
>>>importmatplotlib.pyplotasplt >>>plt.rcParams['font.sans-serif']=['FangSong']#指定默认字体 >>>plt.rcParams['axes.unicode_minus']=False#解决图像保存问题'-'显示方块的问题
3.1.2 画出最简单的图形
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>x=np.arange(0,2*np.pi,0.01) >>>y=np.sin(x) >>>plt.plot(x,y) >>>plt.show()
3.1.3 设置标题、坐标轴名称、坐标轴范围
如果您在python的shell中运行以下代码,而shell的默认代码不是utf-8,则中文可能仍然显示为无序代码。你可以试试 u正弦曲线“正弦曲线” 写成 “正弦曲线”.decode(‘gbk’)或者正弦曲线“正弦曲线”.decode(‘utf-8’)
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>frompylabimportmpl >>>mpl.rcParams['font.sans-serif']=['FangSong'] >>>mpl.rcParams['axes.unicode_minus']=False >>>x=np.arange(0,2*np.pi,0.01) >>>y=np.sin(x) >>>plt.plot(x,y) >>>plt.title(u'正弦曲线',fontdict={'size':20})#设置标题 >>>plt.xlabel(u'弧度',fontdict={'size':16}#显示横轴名称 >>>plt.ylabel(u'正弦值',fontdict={'size':16}#显示纵轴名称 >>>plt.axis([-0.1*np.pi,2.1*np.pi,-1.1、1.1]#设置坐标轴范围 >>>plt.axis('equal')#保持xy轴等比 >>>plt.show()
3.1.4 设置点和线的样式、宽度和颜色
plt.plot函数的调用形式如下:
plot(x,y,color='green',linestyle='dashed',linewidth=1,marker='o',markerfacecolor='blue',markersize=6) plot(x,y,c='g',ls='--',lw=1,marker='o',mfc='blue',ms=6)
1、color指定线的颜色可以简写为“c"。颜色的选择如下:
·蓝色: ‘b’ (blue)
·绿色: ‘g’ (green)
·红色: ‘r’ (red)
·墨绿: ‘c’ (cyan)
·洋红: ‘m’ (magenta)
·黄色: ‘y’ (yellow)
·黑色: ‘k’ (black)
·白色: ‘w’ (white)
·灰度表示: e.g. 0.75 (0,1)任意浮点数)
·RGB表示法: e.g. #2F4F4F 或 (0.18, 0.31, 0.31)
1、linestyle指定线型可以简写为“ls"。线型选项如下:
·实线: ‘-’ (solid line)
·虚线: ‘–’ (dashed line)
·虚点线: ‘-.’ (dash-dot line)
·点线: ‘:’ (dotted line)
·无: '‘或’ ‘或’None’
1、linewidth指定的线宽可以简写为“lw”。
2、marker描述数据点的形状
·点线: ‘.’
·点线: ‘o’
·加号: '+
·叉号: ‘x’
·上三角: ‘^’
·上三角: ‘v’
1、markerfacecolor指定数据点标记的表面颜色 简写为“ mfc”。
2、markersize指定数据点标记的大小可以 简写为“ ms”。
3.1.5 文本标记和图例
我们用不同的线型和颜色画10、e、以2为基础的一组幂函数曲线,演示文本标记和图例的使用。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>frompylabimportmpl >>>mpl.rcParams['font.sans-serif']=['FangSong'] >>>mpl.rcParams['axes.unicode_minus']=False >>>x=np.linspace(-4,4,200) >>>f1=np.power(10,x) >>>f2=np.power(np.e,x) >>>f3=np.power(2,x) >>>plt.plot(x,f1,'r',ls='-',linewidth=2,label='$10^x$') >>>plt.plot(x,f2,'b',ls='--',linewidth=2,label='$e^x$') >>>plt.plot(x,f3,'g',ls=':',linewidth=2,label='$2^x$') >>>plt.axis([-4,4,-0.5,8] >>>plt.text(1,7.5,r'$10^x$',fontsize=16) >>>plt.text(2.2,7.5,r'$e^x$',fontsize=16) >>>plt.text(3.2,7.5,r'$2^x$',fontsize=16) >>>plt.title('力函数曲线',fontsize=16) >>>plt.legend(loc='upperleft') >>>plt.show()
在绘制图例时,loc用于指定图例的位置,可用的选项包括:
·best
·upper right
·upper left
·lower left
·lower right
3.2 绘制多轴图
在介绍如何在同一画板上绘制多幅子图的同时,演示如何绘制直线和矩形。我们可以用subplot函数快速绘制多轴图表。subplot函数的调用形式如下:
subplot(numRows,numCols,plotNum)
subplot将整个绘图区域分为numrows行 * numcols列出子区域,然后按照从左到右、从上到下的顺序对每个子区域进行编号,左上子区域的编号为1。如果numrows、numcols和plotnum都小于10,则可以将其缩写为一个整数,如subplot(323)和subplot(3、2、3)。subplot在plotnum指定的区域创建一个轴对象。如果新创建的轴与以前创建的轴重叠,则将删除以前的轴。
>>>importmatplotlib.pyplotasplt >>>plt.subplot(221)#两行两列第一个位置 >>>plt.axis([-1,2,-1,2] >>>plt.axhline(y=0.5,color='b') >>>plt.axhline(y=0.5,xmin=0.25,xmax=0.75,color='r') >>>plt.subplot(222)#两行两列第二个位置 >>>plt.axis([-1,2,-1,2] >>>plt.axvline(x=0,ymin=0,linewidth=4,color='r') >>>plt.axvline(x=1.0,ymin=-0.5,ymax=0.5,linewidth=4,color='g') >>>plt.subplot(212)#两行一列第二个位置 >>>plt.axis([-1,2,-1,2] >>>plt.axvspan(1.25,1.55,facecolor='g',alpha=0.5) >>>plt.axhspan(0.25,0.75,facecolor='0.5',alpha=0.5) >>>plt.show()
3.3 常用的绘图类型
3.3.1 直方图
用numpy随机生成符合正态分布的数据集,统计分段区域内数据的数量。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>data=np.random.normal(5.0,3.0,1000) >>>plt.hist(data) >>>bins=np.arange(-5,16,1) >>>plt.hist(data,bins)#使用自定义的分段区域 >>>plt.show()
3.3.2 散点图
使用plot()绘图时,如果指定样式参数仅绘制数据点(linestyle=‘None’),然后绘制一个散列图。该方法绘制的点不能单独指定数据点的颜色和大小,而散列图可以用scatter()绘制来指定每个点的颜色和大小。
plt.scatter函数的调用形式如下:
scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None, edgecolors=None,hold=None,data=None,**kwargs)
scatter()前两个参数是指定每个点X轴和Y轴坐标的数组。s参数指定点大 小,值与点的面积成正比,它可以是一个数字,指定所有点的大小,也可以是一个数组,分别指定每个点的大小。C参数指定每个点的颜色,可以是数值或数组。这里使用一维数组为每个点指定一个值。通过颜色映射表,每个值都对应于一种颜色。蓝色对应于默认颜色映射表中的最小值,红色对应于值。当c参数为形状时(N,3)或(N,4)在二维数组中,RGB的颜色直接表示在每个点。marker参数设置点的形状可以是表示形状的字符串,也可以是表示多边形的两个元素。第一个元素表示多边形边数,第二个元素表示多边形风格,值范围为0、1、2、3。0表示多边形,1表示星形,2表示放射形,3表示忽略边数,表示圆形。alpha参数设置点的透明度。facecolors参数“none说明散列点没有填充色。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>x=np.random.rand(50) >>>y=np.random.rand(50) >>>area=np.pi*(15*np.random.rand(50))**2 >>>color=2*np.pi*np.random.rand(50) >>>plt.scatter(x,y,s=area,c=color,alpha=0.5,cmap=plt.cm.hsv) >>>plt.show()
3.3.3 梯形图、柱形图、填充图
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>n=np.array(0,1,2,3,4,5) >>>x=np.linspace(-0.75,1.100) >>>plt.subplot(131) >>>plt.step(n,n**2,lw=2) >>>plt.subplot(132) >>>plt.bar(n,n**2,align="center",width=0.5,alpha=0.5) >>>plt.subplot(133) >>>plt.fill_between(x,x**2,x**3,color="green",alpha=0.5) >>>plt.show()
3.3.4 对数坐标
plot()所绘图表的X-Y轴坐标均为算术坐标。绘制对数坐标图有三个函数:semilogx()、semilogy()和loglog()分别绘制X轴为对数坐标、Y轴为对数坐标和两个轴为对数坐标时的图表。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>x=np.linspace(0,3,100) >>>y=np.power(2,np.power(2,x)) >>>plt.subplot(121) >>>plt.semilogy(x,y,'-r') >>>plt.subplot(122) >>>plt.plot(x,y,'--g') >>>plt.show()
3.3.5极坐标绘图
和笛卡尔是极坐标系(X-Y)坐标系是完全不同的坐标系,极坐标系中的点由一个夹角组成与相对中心点的距离表示。polar(theta, r, **kwargs)您可以直接创建极坐标子图并在其中绘制曲线。您也可以在程序中调用subplot()创建子图时设置子图。 polar参数为true,创建极坐标子图,然后调用plot()在极坐标子图中绘图。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>theta=np.arange(0,2*np.pi,0.02) >>>plt.polar(theta,1.4*np.cos(5*theta),"--",linewidth=2) >>>plt.polar(theta,1.8*np.cos(4*theta),linewidth=2) >>>plt.rgrids(np.arange(0.5,2,0.5),angle=45) >>>plt.thetagrids([0,45])thetagridlabelobjects>) >>>plt.show() >>>
3.4 2D绘图
3.4.1 等值线图
所谓等值线,是指由函数值相等的各点连接而成的平滑曲线。等值线可以直观地表示二元函数值的变化趋势,例如,等值线密集的地方表示函数值在这里变化很大。在matplotlib中,可以使用contour()和contourf()来描述等值线。它们之间的区别是:contourf()获得具有填充效果的等值线。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>y,x=np.ogrid[-2:2:200j,-3:3:300j] >>>z=x*np.exp(-x**2-y**2) >>>extent=[np.min(x),np.max(x),np.min(y),np.max(y)] >>>plt.subplot(121) >>>cs=plt.contour(z,10,extent=extent) >>>plt.clabel(cs) <alistof8text.Textobjects> >>>plt.subplot(122) >>>plt.contourf(x.reshape(-1),y.reshape(-1),z,20) >>>plt.show()
为了更清楚地区分X轴和Y轴,它们的值范围和等分次数是不同的。这是必要的 数组z的形状是(200, 300),其第0轴对应Y轴,第1轴对应X轴。
调用contour()绘制数组z的等值线图,第二个参数为10,表示整个函数的值范围分为10个范围,即显示的等值线图中将有9条等值线。X轴和Y轴的数据范围可以用extent参数指定等值线图。
contour()QuadContourSet对象返回, 将其传递给clabel(),为等值线标上相应的值。
调用contourf(),绘制具有填充效果的等值线图,将取值范围等分为20份。这里演示了另一个设置X、Y轴取值范围的方法,其前两个参数是计算数组z时使用的X轴和Y轴上的取样点,这两个数组必须是一维的。
3.4.2 二维数据的平面颜色显示
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>data=np.clip(np.random.randn(5,5),-1,1) >>>plt.subplot(221) >>>plt.imshow(data) >>>plt.subplot(222) >>>plt.imshow(data,cmap=plt.cm.cool) >>>plt.subplot(223) >>>plt.imshow(data,cmap=plt.cm.hot) >>>plt.colorbar() >>>plt.subplot(224) >>>im=plt.imshow(data,cmap=plt.cm.winter) >>>plt.colorbar(im,cmap=plt.cm.winter,ticks=[-1,0,1]) >>>plt.show()
3.5 3D绘图
虽然matplotlib主要专注于绘图和二维图形,但它也有一些不同的扩展,可以让我们在地理图上绘图。让我们将Excel和3D图表结合起来。在matplotlib的世界里,这些扩展被称为工具包(toolkits)。工具包是专注于某一主题(如3D绘图)的特定函数的集合。
Basemapp包括流行的工具、GTK Excel工具,工具,Natgrid、AxesGrid和mplot3d。
mpl_toolkits.mplot3工具包提供了一些基本的3D绘图功能,其支持的图表类型包括散点图(scatter)、曲面图(surf)、线图(line)和网格图(mesh)。虽然mplot3d不是最好的3D图形绘制库,但它是伴随着matplotlib生成的,所以我们已经熟悉了它的界面。
以下是用plot_surface绘制3d曲面图的例子。
>>>importnumpyasnp >>>importmatplotlib.pyplotasplt >>>importmpl_toolkits.mplot3d >>>x,y=np.mgrid[-2:2:50j,-2:2:50j] >>>z=x*np.exp(-x**2-y**2) >>>ax=plt.subplot(111,projection='3d') >>>ax.plot_surface(x,y,z,rstride=2,cstride=1,cmap=plt.cm.coolwarm,alpha=0.8) >>>ax.set_xlabel('x') >>>ax.set_ylabel('y') >>>ax.set_zlabel('z') >>>plt.show()
python学习网,免费在线学习python平台,欢迎关注!
相关推荐:
1、Numpypython数学建模三剑客
2、Scipyython数学建模三剑客