Search code examples
python-2.7image-processingmatplotlibfractalschaos

Normalizing data and applying colormap results in rotated image using matplotlib?


So I wanted to see if I could make fractal flames using matplotlib and figured a good test would be the sierpinski triangle. I modified a working version I had that simply performed the chaos game by normalizing the x range from -2, 2 to 0, 400 and the y range from 0, 2 to 0, 200. I also truncated the x and y coordinates to 2 decimal places and multiplied by 100 so that the coordinates could be put in to a matrix that I could apply a color map to. Here's the code I'm working on right now (please forgive the messiness):

import numpy as np
import matplotlib.pyplot as plt
import math
import random

def f(x, y, n):
    N = np.array([[x, y]])

    M = np.array([[1/2.0, 0], [0, 1/2.0]])

    b = np.array([[.5], [0]])
    b2 = np.array([[0], [.5]])

    if n == 0:
        return np.dot(M, N.T)

    elif n == 1:
       return np.dot(M, N.T) + 2*b

    elif n == 2:
        return np.dot(M, N.T) + 2*b2

    elif n == 3:
        return np.dot(M, N.T) - 2*b

def norm_x(n, minX_1, maxX_1, minX_2, maxX_2):
    rng = maxX_1 - minX_1
    n = (n - minX_1) / rng

    rng_2 = maxX_2 - minX_2
    n = (n * rng_2) + minX_2

    return n

def norm_y(n, minY_1, maxY_1, minY_2, maxY_2):
    rng = maxY_1 - minY_1
    n = (n - minY_1) / rng

    rng_2 = maxY_2 - minY_2
    n = (n * rng_2) + minY_2

    return n    

# Plot ranges
x_min, x_max = -2.0, 2.0
y_min, y_max = 0, 2.0

# Even intervals for points to compute orbits of
x_range = np.arange(x_min, x_max, (x_max - x_min) / 400.0)
y_range = np.arange(y_min, y_max, (y_max - y_min) / 200.0)

mat = np.zeros((len(x_range) + 1, len(y_range) + 1))   

random.seed()

x = 1
y = 1

for i in range(0, 100000):
    n = random.randint(0, 3)
    V = f(x, y, n)

    x = V.item(0)
    y = V.item(1)

    mat[norm_x(x, -2, 2, 0, 400), norm_y(y, 0, 2, 0, 200)] += 50

plt.xlabel('x0')
plt.ylabel('y')
fig = plt.figure(figsize=(10,10))
plt.imshow(mat, cmap="spectral", extent=[-2,2, 0, 2])
plt.show()

The mathematics seem solid here so I suspect something weird is going on with how I'm handling where things should go into the 'mat' matrix and how the values in there correspond to the colormap.

enter image description here


Solution

  • If I understood your problem correctly, you need to transpose your matrix using the method .T. So just replace

    fig = plt.figure(figsize=(10,10))
    plt.imshow(mat, cmap="spectral", extent=[-2,2, 0, 2])
    plt.show()
    

    by

    fig = plt.figure(figsize=(10,10))
    ax = gca()
    ax.imshow(mat.T, cmap="spectral", extent=[-2,2, 0, 2], origin="bottom")
    plt.show()
    

    enter image description here

    The argument origin=bottom tells to imshow to have the origin of your matrix at the bottom of the figure.

    Hope it helps.