veusz绘制mandelbrot集

Python2到Python3的问题修复

本文测试veusz绘制2D图形的能力,于是在官方网站下载了mandelbrot的经典例子:mandelbrot.vsz, 但是官方的例子是以python2构建的,而本文希望切换到python3解决问题。由于语法的兼容,需要做出少许修改:

  • 指明python2可以直接运行程序,但不是目前我想要的。
  • print函数,在python2中不需要加括号,但是python3中需要加括号,即print "hello world"print ("hello world")
  • python2中使用xrange函数,在python3中已经取消,合并到range函数。所以需要修改:xrange()range()
  • 错误:TypeError: ‘float‘ object cannot be interpreted as an integer. 造成错误的原因是range里面使用了小数,所以解决方法有两个:
    • python2中的/只保留整数部分,是int型。在python3中的/的结果是真正意义上的除法,得到的是一个小数,所以是float型,所以改用python3中的//得到一个整数,则问题解决。即:///
    • 如果不想任何改变仍要使用range的功能,则可以使用numpy中提供的arange,即
      1
      2
      for i in numpy.arange(0.0, 4.1, 0.8)
      print(i)

Python3下的mandelbrot.vsz

mandelbrot.vsz for pyton3
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Veusz script (version 0.7 or later)
# Jeremy Sanders (2005)
# for python3
# computes the Mandelbrot set in real time

size = 300
maxiters = 20
image = zeros( (size, size) )

print ("This takes some time, please wait")

minx = 100000
maxx = -100000
miny = 100000
maxy = -100000

for i in range(size):
for j in range(size//2):
c1 = -2+4.*i/size
c2 = 2-4.*j/size
x = c1
y = c2

minx=min(x, minx)
maxx=max(x, maxx)
miny=min(y, miny)
maxy=max(y, maxy)

n = 0
while n < maxiters and x**2+y**2 < 4.:
x1 = x**2-y**2+c1
y1 = 2*x*y+c2
x = x1
y = y1

n += 1

image[j, i] = n
image[size-j-1, i] = n

# set output data into veusz
SetData2D('image', image, xrange=(minx, maxx), yrange=(miny, maxy))

# construct the graph
To(Add('page'))
To(Add('graph'))

# Add a label
Add('label', label='The Mandelbrot Set', yPos=0.95,
alignHorz='centre', alignVert='top',
Text__size='30pt')

# add colorbar in front of image
Add('colorbar', name='colorbar1', image='image1',
direction='vertical', vertPosn='top')

# add image
Add('image', name='image1', data='image', min=1,
colorScaling='log', colorMap='heat', colorInvert=True)

# adjust axes
Set('x/min', -2.2)
Set('x/max', 1.2)
Set('y/min', 0.3)
Set('y/max', 1.9)

To('/')

运行结果

mandelbrot 集(python3 实现)

参考文章