小知识整理(一)

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()

最终代码运行后的效果如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值