【问题标题】:Matplotlib animate multiple great circles and update from pandas dfMatplotlib 动画多个大圆圈并从 pandas df 更新
【发布时间】:2018-03-01 15:21:02
【问题描述】:

我已经创建了一张地图,并且正在将经纬度坐标的 CSV 文件读入 Pandas DataFrame。在读取 DataFrame 后,我已经成功地使用“for”循环绘制了多个大弧线。

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

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

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

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

【问题讨论】:

  • 您似乎在每次创建大圆时都在删除和删除它。就像a = 5; del a; print(a) - 想知道为什么a 不见了。
  • 啊,不。情况更糟。你从来没有真正调用过animate,所以xy 是未定义的。一般来说,阅读并理解minimal reproducible example,如果您在此处需要帮助,请在没有任何外部数据的情况下提供您的问题。
  • 我试图模仿这里的例子link
  • 我写了那个例子;但我不能在这里给出答案,因为我不知道你到底想做什么。数据似乎有几个轨迹,但最后你只使用其中一个。其他人应该怎么办?当然,在示例中,该行在动画开始之前 被删除。
  • 明白,更新帖子以更清楚地说明问题。

标签: python pandas matplotlib updating


【解决方案1】:

我回答了我自己的问题。当我将坐标添加到 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()

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多