2014-01-05 5 views
2

아래의 코드는 애니메이션베이스 맵을 생성하지만 원하는 프레임을 생성하지 않습니다. 이전 프레임의 산점도를 사라지게 만들려고하지만 애니메이션의 나머지 부분은 그대로 유지됩니다.matplotlib의 기본 맵 위에 산점도를 애니메이트하려면 어떻게해야합니까?

베이스 맵이 실제로 인 것을 이해하지 못하는 것으로 의심됩니다.입니다. lat/lons를 호출하여 x/y로 투영하는 것을 이해하지만 event_map.scatter()를 호출 할 때 진행되는 일을 완전히 얻지는 못합니다.

import random 
import os 
import numpy as np 

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from matplotlib import animation 
import pandas as pd 
from IPython.display import HTML 


# Enables animation display directly in IPython 
#(http://jakevdp.github.io/blog/2013/05/12/embedding-matplotlib-animations/) 
from tempfile import NamedTemporaryFile 

VIDEO_TAG = """<video controls> 
<source src="data:video/x-m4v;base64,{0}" type="video/mp4"> 
Your browser does not support the video tag. 
</video>""" 

def anim_to_html(anim): 
    if not hasattr(anim, '_encoded_video'): 
     with NamedTemporaryFile(suffix='.mp4') as f: 
      anim.save(f.name, fps=20, extra_args=['-vcodec', 'libx264']) 
      video = open(f.name, "rb").read() 
     anim._encoded_video = video.encode("base64") 

    return VIDEO_TAG.format(anim._encoded_video) 

def display_animation(anim): 
    plt.close(anim._fig) 
    return HTML(anim_to_html(anim)) 

animation.Animation._repr_html_ = anim_to_html 



FRAMES = 20 
POINTS_PER_FRAME = 30 
LAT_MIN = 40.5 
LAT_MAX = 40.95 
LON_MIN = -74.15 
LON_MAX = -73.85 
FIGSIZE = (10,10) 
MAP_BACKGROUND = '.95' 
MARKERSIZE = 20 

#Make Sample Data 
data_frames = {} 
for i in range(FRAMES): 
    lats = [random.uniform(LAT_MIN, LAT_MAX) for x in range(POINTS_PER_FRAME)] 
    lons = [random.uniform(LON_MIN, LON_MAX) for x in range(POINTS_PER_FRAME)] 
    data_frames[i] = pd.DataFrame({'lat':lats, 'lon':lons})  


class AnimatedMap(object): 
    """ An animated scatter plot over a basemap""" 
    def __init__(self, data_frames): 
     self.dfs = data_frames 
     self.fig = plt.figure(figsize=FIGSIZE) 
     self.event_map = Basemap(projection='merc', 
       resolution='i', area_thresh=1.0, # Medium resolution 
       lat_0 = (LAT_MIN + LAT_MAX)/2, lon_0=(LON_MIN + LON_MAX)/2, # Map center 
       llcrnrlon=LON_MIN, llcrnrlat=LAT_MIN, # Lower left corner 
       urcrnrlon=LON_MAX, urcrnrlat=LAT_MAX) # Upper right corner 
     self.ani = animation.FuncAnimation(self.fig, self.update, frames=FRAMES, interval=1000, 
              init_func=self.setup_plot, blit=True, 
              repeat=False) 

    def setup_plot(self): 
     self.event_map.drawcoastlines() 
     self.event_map.drawcounties() 
     self.event_map.fillcontinents(color=MAP_BACKGROUND) # Light gray 
     self.event_map.drawmapboundary() 
     self.scat = self.event_map.scatter(x = [], y=[], s=MARKERSIZE,marker='o', zorder=10) 
     return self.scat 

    def project_lat_lons(self, i): 
     df = data_frames[i] 
     x, y = self.event_map(df.lon.values, df.lat.values) 
     x_y = pd.DataFrame({'x': x, 'y': y}, index=df.index) 
     df = df.join(x_y) 
     return df 

    def update(self, i): 
     """Update the scatter plot.""" 
     df = self.project_lat_lons(i) 
     self.scat = self.event_map.scatter(x = df.x.values, y=df.y.values, marker='o', zorder=10) 
     return self.scat, 


s = AnimatedMap(data_frames) 
s.ani 
+0

분명히 울퉁불퉁하다. 웬지 나는 그것을 고칠 수 없다. = ( – Dan

답변

3

각 업데이트마다 새 산점도를 추가하는 것처럼 보입니다. 대신 업데이트 할 때마다 기존 경로 모음의 데이터를 변경해야합니다.

def update(self, i): 
    """Update the scatter plot.""" 
    df = self.project_lat_lons(i) 
    new_offsets = np.vstack([df.x.values, df.y.values]).T 
    self.scat.set_offsets(new_offsets) 
    return self.scat, 

줄을 따라 무언가를 시험해보십시오. 나는 이것을 테스트하지 않았습니다.

+0

감사합니다. Jake – Dan

관련 문제