2015-01-14 7 views
2

Если вы запустите код, который я привел ниже (python 2.7), вы обнаружите, что получившееся изображение темное и размытое и почти похоже, что на нем есть линии. Я понимаю, что использование функции рассеяния для построения такого рода, вероятно, является злоупотреблением функциональностью.Как улучшить плохое визуальное изображение наборов Джулии, сделанных с использованием matplotlib?

Я просмотрел документацию и заблудился в ней, и просто надеялся, что кто-то покажет мне, как заставить мои наборы Джулии выглядеть так же хорошо, как симпатичные цветные таблички, которые вы видите в книгах и онлайн.

import numpy as np 
import matplotlib.pyplot as plt 

# Plot ranges 
r_min, r_max = -2.0, 2.0 
c_min, c_max = -2.0, 2.0 

# Even intervals for points to compute orbits of 
r_range = np.arange(r_min, r_max, (r_max - r_min)/200.0) 
c_range = np.arange(c_min, c_max, (c_max - c_min)/200.0) 

c = complex(-0.624, 0.435) 
xs = [] 
ys = [] 
colors = [] 

for comp in c_range: 
    for real in r_range: 
     z = complex(real, comp) 

     escaped = False 
     for i in range(0, 50): 
      z = z*z + c 

      if abs(z) > max(abs(c), 2): 
       escaped = True 

       # Colors correspond to escape speed 
       if i < 7: 
        colors.append((1.0 - .055* i, 0.0, 0.0)) 

       if i >= 7 and i < 14: 
        colors.append((1.0 - .025*i, .6 - .025*i, 0)) 

       if i >= 14 and i < 21: 
        colors.append((1.0 - .0035*i, 1.0 - .0045*i, 0.0)) 

       if i >= 21 and i < 28: 
        colors.append((0.0, 1.0 - .0045*i, 0.0)) 

       if i >= 28 and i < 35: 
        colors.append((0.0, 0.0, 1.0 - .0055*i)) 

       if i >= 35 and i < 42: 
        colors.append((.435 - .0055*i, 0.0, 1.0 - .0055*i))  

       if i >= 42: 
        colors.append((0.62 - .005*i, 0, 1.0 - .005*i)) 
       break 


     xs.append(real) 
     ys.append(comp) 

     # Points that don't escape are black 
     if escaped == False: 
      colors.append((0.0, 0.0, 0.0)) 

plt.axis([-2, 2, -2, 2]) 
plt.xlabel('x0') 
plt.ylabel('c') 
plt.scatter(xs, ys, c = colors, alpha = .2) 
plt.show() 

Edit: Вот результат выше - https://imgur.com/bdtZGVh

ответ

5

Есть три основных способа улучшить этот сюжет:

1 - Вместо диаграммы рассеяния, создать N по матрице N где значение каждой точки определяет цвет в этой точке. Затем используйте plt.imshow(...)

2 - эксперимент с различными (plt.imshow(...cmap="RdGy") цветовых карт)

3 - Увеличение числа точек для повышения резкости. То есть, увеличьте знаменатель в ваших заявлениях, определяющих c_range и r_range

Я внедрил ваш код для реализации этих изменений. Ищите комментарии # CHANGED. Новая фигура выглядит намного приятнее.

import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 

# Plot ranges 
r_min, r_max = -2.0, 2.0 
c_min, c_max = -2.0, 2.0 

# Even intervals for points to compute orbits of 
# CHANGED 
r_range = np.arange(r_min, r_max, (r_max - r_min)/500.0) 
c_range = np.arange(c_min, c_max, (c_max - c_min)/500.0) 

c = complex(-0.624, 0.435) 
xs = [] 
ys = [] 
# CHANGED 
mat = np.zeros((len(c_range),len(r_range))) 
colors = [] 

# CHANGED 
matComp = 0 # Index of the new mat values 
matReal = 0 
for comp in c_range: 
    for real in r_range: 
     z = complex(real, comp) 

     escaped = False 
     for i in range(0, 50): 
      z = z*z + c 

      if abs(z) > max(abs(c), 2): 
       escaped = True 
       # CHANGED 
       mat[matComp, matReal]=i 

       # Colors correspond to escape speed 
       if i < 7: 
        colors.append((1.0 - .055* i, 0.0, 0.0)) 

       if i >= 7 and i < 14: 
        colors.append((1.0 - .025*i, .6 - .025*i, 0)) 

       if i >= 14 and i < 21: 
        colors.append((1.0 - .0035*i, 1.0 - .0045*i, 0.0)) 

       if i >= 21 and i < 28: 
        colors.append((0.0, 1.0 - .0045*i, 0.0)) 

       if i >= 28 and i < 35: 
        colors.append((0.0, 0.0, 1.0 - .0055*i)) 

       if i >= 35 and i < 42: 
        colors.append((.435 - .0055*i, 0.0, 1.0 - .0055*i))  

       if i >= 42: 
        colors.append((0.62 - .005*i, 0, 1.0 - .005*i)) 
       break 
     # CHANGED 
     matReal += 1 


     xs.append(real) 
     ys.append(comp) 

     # Points that don't escape are black 
     if escaped == False: 
      colors.append((0.0, 0.0, 0.0)) 
    # CHANGED 
    matComp+=1 
    matReal=0 

#CHANGED 
fig = plt.figure(figsize=(15,15)) 
plt.imshow(mat, cmap="RdGy", extent=[-2,2,-2,2]) 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^