所谓Julia集就是类似下面的美妙的图案
Julia集
特别地,当 c = z的初始值时,符合收敛条件的 z 的便构成大名鼎鼎的Mandelbrot集
在上图中,颜色表示该点的发散速度,可以理解为开始发散时迭代的次数。其生成代码也非常简单:
#mbrot.py import numpy as np import time import pyplotlib.pyplot as plt #生成z坐标,axis为起始位置,nx,ny为x向和y向的格点个数 def genZ(axis,nx,ny): x0,x1,y0,y1 = axis x = np.linspace(x0,x1,nx) y = np.linspace(y0,y1,ny) real, img = np.meshgrid(x,y) z = real + img*1j return z #获取Julia集,n为迭代次数,m为判定发散点,大于1即可 def getJulia(z,c,n,m=2): t = time.time() c = np.zeros_like(z)+c out = abs(z) for i in range(n): absz = abs(z) z[absz>m]=0 #对开始发散的点置零 c[absz>m]=0 out[absz>m]=i #记录发散点的发散速度 z = z*z + c print("time:",time.time()-t) return out if __name__ == "__main__": axis = np.array([-2,1,-1.5,1.5]) z0 = genZ(axis,500,500) mBrot = getJulia(z0,z0,50) plt.imshow(mBrot, cmap=cm.jet, extent=axis) plt.gca().set_axis_off()<strong>本文来源gaodai#ma#com搞@@代~&码*网2</strong> plt.show()
matplotlib绑定事件
下面希望实现点击Mandelbrot集中的一点,生成相应的Julia集。
在mpl中,事件绑定函数mpl_connect被封装在cavnas类中,调用格式为
canvas.mpl_connect(‘str’, func)
其中func事件函数,字符串为被传入事件函数的事件标识,如下所列,望文生义即可
'button_press_event' 'button_release_event' 'draw_event' 'key_press_event' 'key_release_event' 'motion_notify_event' 'pick_event' 'resize_event' 'scroll_event' 'figure_enter_event' 'figure_leave_event' 'axes_enter_event' 'axes_leave_event' 'close_event'
简单起见,可以先检测一下鼠标点击事件’button_press_event’,对此我们需要定义一个事件函数,并将上面的入口函数稍加修改:
def test(evt): print(evt.xdata) #xdata即x方向的坐标 if __name__ == "__main__": axis = np.array([-2,1,-1.5,1.5]) z0 = genZ(axis,500,500) mBrot = getJulia(z0,z0,50) fig, ax = plt.subplots() fig.canvas.mpl_connect('button_press_event', test)#调用事件函数 plt.imshow(mBrot, cmap=cm.jet, extent=axis) plt.gca().set_axis_off() plt.show()
于是点击imshow()出来的图片,即可返回相应的x坐标。
python mbrot.py time: 0.47572827339172363 -0.8652597402597402 -0.7840909090909087 -0.18344155844155807 0.23051948051948123 0.8149350649350655