プログラム日記φ(..)

おもにPython関係のプログラムメモ

matplotlibのアニメーション機能で立体(3D)地形図を回転してみる

前回作成した、

 

memomemokun.hateblo.jp

 

奥穂高岳涸沢岳北穂高岳前穂高岳西穂高岳などの穂高連峰から涸沢カール、屏風岩にかけての地形図をmatplotlibのアニメーション機能で回転して動かしてみる。

 

こんな感じ。

ほんとは、もう少し大きな画像で1度づつ360度、滑らかに回転した結果をアップロードしたかったのですが、はてなにアップロード出来る画像が10MBまでなので、はてなへの直アップロードだとこのくらいが限界。というかアニメーションGIFって結構大きな容量になるのねw

f:id:memomemokun:20181102153909g:plain

 

ソース 

import requests
from io import StringIO
import string
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation 


#地形データを読み込む
url = 'http://cyberjapandata.gsi.go.jp/xyz/dem/13/7228/3208.txt'
response = requests.get(url)

#標高値がない区画はとりあえず0mに置換する
maptxt = string.replace(response.text, u'e', u'-0.0')
Z = pd.read_csv(StringIO(maptxt), header=None)


#X,Y軸のグリッドを生成
X, Y = np.meshgrid(np.linspace(0,255,256), np.linspace(255,0,256))

fig = plt.figure(figsize=(8, 7), dpi=80, facecolor='w', edgecolor='k')
elevation = range(1500,3500,25)

''' この関数が1フレームごとに呼び出され -4度ずつアングルを変えた地形図を作成 '''
def update_map(angle):

    # 画像クリア
    plt.cla()
    
    # プロット中の軸の取得。gca はGet Current Axes の略。
    ax = fig.gca(projection='3d')

    # -4度ずつ左回りにアングルを変える
    ax.view_init(70, angle * -4)

    # 横を1.0/0.8=1.25倍長く設定
    ax.set_aspect(0.8, adjustable='box') 

    #標高25m間隔で等高線を描く
    cont = plt.contour(X, Y, Z, levels=elevation, cmap='hot_r')


# インターバル300ms、90フレームのアニメーションを作成する
ani = animation.FuncAnimation(fig, update_map, interval=300, frames = 90) 
# imagemagickで作成したアニメーションをGIFで書き出す
ani.save("ani.gif", writer="imagemagick")

# ffmpegで作成したアニメーションをmp4で書き出す
#ffmpeg = animation.FFMpegWriter(fps=30)
#ani.save('ani.mp4', writer=ffmpeg, extra_args=['-vcodec', 'libx264'])