简介
本实验将指导你使用 Python 的 Matplotlib 库生成曼德勃罗集的阴影和功率归一化渲染图。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
This tutorial is from open-source community. Access the source code
本实验将指导你使用 Python 的 Matplotlib 库生成曼德勃罗集的阴影和功率归一化渲染图。
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
首先,我们需要导入将要使用的库:NumPy、Matplotlib 和 Colors。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors
接下来,我们将定义一个生成曼德勃罗集的函数。该函数接受几个参数:
xmin、xmax、ymin、ymax:x 轴和 y 轴的最小值和最大值xn 和 yn:沿每个轴生成的点数maxiter:对每个点执行的最大迭代次数horizon:将一个点视为集合一部分的最大值def mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon=2.0):
X = np.linspace(xmin, xmax, xn).astype(np.float32)
Y = np.linspace(ymin, ymax, yn).astype(np.float32)
C = X + Y[:, None] * 1j
N = np.zeros_like(C, dtype=int)
Z = np.zeros_like(C)
for n in range(maxiter):
I = abs(Z) < horizon
N[I] = n
Z[I] = Z[I]**2 + C[I]
N[N == maxiter-1] = 0
return Z, N
现在我们将通过使用所需参数调用 mandelbrot_set 函数来生成曼德勃罗集。这将为我们提供两个数组:
Z:我们迭代的复数的最终值N:在确定每个点是集合的一部分之前对其执行的迭代次数xmin, xmax, xn = -2.25, +0.75, 3000 // 2
ymin, ymax, yn = -1.25, +1.25, 2500 // 2
maxiter = 200
horizon = 2.0 ** 40
log_horizon = np.log2(np.log(horizon))
Z, N = mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, horizon)
为了创建曼德勃罗集的阴影和功率归一化渲染图,我们需要对数据进行归一化。我们将使用以下公式来完成此操作:
M = N + 1 - np.log2(np.log(abs(Z))) + log_horizon
with np.errstate(invalid='ignore'):
M = np.nan_to_num(N + 1 - np.log2(np.log(abs(Z))) + log_horizon)
既然我们已经有了归一化后的数据,就可以创建绘图了。我们将使用 imshow 函数把数据显示为一幅图像,并且还会在绘图上添加一些文本,以表明我们正在查看的内容。
dpi = 72
width = 10
height = 10*yn/xn
fig = plt.figure(figsize=(width, height), dpi=dpi)
ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1)
light = colors.LightSource(azdeg=315, altdeg=10)
M = light.shade(M, cmap=plt.cm.hot, vert_exag=1.5,
norm=colors.PowerNorm(0.3), blend_mode='hsv')
ax.imshow(M, extent=[xmin, xmax, ymin, ymax], interpolation="bicubic")
ax.set_xticks([])
ax.set_yticks([])
year = time.strftime("%Y")
text = ("The Mandelbrot fractal set\n"
"Rendered with matplotlib %s, %s - https://matplotlib.org"
% (matplotlib.__version__, year))
ax.text(xmin+.025, ymin+.025, text, color="white", fontsize=12, alpha=0.5)
plt.show()
在本实验中,我们学习了如何使用 Python 的 Matplotlib 库生成曼德勃罗集的阴影和功率归一化渲染图。我们通过定义一个生成该集合的函数、对数据进行归一化以及使用归一化后的数据创建绘图来实现这一点。这种技术可以应用于其他数据集,以创建视觉上吸引人且信息丰富的图像。