Python: 绘制负(x,y)坐标的频率。

问题描述 投票:0回答:1

我试图绘制一个从(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()
python matplotlib colorbar imshow
1个回答
0
投票

我注意到,当我运行你的代码时,原点(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

© www.soinside.com 2019 - 2024. All rights reserved.