今天来学一些花里胡哨的:
极坐标绘图;
我们使用极坐标并且使用来定义一条曲线,这个时候,使用极坐标系来绘图是最好的:
图一:极坐标系绘图
代码:
import turtleimport matplotlib.pyplot as pltimport numpy as nptheta=np.linspace(0,2*np.pi,201)r1=np.abs(np.cos(5.0*theta)-1.5*np.sin(1.0*theta))r2=theta/np.pir3=2.25*np.ones_like(theta)fig=plt.figure()ax=fig.add_subplot(1,1,1,projection="polar")ax.plot(theta,r1,label="trig")ax.plot(5*theta,r2,label="sprial")ax.plot(theta,r3,label="circle")ax.legend(loc="best")fig.show()turtle.done()
注意,这里的turtle是我自己加的,因为我发现,fig.show()他就不显示图片,直接一闪而过,没饭看到图,查了之后,就加了两句:
import turtle#fig.show()turtle.done()
然后他就会一直显示图片了
误差条
就是,如果你有一大串数据,但是你发现,你的数据和理论值是有误差的,那么这个时候,我们就要及时的得到误差情况的可视化,以方便我们能够更加直观的来获取相关信息,Matplotlib提供了ax.errobar函数,他和plt.plot差不多,但是是包含其他额外的参数的,首先,y变量的误差用yerr来表示,假设y的长度是n,如果yerr有相同的维度,那么就会之对称的误差条,所以说,对于y[k]的第k个点,误差条从y[k]-yerr[k]到y[k]+yerr[k],如果误差不对称,那么yerr应该是一个2*n的数组,第k个误差条,从
y[k]-yerr[0,k]到y[k]-yerr[1,k],这是同样适用于x的误差和相应的xerr变量,默认情况下,颜色和现款由主曲线确定,也可以用ecolor、elinewidth来设定,其他的参数,可以参考文档
跟着书上的来写一下:
import numpy as npimport matplotlib.pyplot as pltimport numpy.random as nprimport turtlex=np.linspace(0,4,21)y=np.exp(-x)xe=0.08*npr.rand(len(x))ye=0.1*npr.rand(len(y))fig=plt.figure()ax=fig.add_subplot(1,1,1)ax.errorbar(x,y,fmt='bo',lw=2,xerr=xe,yerr=ye,ecolor='r',elinewidth=1)fig.show()turtle.done()
图二:误差图
文本和注释:
你想知道图中某一点的相关信息,怎么搞呢,你就可以在坐标(x,y)开始的位置放置一个纯文本字符串,
这个就可以用np.text(x,y,'some plain')来解决:
x=np.linspace(0,2,101)y=(x-1)**3-1fig=plt.figure()ax=fig.add_subplot(1,1,1)ax.plot(x,y)ax.annotate("point of inflection at ax=1",xy=(1,1),xytext=(0.8,0.5),arrowprops=dict(facecolor="black",width=1,shrink=0.05))fig.show()turtle.done()
他这个代码有问题,输出不了和书上一摸一样的:
图三:代码有问题
LATEX:
latex是指定好用,做出来的数学公司就是好:
对上面这个加一句看看:
ax.set_title(r'Formula:$z=x^2-y^2$')
图四:添加Latex标题之后的图片
等高线:
这个我有发言权,之前自己仿真的数据,拿matlab的等高线做的,感觉很丑,师兄当时说我颜色和样式没调整对,我也没怎么注意,今天来看看等高线:
import turtleimport numpy as npimport matplotlib.pyplot as pltimport numpy.random as nprfig=plt.figure()ax=fig.add_subplot(1,1,1)[X,Y]=np.mgrid[-1.5:2.5:51j,-1:3:61j]Z=X**2-Y**2curves=ax.contour(X,Y,Z,12,colors='k')ax.clabel(curves)ax.set_title(r'Formula:$z=x^2-y^2$',fontsize=20)fig.show()turtle.done()
图五:等高线绘制
12的意思就是话12条等高线,你看还可以画的更多,更好看,比如,我把等高线数量调成50,颜色调成蓝色:
图六:等高线数量和颜色修改
感觉有点像是用蓝色圆珠笔画的,哈哈
另外呢,你还可以填充等高线颜色,不过这个就是你另一个函数contourf了:
curves=ax.contourf(X,Y,Z,50)
图七:填充等高线
同时呢,你还可以加一个色棒来进行颜色对比:
fig.colorbar(curves,orientation='vertical')
图八:加入色棒
行了,到最后了,其实,这些工具书里面讲的都是非常少的,他们要求的就是实用性强就行,要是说你想做出更漂亮的图片,我的建议还是看文档。
复合图形:就是多个图形在一个图上绘制,或者是说以子图的形式:
多个图形:书上的例子是非常简单的,我改了改:
就是一张图片上面显示两个或者两个以上的函数图像:
x=np.linspace(0,2*np.pi,100)y=np.sin(x)z=np.tan(x)h=np.cos(x)plt.ion()fig=plt.figure()ax=fig.add_subplot(1,1,1)ax.plot(x,y,"b-")ax.plot(x,z,"r--")ax.plot(x,h,"g-.")ax.set_xlabel("x")ax.set_ylabel("y")ax.set_title("trigonometric function")fig.show()turtle.done()
图九:一张图片显示多个函数
但是,你有没有发现,几个叠在一起不好看啊,而且cos那个,emm,看不清,而且我故意没有加示例,整个图像看起来很不舒服,这在数据可视化中让人很难受,那就下一步,多个fig来搞:
代码和上面的差不多,就是把fig搞了三个
图十:多幅图片显示
这三张fig输出之后,是叠在一块的,得手动给分开,这下清晰了,但是,麻烦不说,对比起来也不好对比,那怎么办呢,继续下一步,一个fig中用多个子图显示:
多个子图显示和前面的基础代码是一样的,但是,只有一个fig:
x=np.linspace(0,2*np.pi,100)y=np.sin(x)z=np.tan(x)h=np.cos(x)l=np.exp(-x*2*np.pi)plt.ion()fig=plt.figure()ax=fig.add_subplot(2,2,1)ax.set_xlabel("x")ax.set_ylabel("y")ax.set_title("sin")ax.plot(x,y,"b-")ax1=fig.add_subplot(2,2,2)ax1.set_xlabel("x")ax1.set_ylabel("z")ax1.set_title("tan")ax1.plot(x,z,"r-")ax2=fig.add_subplot(2,2,3)ax2.plot(x,h,"g-"),ax2.set_xlabel("x")ax2.set_ylabel("h")ax2.set_title("cos")ax4=fig.add_subplot(2,2,4)ax4.plot(x,h,"y-"),ax4.set_xlabel("x")ax4.set_ylabel("l")ax4.set_title("exp(-x*2*pi)")fig.suptitle("some functuions")fig.show()turtle.done()#注意:这里的代码中(2,2,x)他实际上说的是总共2*2张图片,x是第几张。
图十一:组合子图输出
这下清晰好看了吧,可视化的目标也就达成了,好了,二维的就学到这里了,明天开始学习三维的绘图。