Pythonでアニメーションマップの作製(新型コロナ)

  • URLをコピーしました!

今は新型コロナの国内感染が広がってます。先日私の住む町でも感染者が出ました。気を引き締めて感染予防に努めないと、ですね。ところで、新型コロナが日本国内にどのような感染拡大を見せているのか、確認したいと思います。日本地図に日付別に感染者居住地の県庁所在地をプロットしていきたいと思います。

データは?

東洋経済オンライン「新型コロナウイルス国内感染の状況」
https://toyokeizai.net/sp/visual/tko/covid19/

こちらで使われているデータより行いました。とてもまとまっていて、すぐに使う事ができました。本当に感謝します。
https://github.com/kaz-ogiwara/covid19

2020/2/11~2020/3/5のデータからプロットしました。プロット結果は以下のようになりました。

ソース

プロットする際、前回と同じ方法で実施できなかったので別の方法で行いました。その辺りをご紹介していきたいと思います。日本地図を背景にする時に以下のようにすることで簡単に対応できました。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def make_map_plot(date, data, ax=None):
const.MAP_URL = 'http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi'
const.MAP_LAYER = 'BlueMarble_ShadedRelief'
ax.add_wmts(const.MAP_URL, const.MAP_LAYER)
def make_map_plot(date, data, ax=None): const.MAP_URL = 'http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi' const.MAP_LAYER = 'BlueMarble_ShadedRelief' ax.add_wmts(const.MAP_URL, const.MAP_LAYER)
def make_map_plot(date, data, ax=None):
const.MAP_URL = 'http://map1c.vis.earthdata.nasa.gov/wmts-geo/wmts.cgi'
const.MAP_LAYER = 'BlueMarble_ShadedRelief'
ax.add_wmts(const.MAP_URL, const.MAP_LAYER)

以下はプロットしていく関数です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def make_map_plot(date, data, ax=None):
if ax is None:
fig = plt.figure(figsize=(19.2, 10.8))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_wmts(const.MAP_URL, const.MAP_LAYER)
ax.set_extent([128.3966, 146.0063, 30.7804, 45.6192], crs=ccrs.PlateCarree())
datas = data[data['Date'] <= date]
for place, place_data in datas.groupby('Place'):
place_counts = place_data.groupby(['Lon', 'Lat']).count()
index = list(place_counts.index)
longs = [each[0] for each in index]
lats = [each[1] for each in index]
sizes = place_counts['Place']*10
ax.scatter(longs, lats, s=sizes,
color='#02b3e4', alpha=0.8,
transform=ccrs.PlateCarree())
return ax
def make_map_plot(date, data, ax=None): if ax is None: fig = plt.figure(figsize=(19.2, 10.8)) ax = plt.axes(projection=ccrs.PlateCarree()) ax.add_wmts(const.MAP_URL, const.MAP_LAYER) ax.set_extent([128.3966, 146.0063, 30.7804, 45.6192], crs=ccrs.PlateCarree()) datas = data[data['Date'] <= date] for place, place_data in datas.groupby('Place'): place_counts = place_data.groupby(['Lon', 'Lat']).count() index = list(place_counts.index) longs = [each[0] for each in index] lats = [each[1] for each in index] sizes = place_counts['Place']*10 ax.scatter(longs, lats, s=sizes, color='#02b3e4', alpha=0.8, transform=ccrs.PlateCarree()) return ax
def make_map_plot(date, data, ax=None):

    if ax is None:
        fig = plt.figure(figsize=(19.2, 10.8))
        ax = plt.axes(projection=ccrs.PlateCarree())

    ax.add_wmts(const.MAP_URL, const.MAP_LAYER)
    ax.set_extent([128.3966, 146.0063, 30.7804, 45.6192], crs=ccrs.PlateCarree())
    datas = data[data['Date'] <= date] 

    for place, place_data in datas.groupby('Place'):
        
        place_counts = place_data.groupby(['Lon', 'Lat']).count()
        
        index = list(place_counts.index)
        longs = [each[0] for each in index]
        lats = [each[1] for each in index]
        sizes = place_counts['Place']*10
        
        ax.scatter(longs, lats, s=sizes,
                color='#02b3e4', alpha=0.8,
                transform=ccrs.PlateCarree())
    
    return ax

以下でExcelデータを読み込み、↑を呼び出して画像ファイルを保存していきます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def create_japan_map():
fontname = 'Open Sans'
fontsize = 28
start_date = datetime(2020, 2, 15)
end_date = datetime(2020, 3, 1)
df = pd.read_excel('covid19JapanData.xlsx','data',header=0)
df['Date'] = pd.to_datetime(df['Date'])
print(df.head())
fig = plt.figure(figsize=(14, 10))
ax = plt.axes(projection=ccrs.PlateCarree())
for ii, days in enumerate(range((end_date - start_date).days)):
date = start_date + timedelta(days)
print(date)
ax = make_map_plot(date, df, ax=ax, resolution='high')
ax.text(140, 32,
f"{date.strftime('%Y/%m/%d')}",
color='white',
fontname=fontname, fontsize=fontsize*1.3,
transform=ccrs.PlateCarree())
fig.savefig(f"frames_japan/frame_{date.strftime('%Y%m%d')}.png", dpi=100,
frameon=False, facecolor='black')
ax.clear()
def create_japan_map(): fontname = 'Open Sans' fontsize = 28 start_date = datetime(2020, 2, 15) end_date = datetime(2020, 3, 1) df = pd.read_excel('covid19JapanData.xlsx','data',header=0) df['Date'] = pd.to_datetime(df['Date']) print(df.head()) fig = plt.figure(figsize=(14, 10)) ax = plt.axes(projection=ccrs.PlateCarree()) for ii, days in enumerate(range((end_date - start_date).days)): date = start_date + timedelta(days) print(date) ax = make_map_plot(date, df, ax=ax, resolution='high') ax.text(140, 32, f"{date.strftime('%Y/%m/%d')}", color='white', fontname=fontname, fontsize=fontsize*1.3, transform=ccrs.PlateCarree()) fig.savefig(f"frames_japan/frame_{date.strftime('%Y%m%d')}.png", dpi=100, frameon=False, facecolor='black') ax.clear()
def create_japan_map():
    fontname = 'Open Sans'
    fontsize = 28

 
    start_date = datetime(2020, 2, 15)
    end_date = datetime(2020, 3, 1)

    df = pd.read_excel('covid19JapanData.xlsx','data',header=0)
    df['Date'] = pd.to_datetime(df['Date'])
    print(df.head())

    fig = plt.figure(figsize=(14, 10))
    ax = plt.axes(projection=ccrs.PlateCarree())

    for ii, days in enumerate(range((end_date - start_date).days)):
        date = start_date + timedelta(days)
        print(date)
        ax = make_map_plot(date, df, ax=ax, resolution='high')

        ax.text(140, 32, 
                f"{date.strftime('%Y/%m/%d')}", 
                color='white',
                fontname=fontname, fontsize=fontsize*1.3,
                transform=ccrs.PlateCarree())

        fig.savefig(f"frames_japan/frame_{date.strftime('%Y%m%d')}.png", dpi=100,     
                    frameon=False, facecolor='black')
        ax.clear()
  • URLをコピーしました!

コメント

コメントする

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

目次
  1. データは?
  2. ソース