用python构建数学模型,python数学实验与建模_1

  用python构建数学模型,python数学实验与建模

  

  三剑客之Matplotlib

  Matplotlib是python最著名的绘图库。它提供了一整套类似于Matlab的命令API,非常适合交互式绘图。它还可以方便地用作绘图控件并嵌入到GUI应用程序中。Matplotlib可以绘制各种形式的图形,包括普通线图、直方图、饼状图、散点图和误差图;可以方便地自定义图形的各种属性,如类型、颜色、粗细、字体大小等。它能很好地支持一些TeX排版命令,并能漂亮地以图形显示数学公式。

  更多关于Matplotlib的知识,请参考本文:《利用Python的Matplotlib库进行数据可视化》

  3.1 pylot介绍

  Matplotlib包含几十个不同的模块,如matlab、mathtext、finance、dates等。而pylot是我们最常用的绘图模块,这也是本文的重点。

  3.1.1 中文显示问题的解决方案

  解决这个问题的方法有很多,但下面这个方法恐怕是最简单的解决方法(我只在windows平台上测试过,其他平台请见官方自测)。如果想了解更多,也可以参考我n年前的博文:matplotlib显示中文的解决方案。

  importmatplotlib.pyplotasplt

  PLT . RC params[ font . sans-serif ]=[宋芳] #指定默认字体

  PLT . RC params[ 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 sine曲线写成正弦曲线。解码(“GBK”)或正弦曲线。解码(“UTF-8”)。

  importnumpyasnp

  importmatplotlib.pyplotasplt

  frompylabimportmpl

  mpl . RC params[ font . sans-serif ]=[宋芳]

  mpl . RC params[ 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={s

  ize':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)#两行两列的第1个位置

  >>>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)#两行两列的第2个位置

  >>>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)#两行一列的第2个位置

  >>>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条等值线。可以使用extent参数指定等值线图的X轴和Y轴的数据范围。

  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绘图)的特定函数的集合。

  比较流行的工具包有Basemap、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()

  盛行IT软件开发工作室,免费的在线学习python平台,欢迎关注!

  相关推荐:

  

1、Python数学建模三剑客之Numpy

  

2、Python数学建模三剑客之Scipy

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: