matplotlibのアニメーション機能で立体(3D)地形図を回転してみる
前回作成した、
奥穂高岳、涸沢岳、北穂高岳、前穂高岳、西穂高岳などの穂高連峰から涸沢カール、屏風岩にかけての地形図をmatplotlibのアニメーション機能で回転して動かしてみる。
こんな感じ。
ほんとは、もう少し大きな画像で1度づつ360度、滑らかに回転した結果をアップロードしたかったのですが、はてなにアップロード出来る画像が10MBまでなので、はてなへの直アップロードだとこのくらいが限界。というかアニメーションGIFって結構大きな容量になるのねw
ソース
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'])