我正在开展一个关于巴黎Velib分销的项目。对于那些不知道Velib的人来说,你可以在车站租一辆自行车。整个巴黎大约有2000个(真正的价值是lR0)站。不幸的是,有时候没有任何Velib可以出租或任何地方放置你的Velib所以它非常烦人。我想说明这个问题。
为此,我计算了Bary_taux
直径圆的平均占有率R/2
。如果Bary_taux < T
我想在地图上做一个圆圈(红色)(我有圆圈中心的经度和纬度,我在巴黎有大约100个T_moy
值)与t
时间相关联。
它变得复杂的是我在192个给定时间(每10分钟 - 24小时)有这100个值,我想制作一个可以随着时间演变而显示红色圆圈演变的情节。
在一个给定时间t
,我可以画出来,但我不知道如何随着时间的变化进化。
此外,随着重叠圆圈数量的增加,我想让红色更强。
这是我的Bary_taux
功能:
def Bary_taux(lng_0,lat_0,R):
T_Bary=0
C=0
for k in range(lR0):
if (((R_0[k]['position']['lng'])-lng_0)**2)+(((R_0[k['position']['lat'])-lat_0)**2)<R**2:
C+=1
T_bary+=Taux(k)
return (lng_0,lat_0,R,T_bary/C)
和B
是给定时间t的Bary_taux
列表。我有192个B
个列表,每个列表包含100个Bary_taux
。这就是我到目前为止所做的:
import matplotlib.pyplot as plt
for k in range (100):
if B[k]<T:
circle1 = plt.Circle((, 0), R, color='r')
fig, ax = plt.subplots()
plt.show()
我该怎么做?谢谢你的时间。
答案 0 :(得分:1)
为了在matplotlib中为绘图设置动画,您可以使用matplotlib.animate.FuncAnimation
。这将需要一个函数来调用每个帧。
如果我们之前创建了所有100个圆圈,我们可以使用此更新功能根据某些参数将它们设置为可见。
我不确定我是否正确理解了您bary_taux
和B
。所以我自己发明了一些数字。
import matplotlib.pyplot as plt
import matplotlib.patches
import matplotlib.animation
import numpy as np
import datetime
x = np.random.randint(0,180, size=100) # xcoordinate
y = np.random.randint(0,100, size=100) # ycoordinate
R = np.random.randint(3,10, size=100) # radius
b = np.random.rand(192,100) # parameter by which to judge if circle is drawn or not
# set up plot
fig, ax = plt.subplots()
ax.set_xlim([0,180])
ax.set_ylim([0,100])
ax.set_aspect("equal")
text = ax.text(0.5,1.02, "", transform=ax.transAxes, ha="right" )
#create 100 circles
circles = []
for i in range(100):
c = matplotlib.patches.Circle((x[i],y[i]), radius=R[i], color="r", alpha=0.6)
circles.append(c)
# add them already to the plot
ax.add_artist(c)
def totime(t):
minutes = datetime.timedelta(seconds=t*10*60 )
d = datetime.datetime(1,1,1) + minutes
return "{}h{:2d}".format(d.hour, d.minute)
def update(t):
text.set_text(totime(t))
for i in range(100):
# depending on condition set circle visible or not
if b[t,i] > 0.6:
circles[i].set_visible(True)
else:
circles[i].set_visible(False)
# redraw the canvas
fig.canvas.draw()
# call for single plot
update(92)
#call for animation
ani = matplotlib.animation.FuncAnimation(fig, update, interval=300, frames=192)
plt.show()