我目前正在使用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()
1条答案
按热度按时间7ajki6be1#
您的问题是,默认情况下,
imshow
使用origin='upper'
(https://matplotlib.org/stable/API/_as_gen/matplotlib.axes.Axes.imshow.html#matplotlib.axes.Axes.imshow)绘图,这意味着Y轴是反向的,破坏了下游的边界计算,请使用它会解决你的问题
也不确定这是否是故意从你的身边,但这个边界更新规则似乎更有意义?