ホーム > matplotlibの使い⽅ > BasemapのTIPS

matplotlib:BasemapのTIPS


目次

[top]



Basemapの基本

Basemapのモジュール

mpl_toolkits.basemapモジュールからBasemapをインポート
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
以降はBasemapとして参照できる。同時にmatplotlibもインポートしておく

Basemapを呼び出す

fig = plt.figure() # プロット領域の作成
m = Basemap() # マップを作成
以降はm.メソッドのようなインスタンスメソッドを使った作図が可能

Basemapで経度線・緯度線を描く

m.drawmeridians(経度線を引く値のリスト) # 経度線を引く
m.drawparallels(緯度線を引く値のリスト) # 緯度線を引く

Basemapで海岸線を描く

m.drawcoastlines()

Basemapで国境線を描く

m.drawcountries()

Basemapで州の境界線を描く

m.drawstates()
南北アメリカ、オーストラリアのみ

Basemapで河川を描く

m.drawrivers()

Basemapで大陸と海洋を塗り分ける

図の背景を塗り潰すm.drawmapboundary()と大陸を塗り潰すm.fillcontinents()を使う

Basemapで地図の解像度を変更する

resolutionオプションを使う
m = Basemap(resolution='解像度')
resolution='c'(coarse、粗い解像度)、resolution='l'(low、低解像度)、resolution = 'i'(intermediate、中間解像度)、resolution='h'(high、高解像度)、resolution='f'(full、最高解像度)
デフォルト値:resolution='c'

Basemapの地図を衛星画像風や高度分布図風に変える

図の背景を衛星画像風に変えるm.bluemarble()や高度分布図風に変えるm.etopo()を使う。m.drawmapboundary()を行うと背景が塗り潰されるので、同時には使わない。大陸のみ塗り潰したい場合には、m.fillcontinents()を行うことはできる。

Basemapの地図

正距円筒図法

m = Basemap(projection='cyl')
デフォルトの図法
gradsのlatlonに相当する図法で、緯度線・経度線が直角かつ等間隔に交差

メルカトル図法

m = Basemap(projection='merc', llcrnrlon=経度下限, urcrnrlon=経度上限, llcrnrlat=緯度下限, urcrnrlat=緯度上限)

ポーラーステレオ図法(極投影図法)

ランベルト図法(ランベルト正角円錐図法)

m = Basemap(projection='lcc', lon_0=中心の経度,  lat_0=中心の緯度, width=幅, height=高さ)
幅と高さの単位はm
または
m = Basemap(projection='lcc', lon_0=中心の経度, lat_0=中心の緯度, llcrnrlon=経度下限, urcrnrlon=経度上限, llcrnrlat=緯度下限, urcrnrlat=緯度上限)

正射投影図法(平射図法)

m = Basemap(projection='ortho', lon_0=中心の経度, lat_0=中心の緯度)

ロビンソン図法

m = Basemap(projection='robin', lon_0=中心の経度, lat_0=中心の緯度)

モルワイデ図法

m = Basemap(projection='moll', lon_0=中心の経度, lat_0=中心の緯度)

ランベルト正積円筒図法

m = Basemap(projection='cea')

ミラー図法

m = Basemap(projection='mill', lon_0=中心の経度, lat_0=中心の緯度)

正距方位図法

m = Basemap(projection='aeqd', lon_0=中心の経度, lat_0=中心の緯度)

Basemapのデータプロット

経度・緯度データの作成

nlonsが経度方向のデータ数、nlatsが緯度方向のデータ数で、全球の格子点データの場合
delta = 2.*np.pi/(nlons-1) 
lons = (delta*np.indices((nlats,nlons))[1,:,:])
lats = (0.5*np.pi - delta*np.indices((nlats,nlons))[0,:,:])
m = Basemap(オプション)
x, y = m(lons*180./np.pi, lats*180./np.pi)
Numpyのnp.indicesを使い、経度(lons)、緯度(lats)データを作成し、図法に対応した(x, y)データに変換する

等高線を描く

m = Basemap(オプション)
m.contour(経度データ, 緯度データ, 等高線のデータ)

陰影を描く

m = Basemap(オプション)
m.contourf(経度データ, 緯度データ, 陰影のデータ)

陰影にカラーバーを付ける

cs = m.contourf(経度データ, 緯度データ, 陰影のデータ)
cbar = m.colorbar(cs)
cbar.set_label('カラーバーのラベルに表示する文字列')
カラーバーの調整方法については、カラーバー参照
(plt.colorbarと同じオプションを使用可能)

矢羽をプロットする

m = Basemap(オプション)
m.barbs(経度データ, 緯度データ, 東西風データ, 南北風データ)

文字をプロットする

Basemapのインスタンスを使い、経度、緯度を図法に対応した(x, y)に変換
m = Basemap(オプション)
x, y = m(経度, 緯度)
plt.text(x, y, "表示するテキスト")

マーカーをプロットする

m = Basemap(オプション)
x, y = m(経度, 緯度)
m.plot(x, y, "マーカーの色と種類")

図の体裁

タイトルを付ける

matplotlibのplt.titleを使う
plt.title("タイトル")
サブプロットにタイトルを付ける参照
タイトルの大きさや色を変更する参照

等高線を複数同時に描く場合に等高線上に文字を重ねない

細実線で4 hPa毎の等高線を描き、太実線で20 hPaの等高線を描き、20 hPaの等高線ラベルに気圧の値を表示した場合、細実線の上に文字が重なる。
次のように、細実線、太実線ともに気圧の値を書くことで、文字の下に等高線は描かれなくなる。
clevc = np.arange(960, 1080, 4) # 細実線を描く値
cleva = np.arange(960, 1080, 20) # 太実線を描く値
cr1 = m.contour(x, y, slp, clevc, linewidths=0.8, colors='k') # 細実線
cr2 = m.contour(x, y, slp, cleva, linewidths=1.2, colors='k') # 太実線
clevels = cr1.levels # 細実線を描いた気圧の値
cr1.clabel(clevels[::5], fontsize=12, fmt="%d") # 細実線ラベルに20 hPa毎気圧の値を表示
cr2.clabel(clevels[::5], fontsize=12, fmt="%d") # 太実線ラベルに20 hPa毎気圧の値を表示

極投影図法で0度と360度を滑らかにつなげる

経度方向144(東経0度から2.5度刻み)、緯度方向73(北緯90度から2.5度刻み)の場合
import numpy as np
nlons = 144 # 経度方向のデータ数
nlats = 73 # 緯度方向のデータ数
datasize = nlons * nlats
din = np.fromfile("入力ファイル名", dtype='<f4', count=datasize) # バイナリファイルから入力
data = np.zeros((nlats, nlons+1)) # 値が0の配列を作成
data[:,0:nlons] = din.reshape(nlats, nlons) # 0〜357.5度までコピー
data[:,nlons] = data[:,0] # 0度のデータを360度のデータにコピー
nlons = nlons + 1 # 後の処理で使うため、経度方向のデータ数を1増やす

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
fig = plt.figure() # プロット領域の作成
m = Basemap(projection='npstere', lon_0=180, boundinglat=20) # 北極中心の極投影図法

# 緯度・経度座標の準備(単位は度)
delta = 360./(nlons-1)
lons = (delta*np.indices((nlats,nlons))[1,:,:]) # 東経0度から2.5度刻み
lats = (90.-delta*np.indices((nlats,nlons))[0,:,:]) # 北緯90度から2.5度刻み
x, y = m(lons, lats) # 図法の経度、緯度に変換する

clevs = [等高線を描く値のリスト]
m.contour(x, y, data, clevs, linewidths=0.8, colors='k') # 等高線を描く
[top]