Pythonでアニメーションマップの作製

Pythonでアニメーションマップを作成しました。アニメーションマップが作成出来ればよかったので、題材は「海外在留邦人数調査統計」の2005年~2017年までの遷移にしました。こんな感じです。

mami
まさか、まさかの、、あまり大きな変化なし。。

そうなんです。人数は増えていっているんです。微妙に直径が大きくなってるの、分かりません??でもアニメーションにするには題材が弱かった・・・

弱かった・・・

気を取り直して、ソース

def create_national_map():
    fontname = 'Open Sans'
    fontsize = 28

    year_x = 0
    year_y = -50

    start_year = 2002
    end_year = 2017

    df = pd.read_excel('NationalsOverseasData.xlsx','data',header=0)
    print(df.head())

    os.environ['CARTOPY_USER_BACKGROUNDS'] = const.FOLDER_CARTOPYBG
    fig = plt.figure(figsize=(19.2, 10.8))
    ax = plt.axes(projection=ccrs.Mercator(central_longitude=0,  
                                        min_latitude=-65,
                                        max_latitude=70))

    for year in range(start_year ,end_year+1):
        ax = make_map_plot(year, df, ax=ax, resolution='low')

        # Date text
        ax.text(year_x, year_y, 
                f"{year:04d}", 
                color='white',
                fontname=fontname, fontsize=fontsize*1.3,
                transform=ccrs.PlateCarree())

        fig.tight_layout(pad=-0.5)
        fig.savefig(f"frames/frame_{year:04d}.png", dpi=100,     
                    frameon=False, facecolor='black')
        ax.clear()




def make_map_plot(year, df , ax=None, resolution='low'):
    
    if ax is None:
        fig = plt.figure(figsize=(19.2, 10.8))
        ax = plt.axes(projection=ccrs.Mercator(min_latitude=-65,
                                               max_latitude=70))
    
    ax.background_img(name='BM', resolution=resolution)
    ax.set_extent([-170, 179, -65, 70], crs=ccrs.PlateCarree())
    
    # http://www.hp-stylelink.com/news/2013/07/20130708.php
    colors = {
            'Ⅰ アジア': '#d5848b',
            'Ⅱ 大洋州': '#ae8dbc' ,
            'Ⅲ 北米': '#f8e352',
            'Ⅳ 中米': '#e1cea3',
            'Ⅴ 南米': '#c8d627',
            'Ⅵ 西欧': '#c3cfa9',
            'Ⅶ 東欧・旧ソ連': '#66b7ec',
            'Ⅷ 中東': '#c08e47',
            'Ⅸ アフリカ': '#e5ab47',
            'Ⅹ 南極': '#7b9ad0',
            }

    for index, row in df.iterrows():

        area = row['Area']
        longs = row['lon']
        lats = row['lat']
        sizes = row[year]/20
        
        ax.scatter(longs, lats, s=sizes,
                color=colors[area], alpha=0.8,
                transform=ccrs.PlateCarree())
    
    return ax

画像はNASAデータのをダウンロードしました。画像の置き場所はCARTOPY_USER_BACKGROUNDS環境変数の場所に置く必要があります。CARTOPY_USER_BACKGROUNDSの場所は管理しやすい場所にしやすかったので、以下で指定します。

 os.environ['CARTOPY_USER_BACKGROUNDS'] = const.FOLDER_CARTOPYBG

同フォルダにimage.jsonを配置する必要があります。

{"__comment__": "JSON file specifying the image to use for a given type/name and resolution. Read in by cartopy.mpl.geoaxes.read_user_background_images.",
  "BM": {
    "__comment__": "Blue Marble Next Generation, July ",
    "__source__": "https://neo.sci.gsfc.nasa.gov/view.php?datasetId=BlueMarbleNG-TB",
    "__projection__": "PlateCarree",
    "low": "RenderData.jpg"
  },
}

とっても簡単にできますね!すごい!
データを集める方が大変だったんですが、、これを使ってもっとカッコいいアニメーションマップ作成できるようになりたいですね。もっと有益で大量に取得出来るデータを集めて再トライしようと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)