1 勒让德多项式图像绘制
python代码如下:
import re
import numpy as np
import matplotlib.pylab as plt
def polya(n,x):
if(n==0):
return 1.0
elif(n==1):
return x
else:
return ((2.0*n-1.0)*x*polya(n-1.0,x)-(n-1.0)*polya(n-2.0,x))/n
def main():
x = np.linspace(-1,1,100)
n=3
Px=[]
for i in x:
Px.append(polya(n,i))
for n in range(7):
locals()['list'+str(n)]=[]
for i in x:
locals()['list'+str(n)].append(polya(n,i))
plt.tick_params(direction='in')
plt.plot(x,locals()['list'+str(0)],color='black',linewidth=2.0,linestyle='-.',label='n=0')
plt.plot(x,locals()['list'+str(1)],color='lightgreen',linewidth=2.0,linestyle='-.',label='n=1')
plt.plot(x,locals()['list'+str(2)],color='r',linewidth=2.0,linestyle='--',label='n=2')
plt.plot(x,locals()['list'+str(3)],color='b',linewidth=2.0,linestyle='-',label='n=3')
plt.plot(x,locals()['list'+str(4)],color='orange',linewidth=2.0,linestyle='-',label='n=4')
plt.plot(x,locals()['list'+str(5)],color='blueviolet',linewidth=2.0,linestyle=':',label='n=5')
plt.plot(x,locals()['list'+str(6)],color='cyan',linewidth=2.0,linestyle=':',label='n=6')
plt.xlim(-1,1)
plt.ylim(-1,2)
plt.title('Legendre Polynomials')
plt.xlabel('x')
plt.ylabel('Pn(x)')
plt.legend(loc='upper right',fontsize='x-small')
plt.show()
if __name__ == '__main__':
main()
运行代码后的效果如下:
2 统计一组数据中不同数据出现的次数的实现方式:
python代码如下:
import numpy as np
from collections import Counter
import matplotlib.pylab as plt
data = np.loadtxt("test.txt")
print(len(data))
datas = Counter(data)
energy,counts = [],[]
for key,value in datas.items():
energy.append(key)
counts.append(value)
print(type(datas))
list1 = [1.2,1.5,1.6,1.8,2.5,6.8,2.5,7.9,1.2,1.2,1.2,1.6,1.8]
set1 = set(list1)
for i in set1:
print("enrgy:%.2f count:%d"%(i,list1.count(i)))
# Plot
plt.bar(range(len(energy)),counts,color='crimson',tick_label=energy)
plt.show()
其中***test.txt***中数据点的分布图如下:
3 tkinter+matplotlib实现动态绘制高斯函数
python代码如下:
#! /usr/bin/env python
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')
import sys
if sys.version_info[0] < 3:
import Tkinter as Tk
else:
import tkinter as Tk
def func(x, ar, ai, x0, p0):
return np.exp(-(ar+1j*ai)*(x-x0)**2+1j*p0*(x-x0))
class FuncGui:
"""GUI with sliders for exploring function parameters"""
def addslider(self, key, cmd, label, start, end, res, default):
ti = int(round( (end - start)/5 ))
#print "Making ", key, " with ti=", ti
self.elem[key] = Tk.Scale(self.tk, command=cmd, label=label,
orient=Tk.HORIZONTAL, sliderrelief=Tk.GROOVE, length=400,
from_=start, to_=end, resolution=res, tickinterval=ti)
self.elem[key].set(default)
self.elem[key].pack()
def __init__(self, mpl, title):
self.mpl = mpl
self.tk = Tk.Tk()
## place UI
ww = 420
hh = 650
sw = self.tk.winfo_screenwidth()
sh = self.tk.winfo_screenheight()
#xx = sw - ww
#yy = 0*(sh - hh)
xx = yy = 0
self.tk.geometry('%dx%d+%d+%d' % (ww, hh, xx, yy))
self.tk.wm_title(title)
#create empty dictionary for sliders
self.elem = dict() # self.elem = {}
self.addslider(key="xm", cmd=self.plotfunc,
label="Plot window starts at x_min:",
start=-10, end=10.1, res=0.1, default=-5.0)
self.addslider(key="dx", cmd=self.plotfunc,
label="Plot width Delta x:",
start=1.0, end=20.1, res=0.1, default=10.0)
self.addslider(key="ar", cmd=self.plotfunc,
label="Exponent real part a_r",
start=0.0, end=5.1, res=0.05, default=0.35)
self.addslider(key="ai", cmd=self.plotfunc,
label="Exponent imag part a_i:",
start=-5.0, end=5.1, res=0.1, default=-0.5)
self.addslider(key="x0", cmd=self.plotfunc,
label="Position x_0:",
start=-5.0, end=5.1, res=0.1, default=0.0)
self.addslider(key="p0", cmd=self.plotfunc,
label="Momentum p_0:",
start=-5.0, end=5.1, res=0.1, default=0.5)
self.addslider(key="wx", cmd=self.resizefunc,
label="Plot window width:",
start=100, end=2000, res=10, default=900)
self.addslider(key="wy", cmd=self.resizefunc,
label="Plot window height:",
start=100, end=2000, res=10, default=600)
self.quitBtn = Tk.Button(self.tk, text="Quit",
command=self.tk.quit)
self.quitBtn.pack()
self.tk.bind("<Key>", self.key)
## capture quit events: return key and Ctrl-Q
def key(self, event):
echar = event.char
print("pressed", repr(echar))
if( (echar == '\x03') or (echar == '\x11') ) :
self.tk.quit()
def plotfunc(self, value):
xmpar = self.elem["xm"].get()
dxpar = self.elem["dx"].get()
self.mpl.ax.set_xlim(xmpar, xmpar+dxpar)
xx = np.linspace(xmpar, xmpar+dxpar, 1001)
yy = func(xx, self.elem["ar"].get(), self.elem["ai"].get(), self.elem["x0"].get(), self.elem["p0"].get())
self.mpl.real.set_data(xx, yy.real)
self.mpl.imag.set_data(xx, yy.imag)
self.mpl.norm.set_data(xx, abs(yy))
plt.draw()
def resizefunc(self, value):
mngr = plt.get_current_fig_manager()
mngr.resize(self.elem["wx"].get(), self.elem["wy"].get())
print((self.elem["wy"].get()))
plt.tight_layout()
class FuncMPL:
"""matplotlib window function"""
def __init__(self, title):
## turn interactive mode on
plt.ion()
fig = plt.figure()
fig.canvas.set_window_title(title)
self.ax=plt.gca()
# self.ax.set_color_cycle(['red', 'blue', 'green', 'pink'])
xx = yy = np.linspace(-1, 1, 2)
# Returns a tuple of line objects, thus the comma
self.real, = plt.plot(xx, yy, ls='-', lw=2)
self.imag, = plt.plot(xx, yy, ls='-', lw=2)
self.norm, = plt.plot(xx, yy, ls='-', lw=4)
self.ax.set_ylim(-1.05, 1.05)
plt.grid(b=True, which='major', color='g', linestyle='--')
plt.legend(['real', 'imag', 'norm', ], loc='upper left')
#self.ax.set_title('psi(x) = exp(-(ar+I*ai)*(x-x0)^2+I*p0*(x-x0))')
self.ax.set_title('$\psi(x) = \exp(-(a_r + \mathrm{i} a_i) (x-x_0)^2 + \mathrm{i} p_0 (x-x_0))$', fontsize=24)
plt.tight_layout()
def main():
mpl = FuncMPL("Gaussian function plot")
gui = FuncGui(mpl, title="Gaussian")
# run callback functions to plot with initialized parameters
gui.resizefunc(0)
gui.plotfunc(0)
gui.tk.mainloop()
if __name__ == '__main__':
main()
最终代码运行后的效果如下: