2D绘图重叠圆圈并随时间演变

时间:2016-12-19 15:05:25

标签: python matplotlib

我正在开展一个关于巴黎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()

我该怎么做?谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

为了在matplotlib中为绘图设置动画,您可以使用matplotlib.animate.FuncAnimation。这将需要一个函数来调用每个帧。 如果我们之前创建了所有100个圆圈,我们可以使用此更新功能根据某些参数将它们设置为可见。 我不确定我是否正确理解了您bary_tauxB。所以我自己发明了一些数字。

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