Matplotlib动画多个大圆圈并从pandas df更新

时间:2018-03-01 15:21:03

标签: python pandas matplotlib updating

我创建了一张地图,我正在用经纬度坐标的CSV读取到Pandas DataFrame中。我已经成功地使用' for'来绘制多个大弧线。在DataFrame中读取后循环。

我现在正试图为多个巨大的弧线制作动画。动画的原因是在CSV更新时实时更新绘图。我最终将使用SQL表而不是CSV,但我想让动画部分首先工作。

我在matplotlib和动画上阅读并观看了多个教程。我已阅读源文档并尝试应用多个示例。我已经能够成功制作单个大弧的动画,但似乎无法将代码扩展为多个弧。

编辑1:我希望文件中的所有大圆弧都在地图上绘制(我已经让这部分工作了)。当一组新的纬度和经度被添加到文件中时,我希望它在同一图中自动​​更新。我试图将其用作实时显示。

** Edit2:我已尽可能地配对代码。基本地图,数据框中的一些长/纬坐标以及我为线条设置动画的尝试都是最小的。我必须保留CSV输入,因为这是验证CSV更新后地图更新的唯一方法。

CSV包含以下内容:

sourcelon  sourcelat   destlon  destlat
50.44    30.51     -80.84   35.22
52.52    13.4      -80.84   35.22
43.18    -22.97    -80.84   35.22
35.18    -22.97    -80.84   35.22

正在绘制弧,但在更新CSV时不会更新。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.animation

# create new figure, axes instances.
fig=plt.figure()


# setup mercator map projection.
plt.figure(figsize=(27, 20))
m = Basemap(projection='mill', lon_0=0)
m.drawcoastlines(color='r', linewidth=1.0)


def animate(i):
    df = pd.read_csv('c:/python/scripts/test2.csv', sep='\s*,\s*',header=0, encoding='ascii', engine='python'); df 


    for x,y,z,w in zip(df['sourcelon'], df['sourcelat'], df['destlon'], df['destlat']):
        line, = m.drawgreatcircle(x,y,z,w,color='r')
        line, = plt.plot([],[])


ani = matplotlib.animation.FuncAnimation(fig, animate, interval=1000)
plt.tight_layout()
plt.show()

1 个答案:

答案 0 :(得分:0)

我回答了自己的问题。当我向CSV添加坐标时,我能够更新地图。但是,我不能删除它们。我也将继续努力。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.animation


# setup mercator map projection.
fig = plt.figure(figsize=(27, 20))
m = Basemap(projection='mill', lon_0=0)
m.drawcoastlines(color='r', linewidth=1.0)



def animate(i):

    df = pd.read_csv('c:/python/scripts/test2.csv', sep='\s*,\s*',header=0, encoding='ascii', engine='python'); df 


    for x,y,z,w in zip(df['sourcelon'], df['sourcelat'], df['destlon'], df['destlat']):
        line, = m.drawgreatcircle(x,y,z,w,color='r')



ani = matplotlib.animation.FuncAnimation(fig, animate, interval=100)
plt.tight_layout()
plt.show()