2017-02-22 83 views
3

我已经创建了一个小型项目,需要一个NHL城市,然后绘制团队在整个赛季中的路径。如何动画matplotlib的drawgreatcircle函数?

产生的图形是凌乱:

Messy Graphic

所以我的想法是,如果我的动画飞行路线会很有意思,有点像看一个印第安纳琼斯电影,其中线从长一点到另一点。

我从查看其他matplotlib示例的理解是动画函数接受函数,计算它的输出,然后更新图形。我不知道drawgreatcircle怎么可能会这样,因为每当我打电话给它时,我都会得到一条完整的线。

有关我如何处理这个问题的任何想法?

下面是来自样本代码的样本图像下面

Sample Image

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

fig = plt.figure(figsize=(10, 10)) 
m = Basemap(projection='merc', resolution=None, 
        llcrnrlon=-125, llcrnrlat=25, # LL = lower left 
        urcrnrlon=-60, urcrnrlat=55) #UR = upper right 
m.etopo(scale=0.5, alpha=0.5) 


# Ottawa to Anaheim 
# Ottawa 
lat1 = 45.4215 
lon1 = -75.6972 

# Anaheim 
lat2 = 33.8353 
lon2 = -117.9145 

m.drawgreatcircle(lon1,lat1,lon2,lat2) 
+0

如果你没有太在意数学细微然后就直线插补的纬度,经度应该OK,如果你避开电线杆 – f5r5e5d

+0

什么是线性插值? –

+0

什么是NHL城市? – ImportanceOfBeingErnest

回答

1

drawgreatcicle返回matplotlib line2D从中可以使用get_data获取数据。所以这个想法是画出大圆圈,获取数据,然后删除它。使用这些数据,可以执行动画,迭代数组。

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import matplotlib.animation 

fig = plt.figure(figsize=(6, 4)) 
m = Basemap(projection='merc', resolution=None, 
        llcrnrlon=-125, llcrnrlat=25, # LL = lower left 
        urcrnrlon=-60, urcrnrlat=55) #UR = upper right 
m.etopo(scale=0.5, alpha=0.5) 

# Ottawa to Anaheim 
# Ottawa 
lat1 = 45.4215 
lon1 = -75.6972 

# Anaheim 
lat2 = 33.8353 
lon2 = -117.9145 

line, = m.drawgreatcircle(lon1,lat1,lon2,lat2) 
x,y = line.get_data() 

line.remove() 
del line 

line, = plt.plot([],[]) 

def update(i): 
    line.set_data(x[:i], y[:i]) 

ani = matplotlib.animation.FuncAnimation(fig, update, frames=len(x), interval=100) 
ani.save(__file__+".gif", writer="imagemagick", fps=10) 
plt.tight_layout() 
plt.show() 

enter image description here

+0

当我将此代码复制到Spyder中时,出现此错误,“TypeError:'路径'对象不可迭代”。它发生在线上,= m.drawgreatcircle(lon1,lat1,lon2,lat2)。如果我删除了“行”上的逗号,我找回了一个Path对象,我看到它是一个数组,但我无法索引或访问这些值。 –

+0

那么,根据[文档](http://matplotlib.org/basemap/api/basemap_api.html#mpl_toolkits.basemap.Basemap.drawgreatcircle)'drawgreatcircle'返回一个'matplotlib.lines.Line2D'对象。上面的解决方案使用了这个事实,它适用于2013年发布的底图版本1.0.7,并且仍然是我看到的最新正式版本。该问题于2014年推出,并于2016年末发布[https://github.com/matplotlib/basemap/issues/322],因此目前的开发版本也应该返回line2D。 – ImportanceOfBeingErnest

+0

如果您不想升级或降级底图安装,应该可以从路径中获取点。如果'p'是一个路径,'points = p.vertices'给出二维数组中的点,例如'x = points [:,0]'和 'y = points [:,1]'应该给你该坐标。不幸的是,我目前无法测试它。 – ImportanceOfBeingErnest