我目前正在使用matplotlib编写Mandelbrot集合的代码,该集合带有zoom 功能,可以无限放大其中的任何部分,然而,当我放大新数据时,计算得到的数据偏离图轴的中心.
这个屏幕截图显示了一次放大后的图形--没有正确地为轴生成集合.图形应该是关于y=0的对称的,但它不是-每当我zoom 时它都会改变.我想不出这可能是什么原因--我在代码中看不到任何问题.我该怎么解决这个问题?
以下是我的代码:
import numpy as np
import matplotlib.pyplot as plt
def mandelbrot_set(xmin, xmax, ymin, ymax, width, height, maxiter):
x = np.linspace(xmin, xmax, width).reshape((1, width))
y = np.linspace(ymin, ymax, height).reshape((height, 1))
c = x + y * 1j
z = c
fractal = np.zeros(z.shape, dtype=int)
for i in range(maxiter):
z = z**2 + c
mask = np.abs(z) > 2
fractal += mask
z[mask] = 2
return fractal
xmin, xmax, ymin, ymax = -2, 1, -1.5, 1.5
maxiter = 300
width, height = 500, 500
fractal = mandelbrot_set(xmin, xmax, ymin, ymax, width, height, maxiter)
fig, ax = plt.subplots(figsize=(10, 10))
im = ax.imshow(fractal, cmap='magma', extent=(xmin, xmax, ymin, ymax))
def update_plot(xmin, xmax, ymin, ymax):
fractal = mandelbrot_set(xmin, xmax, ymin, ymax, width, height, maxiter)
im.set_data(fractal)
im.set_extent((xmin, xmax, ymin, ymax))
fig.canvas.draw()
def on_scroll(event):
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
x, y = event.xdata, event.ydata
if event.button == 'up':
scale_factor = 0.5
else:
scale_factor = 2.0
xmin = x - (x - xmin)*scale_factor
xmax = x + (xmax - x)*scale_factor
ymin = y - (y - ymin)*scale_factor
ymax = y + (ymax - y)*scale_factor
print(f"xmin: {xmin}, xmax: {xmax}, ymin: {ymin}, ymax: {ymax}")
update_plot(xmin, xmax, ymin, ymax)
fig.canvas.mpl_connect('scroll_event', on_scroll)
plt.show()