使用Python画分形图

由于不想受限于MatLab,于是全面转入到Python工作,同时绘图工具使用免费开源的veusz, 在实现python导出数据,再使用veusz绘图时,第一步就是使用python正确的绘图,而分形图就是练习画这类图的绝佳素材。

Koch曲线

代码

Koch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import turtle

Division = 3.0
DirectionAangle = [('left',60),('right',120),('left',60)]

def call(name):
if name == 'left':
return turtle.left
else:
return turtle.right

def koch(n, length):
if n==0:
turtle.forward(length)
else:
for DA in DirectionAangle:
koch(n-1,length/Division)
call(DA[0])(DA[1])
koch(n-1,length/Division)

koch(n=4, length=400)
turtle.done()

运行结果

koch

Julia 集

代码

Julia
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import matplotlib.pyplot as plot
import numpy as np
p=0.45 #初始值c的实部
q=-0.1428 #初始值c的虚部
N=800 #最大迭代次数
M=100 #迭代区域的界值
a=3.0 #绘制图的横轴大小
b=3.0 #绘制图的纵轴大小
step=0.005 #绘制点的步长

def iterate(z,N,M):
z=z*z+c
for i in range(N):
if abs(z)>M:
return i
z=z*z+c
return N

c=p+q*1j
i=np.arange(-a/2.0,a/2.0,step)
j=np.arange(b/2.0,-b/2.0,-step)
I,J=np.meshgrid(i, j)
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(I+1j*J,N,M).astype(np.float64)
plot.imshow(Z,extent=(-a/2.0,a/2.0,-b/2,b/2.0))
cb = plot.colorbar(orientation='vertical',shrink=1)
cb.set_label('iteration counts')
plot.show()

运行结果

Julia集

Mandelbrot 集

代码

Mandelbrot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np
import matplotlib.pyplot as plot

x0=0 #初始值z0的x0
y0=0 #初始值z0的y0
zoom=1.0 #放大倍率
N=100 #最大迭代次数
R=2 #迭代半径
a=4.0 #绘制图的横轴大小
b=3.0 #绘制图的纵轴大小
step=0.005 #绘制点的步长

def iterate(c,N,R):
z=c
for i in range(N):
if abs(z)>R:
return i
z = z*z+c
return N

x=np.arange(-a/(2.0*zoom)+x0,a/(2.0*zoom)+x0,step)
y=np.arange(b/(2.0*zoom)+y0,-b/(2.0*zoom)+y0,-step)
cx,cy=np.meshgrid(x, y)
c = cx + cy*1j
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(c,N,R).astype(np.float64)
plot.imshow(Z,extent=(-a/2.0,a/2.0,-b/2,b/2.0))
cb = plot.colorbar(orientation='vertical',shrink=1)
cb.set_label('iteration counts')
plot.show()

运行结果

Mandelbrot 集

说明

本文参考文章: 使用 Python 绘制分形: Koch 曲线、Julia 集、Mandelbrot 集, 文章发布于2017年1月25日, 比较早。其使用的是python2, 而当前使用更加先进的python3更加合理,于是切换为python3代码后,出现几处错误,本文逐一更正。

python3 xrange 报错

由于python3取消了在python2中定义的xrange函数,取而代之的是range, 于是在修改后的代码中改xrangerange.

AttributeError: module 'numpy' has no attribute 'float'.

直接运行程序时,会提示:

1
2
3
4
AttributeError: module 'numpy' has no attribute 'float'.
`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations. Did you mean: 'float16'?

于是根据提示:将np.float修改为np.float64解决问题。

ImportError: libtk8.6.so: cannot open shared object file: No such file or directory

造成这个问题的原因是系统没有安装程序tk,安装即可解决问题:

1
sudo pacman -S tk

Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .TkTkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 WindowsMacintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格, 并良好地运行在绝大多数平台中。详情参考:Python GUI编程(Tkinter)