matplotlibとBasemap その1

matplotlibにBasemapを合わせて使うと、地図上へのプロットができるようになる。
Basemapがけっこう好き。
PythonxyのホームページのAdditionalPluginsの中にも入ってるし、導入もちょろい。

Plotting data on a map (Example Gallery)にある例を参考に、簡単なお絵かきをしてみた。
# -*- coding: utf-8

# 簡単な地図上へのプロット
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

# フォントの指定(※それぞれの環境で異なる)
import matplotlib.font_manager as fm
prop_e = fm.FontProperties(fname='E:\\usr\\Python27\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\arial.ttf')
prop_j = fm.FontProperties(fname='E:\\usr\\Python27\\Lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\ipag.ttf')

# 適当な場所の緯度と経度(東京駅と大阪駅)
tokyo_lat = 35.681394
tokyo_lon = 139.766060
osaka_lat = 34.701921
osaka_lon = 135.494985

fig = plt.figure(figsize=(8,8))
m = Basemap(projection='merc',llcrnrlat=32.0,urcrnrlat=40.1,\
            llcrnrlon=133.0,urcrnrlon=141.1, lat_ts=20,resolution='f')

m.drawcoastlines( linewidth=0.5, color='k' )
m.fillcontinents(color='#eeeeee',lake_color='#ddeeff')
m.drawstates( linewidth=0.5, color='k' )
m.drawcountries()
m.drawmapboundary(fill_color='#ddeeff')
# draw parallels and meridians.
# フォントの指定をしてない場合注意(fontproperties=prop_eを消す)
m.drawparallels(np.arange(32.0, 40.1, 2.0), labels = [1,0,0,0], fontsize=12, fontproperties=prop_e)
m.drawmeridians(np.arange(133.0, 141.1, 2.0), labels = [0,0,0,1], fontsize=12, fontproperties=prop_e)

# 東京駅
t_x, t_y = m( tokyo_lon, tokyo_lat)
m.plot( t_x, t_y, 'g*', ms = 10 )
# 大阪駅
o_x, o_y = m(osaka_lon, osaka_lat)
m.plot( o_x, o_y, 'bo', ms = 10 )
# 駅名を入れる。フォントの指定をしてない場合注意(fontproperties=prop_jを消す)
plt.text(o_x + 10000, o_y + 10000, u"大阪駅", fontproperties=prop_j)
plt.text(t_x + 10000, t_y + 10000, u"東京駅", fontproperties=prop_j)

if 1:
  plt.savefig('map.emf')
  plt.savefig('map.png')

if 1:
  plt.show()

結果はこんな感じ。

地図の下地を出す部分と、緯度・経度をXY座標に変換する部分を除けば、プロットの仕方は、matplotlibのまんま。
駅名の文字を出す位置をいじるのは、手探りで決めた→今後の課題か。
後、点をプロットする時は、本当なら、明示的に地図より上にプロットするように書いた方がいいのかもしれない。zorderか何か使う奴。
地図に色をつけて、矢印をプロットしたら、矢印が地図の下に隠れてしまった。

文字の正しい処理は今後の課題だけど、ひとまず、日本語も出た。