使用 matplotlib 对数据进行归一化并应用颜色图会导致旋转图像?

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

所以我想看看我是否可以使用 matplotlib 制作分形火焰,并认为 sierpinski 三角形是一个很好的测试。我修改了一个工作版本,它通过将 x 范围从 -2、2 标准化到 0、400 并将 y 范围从 0、2 标准化到 0、200 来简单地执行混沌游戏。我还将 x 和 y 坐标截断为 2小数位并乘以 100,以便可以将坐标放入我可以应用颜色映射的矩阵中。这是我现在正在处理的代码(请原谅混乱):

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()

这里的数学似乎很扎实,所以我怀疑我如何处理应该进入 'mat' 矩阵的位置以及其中的值如何对应于颜色图的方式发生了一些奇怪的事情。

如果我对你的问题理解正确,你需要使用 .T 方法转置你的矩阵。所以只需替换

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

来自

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

参数 origin=bottom 告诉 imshow 矩阵的原点位于图的底部。

希望对您有所帮助。