我试图绘制一个随机游走,限制在一个格子上移动。
要实现此约束,我使用hstack从matplotlib模块格式化LineCollection的段。
我希望四个随机游走在同一个地块的四个象限中开始。正如我的代码现在所示,我得到了四个单独的情节。
如何指定在同一图上绘制所有数据? #multiple 2D随意散步
from matplotlib import collections as mc
import numpy as np
import pylab as plt
steps = 1000
coar = np.empty([steps,2],int)
#random walk start cooridiates
n1=np.array([50,50],int)
n2=np.array([-50,50],int)
n3=np.array([-50,-50],int)
n4=np.array([50,-50],int)
na = [n1,n2,n3,n4]
#colors of the four random walks
clr = ['g','c','m','y']
with open("raw_ran_576001.txt","r") as rf:
for j in range(len(na)):
for t in range(0,steps):
bin=rf.read(2) #reads two bits to generate random step of walk
if(bin=="00"):
na[j][0]+=1
elif(bin=="11"):
na[j][0]-=1
elif(bin=="01"):
na[j][1]+=1
elif(bin=="10"):
na[j][1]-=1
coar[t] = na[j]
coart = coar.reshape(-1,1,2)
segments = np.hstack([coart[:-1],coart[1:]])
# figure out how to add different random walks in different colors
#to same plot
coll = mc.LineCollection(segments,color=clr[j])
fig, ax=plt.subplots() #just a figure and one subplot
ax.set_axis_bgcolor('black')
ax.add_collection(coll) #this must be where points are ploted
ax.autoscale()
t=0
plt.show()
我在忽视什么
btw我使用的是从放射性同位素硬件随机数生成器生成的随机位。
答案 0 :(得分:0)
有趣的问题。它实际上非常简单 - 您只需将fig, ax=plt.subplots()
命令放在循环之外。
你的例子对我不起作用,因为我没有你正在绘制的文件的副本所以我使用了numpy的随机模块来模拟它。我还使用了plot
命令,因为它似乎是一种更简单的方法来执行您正在寻找的内容。
# Import what you need
import numpy as np
import pylab as plt
# Set the number of steps you're going to walk along
steps = 1000
# Set the random walk start coordinates
# for each of four random walks
n1=np.array([50,50],int)
n2=np.array([-50,50],int)
n3=np.array([-50,-50],int)
n4=np.array([50,-50],int)
na_list = [n1,n2,n3,n4]
# Set the colors of the four random walks
clr_list = ['g','c','m','y']
# Create one figure with one subplot
fig, ax=plt.subplots()
# Set the background color to black
ax.set_axis_bgcolor('black')
# Loop through the different random walks
for na, clr in zip(na_list, clr_list):
# Create a list of coordinates
# initiated by the start coordinates
coar = np.ones([steps+1,2],int) * na
# For each step figure out if you're
# going to walk right, left, up or down
for t in range(0,steps):
# Set coar for the point after
# this step (t+1) to be the point the
# step starts at (t)
coar[t+1] = coar[t]
# Get a random number
bin = np.random.randint(4)
if(bin==0):
# Step to the right (inc x by 1)
coar[t+1][0] = coar[t,0] + 1
elif(bin==1):
# Step to the left (dec x by 1)
coar[t+1][0] = coar[t,0] - 1
elif(bin==2):
# Step up (inc y by 1)
coar[t+1][1] = coar[t,1] + 1
elif(bin==3):
# Step down (dec y by 1)
coar[t+1][1] = coar[t,1] - 1
# Plot these coordinates
ax.plot(coar.T[0], coar.T[1], c=clr)
# And show the starting point with a white triangle
# just to make it clear where you started
ax.scatter(coar[0,0], coar[0,1], marker='^', c='w', edgecolor='w', s=70, zorder=3)
# Autoscale the axis
ax.autoscale()
# And show the plot
plt.show()