使用matplotlib / pyplot / numpy / python绘制Mandelbrot

时间:2013-02-22 12:40:14

标签: python numpy matplotlib scientific-computing

我是python的新手,并通过Python“科学讲义发布2013.1”教程学习。请帮助我在下面的srcreenshot中解决这个Mandelbrot问题(第71页)。如果可能的话,请提供逐步命令和说明,因为编程概念对我来说是新的。

http://dl.dropbox.com/u/50511173/mandelbrot.png

我试着按如下方式解决这个问题:

import numpy as np
import matplotlib.pyplot as plt

x,y=np.ogrid[-2:1:10j,-1.5:1.5:10j]
c=x + 1j*y
z=0
for g in range(50):
  z=z**2 + c

plt.imshow(z.T, extent=[-2,1,-1.5,1.5])

我遇到以下错误“TypeError:图片数据无法转换为浮动”

这个错误究竟意味着什么以及如何纠正它?我发现很难理解imshow()函数。 imshow()中的个别术语是什么意思?

谢谢。

4 个答案:

答案 0 :(得分:5)

Mandelbrot集合不是您试图绘制的z的值,这会给您带来问题,因为它们是复数。 Mandelbrot集由复平面的点p组成,其中递归关系z_n = z_n-1**2 + p仍然有界。通过将几次迭代后的结果与某个阈值进行比较,以实际方式检查。在您的情况下,如果您在for循环后添加以下行:

threshold = 2
mask = np.abs(z) < threshold

然后绘制mask你应该在屏幕上看到设定的情节。

要理解imshow论点的一般运作方式,最好先阅读docs而不是在这里询问。

答案 1 :(得分:5)

感谢@Jan和@Jaime。我得到它如下工作,虽然花费了太多时间来计算:

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt


x,y=np.ogrid[-2:1:5000j,-1.5:1.5:5000j]

print('')
print('Grid set')
print('')

c=x + 1j*y
z=0

for g in range(500):
        print('Iteration number: ',g)
        z=z**2 + c

threshold = 2
mask=np.abs(z) < threshold

print('')
print('Plotting using imshow()')
plt.imshow(mask.T,extent=[-2,1,-1.5,1.5])

print('')
print('plotting done')
print('')

plt.gray()

print('')
print('Preparing to render')
print('')

plt.show()

Image Result

答案 2 :(得分:2)

您收到此错误,因为plt.imshow不接受复数数组。您可以将数组Z的实部或虚部表示为Z.realZ.imag。因此,如果你想绘制真实的部分

plt.imshow(z.real.T, extent=[-2,1,-1.5,1.5])

可以胜任。

'imshow'中的参数定义了以下内容。

如果z是N-by-M矩阵,则将其解释为常规网格上的点值。通过extent,您可以指定此网格在空间中的扩展方式......

答案 3 :(得分:2)

您尝试使用imshow绘制复杂值,这就是您收到该错误的原因,可以像其他人建议的那样使用阈值,但您可能需要考虑使用np.angle或{{1}也是。您还可以使用Python的内置np.abs方法简化z的计算。

这个有一些乐趣,但这显示了一般的想法:

reduce