Python 学习
提示:刚刚开始用python,希望慢慢学习,慢慢记录
提示:以下是本篇文章正文内容,下面案例可供参考
一、Python 数值积分函数
Python 提供了很多种用于不同情况下的积分函数
scipy.integrate.quad: 一重积分
scipy.integrate.dblquad: 二重积分
scipy.integrate. 三重积分
scipy.integrate.nquad: 多重积分
二、scipy.integrate.dblquad
关于 scipy.integrate.dblquad 的用法。
scipy.integrate.dblquad(func, a, b, gfun, hfun, args=(), epsabs=1.49e-08, epsrel=1.49e-08)
Compute a double integral.
Return the double (definite) integral of func(y, x) from x = a…b and y = gfun(x)…hfun(x).
Parameters
funccallable
A Python function or method of at least two variables: y must be the first argument and x the second argument.
a, bfloat
The limits of integration in x: a < b
gfuncallable or float
The lower boundary curve in y which is a function taking a single floating point argument (x) and returning a floating point result or a float indicating a constant boundary curve.
hfuncallable or float
The upper boundary curve in y (same requirements as gfun).
argssequence, optional
Extra arguments to pass to func.
epsabsfloat, optional
Absolute tolerance passed directly to the inner 1-D quadrature integration. Default is 1.49e-8. dblquad` tries to obtain an accuracy of abs(i-result) <= max(epsabs, epsrel*abs(i)) where i = inner integral of func(y, x) from gfun(x) to hfun(x), and result is the numerical approximation. See epsrel below.
epsrelfloat, optional
Relative tolerance of the inner 1-D integrals. Default is 1.49e-8. If epsabs <= 0, epsrel must be greater than both 5e-29 and 50 * (machine epsilon). See epsabs above.
Returns
yfloat
The resultant integral.
abserrfloat
An estimate of the error.
from scipy import integrate
f = lambda y, x: x*y**2
integrate.dblquad(f, 0, 2, lambda x: 0, lambda x: 1)
(0.6666666666666667, 7.401486830834377e-15)
三、Python Lambda
Python 的 Lambda 函数是一种小的匿名函数。
其语法结构为:
Lambda arguments: expression
其中 arguments 可以是多个参数,但是 expression 只有一个。比如
Lambda x: f(x)
Lambda x,y: f(x,y)
Lambda x,y,z: f(x,y,z)
上述代码等价于
def g(x):
return f(x)
def g(x,y):
return f(x,y)
def g(x,y,z):
return f(x,y,z)
例子:
print(Lambda x: x+1(1))
g=Lambda x: x+1
print(g(1))
输出将为
2
2
原因是x=1,x+1=2。
四、 matplotlib
1、 利用plt.plot 画图
利用 plt.plot 画图的步骤
import matplotlib.pyplot as plt
plt.figure(figuresize=(6,10)) #生成一个大小为(6,10)的画布,之后都在该画布上画图
plt.plot(A,B,color='k--',label=r'name')# A是横轴列表,B是对应的纵轴列表,k代表黑色,--代表虚线,lable:给出图例标签
plt.xlabel(r'$x$', labelpad=10,fontsize=15)# 给出x轴轴标,支持Latex语法,labelpad代表轴标的所占大小,fontsize字体大小
plt.ylable(r'$y$', labelpad=10,fontsize=15)
plt.xlim(x0,x1)#x轴的的上下限
plt.ylim(y0,y1)#y轴的的上下限
plt.text(xt,yt,r'text',fontsize=15)#图中添加文本,(xt,yt):文本位置,text:所加文本, fontsize: 文本大小
plt.legend()#显示图例
plt.save('dir')#保存图片到指定地址dir
plt.show() #显示图
#plt.loglog(A,B,color='c')
2、 利用fig. 和 ax. 画图
Python 画图有两种方法,其中一种是上述介绍的plt.plot 的方法。还有一种是利用fig. 和ax. 的方法。
名词解释 in matplotlib
从 matplotlib 官方 借了个图
关于 Figure 和Axes 的官方解释为:
Figure
The whole figure (marked as the outer red box). The figure keeps track of all the child Axes, a smattering of ‘special’ artists (titles, figure legends, etc), and the canvas. (Don’t worry too much about the canvas, it is crucial as it is the object that actually does the drawing to get you your plot, but as the user it is more-or-less invisible to you). A figure can have any number of Axes, but to be useful should have at least one.
The easiest way to create a new figure is with pyplot:
fig = plt.figure() # an empty figure with no axes
fig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes
Axes
This is what you think of as ‘a plot’, it is the region of the image with the data space (marked as the inner blue box). A given figure can contain many Axes, but a given Axes object can only be in one Figure. The Axes contains two (or three in the case of 3D) Axis objects (be aware of the difference between Axes and Axis) which take care of the data limits (the data limits can also be controlled via set via the set_xlim() and set_ylim() Axes methods). Each Axes has a title (set via set_title()), an x-label (set via set_xlabel()), and a y-label set via set_ylabel()).
fig = plt.figure()
可以解释为画布。画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。
ax = fig.add_subplot(1,1,1)
不想定义,没法定义,就叫他axes!
首先,这个不是你画图的xy坐标抽!
希望当初写这个lib的时候他们用一个更好的名字。。。
可以把axes理解为你要放到画布上的各个物体。比如你要画一个太阳,一个房子,一个车在画布上,那么太阳是一个axes,房子是一个axes,etc。 如果你的figure只有一张图,那么你只有一个axes。如果你的figure有subplot,那么每一个subplot就是一个axes
axes是matlibplot的宇宙中心!axes下可以修改编辑的变量非常多,基本上能包含你的所有需求。
Axis ax.xaxis/ax.yaxis: 对,这才是你的xy坐标轴。每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。
图像的各个部位名称
再从使用指南 User Guide 借个图。
每个部分的名称指南,这样当你想修改一个部位的时候,起码知道关键字啊。
一步一步来,用传统方法画个图
下面就是实战。用调取ax的方式来画个图。不要用plt!!
Import library and data for ploting
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
A = np.arange(1,5)
B = A**2
C = A**3
首先,搞个画布
我喜欢用这个命令来开始画图。哪怕你没有subplot,也可以用这个subplots来创建一个画布。
这个function创建了一个大小为(14,7)的画布,把这个画布赋值给变量fig,同时在这个画布上创建了一个axes,把这个axes赋值给ax。这样,所有未来的http://fig.xxx都是对这个画布的操作,所有http://ax.xxx都是对这个axes的操作。
如果你有两个图,那么ax是一个有两个元素ax[0],ax[1] 的list。ax[0]就对应第一个subplot的ax。
fig, ax = plt.subplots(figsize=(14,7))
fig, ax = plt.subplots(2,1,figsize(14,7))
ax[0].***
ax[1].***
好了画布搞好了,画数据。
注意,我们这里依然不使用plt!因为我们要在这个axes上画数据,因此就用ax.plot()来画。画完第一个再call一次,再画第二个。
ax.plot(A,B)
ax.plot(B,A)
下面开始细节的处理
数据画好了就可以各种细调坐标轴啊,tick啊之类的。
首先把标题和xy坐标轴的标题搞定。Again, 不用plt。直接在axes上进行设定。
ax.set_title('Title',fontsize=18)
ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique')
ax.legend()
然后是xy坐标轴的一些属性设定, 也是在axes level上完成的
ax.set_aspect('equal')
ax.minorticks_on()
ax.set_xlim(0,16)
ax.grid(which='minor', axis='both')
最后是坐标轴tick和细节,这个在axes.xaxis or axes.yaxis上完成。
ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='w')
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()
这样一个丑陋的基本图的绘画和编辑就完成了。如果有一些其他的细节调整,在搜索的时候,尽量选择不用plt的答案。原则上来说,plt和ax画图两者是可以互相转换的,然而转换过程让你的代码更复杂,有时还会产生难以理解的bug。因此画图的时候,请坚持使用一种格式。