Python: частота построения отрицательных координат (x, y) - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь изобразить частоты двумерного целочисленного случайного блуждания, начиная с (0,0). Сначала я получаю список координат (x, y), некоторые из которых отрицательны, и у меня возникают проблемы с их правильным построением. Я знаю, что моя текущая попытка неверна, так как (0,0) иногда выглядит так, будто его вообще нет в случайном блуждании.

Вот моя попытка:

Идея состоит в том, чтобы переставить все (x , y) -координаты, поэтому они находятся в первом квадранте, а затем манипулируют осями на extent, чтобы вернуть их обратно в исходную форму. Я делаю это, чтобы избежать нежелательных операций со списком при построении grid, которые заставили бы график «прыгать»

# generate random walk
import random

def random_walk():

    a = 0
    b = 0
    while True:
        yield (a, b)

        i = random.choice([0, 1])
        if i == 0:
            a = random.choice([a-1, a+1])
        else:
            b = random.choice([b-1, b+1])

И попытка построения самого себя:

import matplotlib.pyplot as plt
import itertools 
import numpy as np

# generate random walk of length 1000
walk = list(itertools.islice(random_walk(), 0, 1000))

xy = list(zip(*walk))

x = list(xy[0])
y = list(xy[1])

ext = (min(x), max(x), min(y), max(y))

min_x = min(x)
min_y = min(y)

# transpose all x.- and y.-coordinates:

for i in range(len(x)):
    x[i] -= min_x

for i in range(len(y)):
    y[i] -= min_y

walk_new = list(zip(x,y))

grid = np.zeros((max(x) + 1, max(y) + 1))

# Put frequencies in grid:
for a,b in walk_new:
    grid[a][b] += 1


plt.imshow(grid)
plt.colorbar()

1 Ответ

0 голосов
/ 06 мая 2020

Я заметил, что исходная точка (0,0) не отображается на вашей тепловой карте, как ожидалось, когда я запускал ваш код. Я оставил вашу функцию random_walk как есть, но я думаю, что здесь было бы проще использовать matplotlib hist2d, поскольку координаты (x, y) отображаются точно так, как вам нравится, без необходимости транспонировать координаты, которые вы сгенерировали.

import matplotlib.pyplot as plt
import itertools 
import numpy as np

# generate random walk of length 1000
walk = list(itertools.islice(random_walk(), 0, 1000))

xy = list(zip(*walk))

x = list(xy[0])
y = list(xy[1])

heatmap, xedges, yedges = np.histogram2d(x, y, bins=[np.arange(min(x),max(x),1),np.arange(min(y),max(y),1)])
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.imshow(heatmap, origin='lower', extent=extent)

# set bins to be 1 unit apart since your (x,y) coordinates are integers
# plt.hist2d(x,y, bins=[np.arange(min(x),max(x),1),np.arange(min(y),max(y),1)])
plt.colorbar()
plt.show()

enter image description here

...