Python科学计算:绘图2

本文介绍了使用Python的Matplotlib库进行数据可视化的几种方法,包括极坐标下的曲线绘制,误差条的添加以展示数据不确定性,以及等高线图的创建。此外,还展示了如何在同一个图上绘制多个函数图形,以及通过子图进行复合图形的布局,以提高数据比较的清晰度。
摘要由CSDN通过智能技术生成

今天来学一些花里胡哨的:

  1. 极坐标绘图;

我们使用极坐标并且使用来定义一条曲线,这个时候,使用极坐标系来绘图是最好的:

图一:极坐标系绘图

代码:

import turtle
import matplotlib.pyplot as plt
import numpy as np
theta=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.pi
r3=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()

然后他就会一直显示图片了

  1. 误差条

就是,如果你有一大串数据,但是你发现,你的数据和理论值是有误差的,那么这个时候,我们就要及时的得到误差情况的可视化,以方便我们能够更加直观的来获取相关信息,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 np
import matplotlib.pyplot as plt
import numpy.random as npr
import turtle
x=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()

图二:误差图

  1. 文本和注释:

你想知道图中某一点的相关信息,怎么搞呢,你就可以在坐标(x,y)开始的位置放置一个纯文本字符串,

这个就可以用np.text(x,y,'some plain')来解决:

x=np.linspace(0,2,101)
y=(x-1)**3-1
fig=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()

他这个代码有问题,输出不了和书上一摸一样的:

图三:代码有问题

  1. LATEX:

latex是指定好用,做出来的数学公司就是好:

对上面这个加一句看看:

ax.set_title(r'Formula:$z=x^2-y^2$')

图四:添加Latex标题之后的图片

  1. 等高线:

这个我有发言权,之前自己仿真的数据,拿matlab的等高线做的,感觉很丑,师兄当时说我颜色和样式没调整对,我也没怎么注意,今天来看看等高线:

import turtle
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as npr

fig=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**2
curves=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')

图八:加入色棒

行了,到最后了,其实,这些工具书里面讲的都是非常少的,他们要求的就是实用性强就行,要是说你想做出更漂亮的图片,我的建议还是看文档。

  1. 复合图形:就是多个图形在一个图上绘制,或者是说以子图的形式:

  1. 多个图形:书上的例子是非常简单的,我改了改:

就是一张图片上面显示两个或者两个以上的函数图像:

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来搞:

  1. 代码和上面的差不多,就是把fig搞了三个

图十:多幅图片显示

这三张fig输出之后,是叠在一块的,得手动给分开,这下清晰了,但是,麻烦不说,对比起来也不好对比,那怎么办呢,继续下一步,一个fig中用多个子图显示:

  1. 多个子图显示和前面的基础代码是一样的,但是,只有一个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是第几张。

图十一:组合子图输出

这下清晰好看了吧,可视化的目标也就达成了,好了,二维的就学到这里了,明天开始学习三维的绘图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值