numpy 如何用mandelbrot集设定极限

o3imoua4  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(128)

我目前正在使用matplotlib编写一个Mandelbrot集,它带有一个缩放函数,可以无限放大它的任何部分,但是当我放大时,计算出的新数据偏离了图形轴的中心。

此屏幕截图显示了一次放大后的图形-轴的集合未正确生成。这个图应该是关于y=0对称的,但它不是--每当我缩放时它都在变化。我想不出是什么原因导致了这一点-我看不出代码中有任何问题。我该怎么解决这个问题?
下面是我的代码:

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

7ajki6be1#

您的问题是,默认情况下,imshow使用origin='upper'(https://matplotlib.org/stable/API/_as_gen/matplotlib.axes.Axes.imshow.html#matplotlib.axes.Axes.imshow)绘图,这意味着Y轴是反向的,破坏了下游的边界计算,请使用

im = ax.imshow(fractal, cmap='magma', extent=(xmin, xmax, ymin, ymax), origin='lower')

它会解决你的问题
也不确定这是否是故意从你的身边,但这个边界更新规则似乎更有意义?

xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
x_scale = xmax - xmin
y_scale = ymax - ymin
dx = x_scale/2*scale_factor
dy = y_scale/2*scale_factor
xmin = x - dx
xmax = x + dx
ymin = y - dy
ymax = y + dy

相关问题