ホーム > 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のWarningを消す

MatplotlibDeprecationWarningが出る場合
import warnings
warnings.filterwarnings('ignore', category=matplotlib.MatplotlibDeprecationWarning)

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のデータプロット

経度・緯度データの作成

等高線を描く

m = Basemap(オプション)
x, y = m(経度データ, 緯度データ)
m.contour(x, y, 等高線のデータ)
経度データ、緯度データ、等高線のデータは2次元

陰影を描く

m = Basemap(オプション)
x, y = m(経度データ, 緯度データ)
m.contourf(x, y, 陰影のデータ)
経度データ、緯度データ、陰影のデータは2次元

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

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

矢羽をプロットする

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

文字をプロットする

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

マーカーをプロットする

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

マスクアウト処理

Basemap.is_landを使って陸面マスクを作成し、陸面データをNaNにする

疑似カラープロット

pcolorを使う
m = Basemap(オプション)
x, y = m(経度データ, 緯度データ)
m.pcolor(x, y, カラープロットのデータ)
経度データ、緯度データ、カラープロットのデータは2次元
pcolorの代わりにpcolormeshを使うこともできる

図の体裁

タイトルを付ける

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

複数の等高線を同時に描く

細実線と太実線を別々に描き太実線にラベルを付けると、ラベルの下に細実線が描かれてしまう。
次のように、細実線、太実線を同時に描くことで、文字の下に等高線は描かれなくなる。

極投影図法で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]