2014-03-27 3 views
3

basemap 맵에서 일부 밀도 데이터에 애니메이션을 적용하려고합니다. 에서 수행 된 같은 접근 방식에 따라 [이 SO 질문] [1], 나는 다음과 같은 오류가 발생합니다 : 내가 대신 self.quad.set_array(self.z.ravel())에 의해 널 (null) 값 init()의 데이터를 설정하면속성 오류를주는 mpl_toolkit.basemap을 사용한 pcolormesh()의 애니메이션

/usr/local/lib/python2.7/dist-packages/matplotlib/collections.pyc in update_scalarmappable(self) 
    627   if self._A is None: 
    628    return 
--> 629   if self._A.ndim > 1: 
    630    raise ValueError('Collections can only map rank 1 arrays') 
    631   if not self.check_update("array"): 

AttributeError: 'list' object has no attribute 'ndim' 

, 내가 두 사람과 함께 결국은지도를 그려 데이터가 애니메이션으로 표시되지 않습니다.

내가 잘못하고있는 것에 누군가가 흘릴 수있는 모든 빛은 크게 감사 할 것입니다. 감사!

예제 코드는 :

def plot_pcolor(lons,lats): 

    class UpdateQuad(object): 

     def __init__(self,ax, map_object, lons, lats): 
       self.ax = ax 
       self.m = map_object 
       self.lons = lons 
       self.lats = lats 

       self.ydim, self.xdim = lons.shape 

       self.z = np.zeros((self.ydim-1,self.xdim-1)) 

       x, y = self.m(lons, lats) 
       self.quad = ax.pcolormesh(x, y, self.z, cmap=plt.cm.Reds) 

     def init(self): 
      print 'update init' 
      self.quad.set_array([]) 
      return self.quad 

     def __call__(self,i): 

      data = np.zeros((self.ydim-1,self.xdim-1)) 

      for i in range(self.ydim-1): 
       for j in range(self.xdim-1): 
        data[i,j]=random.random()+4 

      self.quad.set_array(data.ravel()) 
      return self.quad 

    fig = plt.figure() 
    ax = fig.add_axes([0.1,0.1,0.8,0.8]) 

    m = Basemap(width=2000000,height=2000000, 
       resolution='l', projection='laea',\ 
       lat_ts=10.,\ 
       lat_0=64.,lon_0=10., ax=ax) 

    m.fillcontinents() 

    ud = UpdateQuad(ax, m, lons, lats) 

    anim = animation.FuncAnimation(fig, ud, init_func=ud.init, 
            frames=20, blit=False) 

    plt.show() 

if __name__ == '__main__': 
    import matplotlib.pyplot as plt 
    import matplotlib.animation as animation 
    from mpl_toolkits.basemap import Basemap 
    import numpy as np 
    import random 

    lons = np.linspace(-5.,25., num = 25)[:50] 
    lats = np.linspace(56., 71., num = 25)[:50] 
    lons,lats = np.meshgrid(lons,lats) 

    plot_pcolor(lons,lats) 

답변

4

이 (내가 따랐다 예제가 제대로 작동 이유를 확인하지 않음) ndarray을 필요로한다 set_data 방법처럼 보인다.

따라서 init() 함수에서 quad.set_array([]) 대신 quad.set_array(np.array([]))을 사용해야합니다.

다른 문제는 알고 있어야합니다 : 전에 언급 한 바와 같이

  • , 당신은 또한 당신의 FuncAnimation() 전화에 blit=False을 설정합니다.

  • artist 쿼드를 animated에서 True으로 설정할 때도 문제가 발생했습니다. 해당 값으로 두십시오 (즉, 기본값 인 quad.set_animated(False)).

  • 첫 번째 pcolormesh() 호출에서 범위를 지정하지 않으면 전달하는 데이터 (내 경우 null)에 따라 경계를 설정하므로 빈 애니메이션이 생성됩니다. 초기 호출에서 나중에 애니메이션을 적용 할 데이터에 따라 설정하면 내 경우에는이 문제를 방지 할 수 있습니다.

  • pcolormesh()은 데이터 배열의 y 및 x 차원에서 +1이어야하는 데이터 필드에 경계 위치를 취합니다. 데이터 배열이 위치 데이터의 크기와 같거나 큰 경우 pcolormesh()은이 경계 요구 사항을 벗어나는 데이터를 생략합니다. 내 데이터가 하나의 그리드 셀에 의해 상쇄 된 것처럼 보일 것이라고 생각했지만 올바른 경계 위치를 통과하기 전에 모든 것이 엉망이었습니다. 이 HERE 계산에 대한 또 다른 질문을보십시오.

  • 이전 버전의 matplotlib에는 아주 좋은 오류보고가 없습니다. 최신 버전으로 업그레이드하는 것이 좋습니다.

어떤 임의의 문제 촬영 : matplotlibbasemap를 업데이트하고 기존 플로팅 루틴에서이를 구현하려고 한

, 내가받은 다음 오류 :

ValueError: All values in the dash list must be positive 
처음

내가 내 pcolormesh() 개체와 관련이 있다고 생각했지만 너무 오래 걸려서 이전 설정 인 dash으로 인한 것임을 알았습니다. 속성은 내 m.drawmeridians()dashes=[1,0]으로 전화하여 단단한 자오선을 찾습니다. 이 오류를 발생시키는 matplotlibthe handling of dashes was changed의 새 버전입니다. dash 속성에 실선을 설정하는 새로운 방법은 dashes=(None,None)입니다. 나는 싫어합니다.

얻어진 애니메이션 :

def plot_pcolor(lons,lats): 

    class UpdateQuad(object): 

     def __init__(self,ax, map_object, lons, lats): 
      self.ax = ax 
      self.m = map_object 
      self.lons = lons 
      self.lats = lats 
      vmin = 0 
      vmax = 1 
      self.ydim, self.xdim = lons.shape 

      self.z = np.zeros((self.ydim-1,self.xdim-1)) 

      levels = MaxNLocator(nbins=15).tick_values(vmin,vmax) 
      cmap = plt.cm.cool 
      norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True) 
      x, y = self.m(lons, lats) 

      self.quad = self.ax.pcolormesh(x, y, self.z, alpha=0.9, 
              norm=norm, cmap=cmap, 
              vmin=vmin, vmax=vmax) 
     def init(self): 
      print 'update init' 
      self.quad.set_array(np.asarray([])) 
      return self.quad 

     def __call__(self,i): 

      for i in range(self.ydim-1): 
       for j in range(self.xdim-1): 
        self.z[i,j]=random.random() 

      self.quad.set_array(self.z.ravel()) 

      return self.quad 


    fig, ax = plt.subplots() 

    m = Basemap(width=2000000,height=2000000, 
       resolution='l', projection='laea',\ 
       lat_ts=10.,\ 
       lat_0=64.,lon_0=10., ax=ax) 

    m.fillcontinents() 

    ud = UpdateQuad(ax, m, lons, lats) 

    anim = animation.FuncAnimation(fig, ud, init_func=ud.init, 
            frames=20, blit=False) 

    fig.tight_layout() 

    plt.show() 

    return ud.quad 

if __name__ == '__main__': 
    import matplotlib.pyplot as plt 
    import matplotlib.animation as animation 
    from mpl_toolkits.basemap import Basemap 
    import numpy as np 
    import random 
    from matplotlib.colors import BoundaryNorm 
    from matplotlib.ticker import MaxNLocator 

    lons = np.linspace(-5.,25., num = 25)[:50] 
    lats = np.linspace(56., 71., num = 25)[:50] 
    lons,lats = np.meshgrid(lons,lats) 

    quad = plot_pcolor(lons,lats) 
: 상기 출력위한

pcolormesh animation

코드 예