読者です 読者をやめる 読者になる 読者になる

サーバー管理メモ メモφ(.. )

CentOS、Mac、サーバー管理、Python関係の個人的メモ書きです

Matplotlib Basemapで作成した地図に画像を貼付けてみる。

basemap

先日↓で作成した地図に
Matplotlib Basemapで作成した地図に矢印を書き入れてみる。 - サーバー管理メモ メモφ(.. )

こんな画像を貼付けてみる。
f:id:memomemokun:20160508232218p:plain

結果はこんな感じ。
f:id:memomemokun:20160508232953j:plain

追加したのは以下の行。

# 指定の緯度経度領域に画像を貼付ける
x0, y0 = m(131., 31.)
x1, y1 = m(132., 32.)
plt.imshow(plt.imread('3.png'),  extent = (x0, x1, y0, y1))

# add_axesで領域を分割して画像を貼付ける
# 左下のx座標、左下のy座標、横の長さ、縦の長さ
# 読み込んだ画像の縦横のアスペクト比は1対1.683168316831683
axicon = fig.add_axes([0.7,0.6,0.1,0.1*1.683168316831683])
axicon.imshow(plt.imread('3.png'), origin = 'upper')
axicon.set_xticks([])
axicon.set_yticks([])


ソース

#!/usr/bin/env python
# -*- 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_m = fm.FontProperties(fname='/Library/Fonts/ヒラギノ明朝 Pro W3.otf')
prop_g = fm.FontProperties(fname='/Library/Fonts/ヒラギノ丸ゴ Pro W4.otf')
 
# 適当な場所の緯度と経度
sendai_lat = 31.833611
sendai_lon = 130.189444
genkai_lat = 33.515556
genkai_lon = 129.837222

fig = plt.figure(figsize=(10,10))

# epsg:EPSGコード(3857:測地系(WGS84)球面(半径6378137m)メルカトル図法)
# resolution:地図の境界の解像度  lat_ts:スケールが正しくなる緯度
m = Basemap(epsg=3857, resolution='i', lat_ts=31, 
            llcrnrlat=30.8, urcrnrlat=34.2,
            llcrnrlon=129.0, urcrnrlon=132.5)

 
m.drawcoastlines(linewidth=0.25)
m.drawcountries(linewidth=0.25)

m.drawparallels(np.arange(10.0, 90.0, 1.0), labels = [1,0,0,0], fontsize=12, fontproperties=prop_m) # 緯度線と左枠にラベル
m.drawmeridians(np.arange(0.0, 180.0, 1.0), labels = [0,0,0,1], fontsize=12, fontproperties=prop_m) # 経度線と下枠にラベル

# 矢印の描画
x,y=m(sendai_lon,sendai_lat)
u,v=0.01,-0.1
Q = m.quiver(x,y,u,v, width=0.002, color='blue', angles='xy', headwidth=5, scale=1,units='width')

# 矢印のスケールの描画
qk = plt.quiverkey(Q, 0.1, 0.1, 0.1, '10 m', labelpos='W')

# 川内原発
t_x, t_y = m( sendai_lon, sendai_lat)
m.plot( t_x, t_y, 'g*', ms = 10 )
# 玄海原発
o_x, o_y = m(genkai_lon, genkai_lat)
m.plot( o_x, o_y, 'bo', ms = 10 )
# テキストを入れる
plt.text(o_x + 10000, o_y - 5000, u"玄海原発", fontproperties=prop_g)
plt.text(t_x + 10000, t_y - 5000, u"川内原発", fontproperties=prop_g)


# 指定の緯度経度領域に画像を貼付ける
x0, y0 = m(131., 31.)
x1, y1 = m(132., 32.)
plt.imshow(plt.imread('3.png'),  extent = (x0, x1, y0, y1))

# add_axesで領域を分割して画像を貼付ける
# 左下のx座標、左下のy座標、横の長さ、縦の長さ
axicon = fig.add_axes([0.7,0.6,0.1,0.1*1.683168316831683])
axicon.imshow(plt.imread('3.png'), origin = 'upper')
axicon.set_xticks([])
axicon.set_yticks([])

plt.savefig('1.jpg')
plt.show()

Matplotlib Basemapで作成した地図に矢印を書き入れてみる。

basemap

国土地理院の下記の地殻変動の図のような、

長期の地殻変動【国土地理院】
f:id:memomemokun:20160505112939p:plain

大地がどの地点でどんな風に動いているかMatplotlib Basemapで作成した自前の地図に矢印を書き入れてみたく、取りあえず、1本だけ矢印を引いてみました。



座標X,Yにベクトル(U,V)を描画するには、こんな感じで

Q = m.quiver(x,y,u,v, width=0.002, color='blue', angles='xy', headwidth=5, scale=1,units='width')


矢印(quiver)のオプションとしては

  • 矢印の形状のオプション(width)
width 矢印の柄の部分の幅
headwidth 矢羽の部分の幅(柄に垂直な方向)
headlength 矢羽の部分の長さ(柄に沿った方向)
headaxislength 矢羽の付け根部分の長さ
  • 矢印の色(color)
  • 矢印のアスペクト比(angles)
uv デフォルト。アスペクト比は1。
xy xy軸のアスペクト比に合わせる。

通常、図のアスペクト比は1ではないので、angles='xy'を指定しないと矢印の向きが正しく表現されないので注意。

  • 矢印のスケール(units)
width/height 描画領域の幅/高さを1とする。図の拡大にあわせて比を保つ。
dots/inches 図の解像度(dpi)に基づいたピクセル/インチ


など

#!/usr/bin/env python
# -*- 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_m = fm.FontProperties(fname='/Library/Fonts/ヒラギノ明朝 Pro W3.otf')
prop_g = fm.FontProperties(fname='/Library/Fonts/ヒラギノ丸ゴ Pro W4.otf')
 
# 適当な場所の緯度と経度
sendai_lat = 31.833611
sendai_lon = 130.189444
genkai_lat = 33.515556
genkai_lon = 129.837222


plt.figure(figsize=(10,10))
# epsg:EPSGコード(3857:測地系(WGS84)球面(半径6378137m)メルカトル図法)
# resolution:地図の境界の解像度  lat_ts:スケールが正しくなる緯度
m = Basemap(epsg=3857, resolution='i', lat_ts=31, 
            llcrnrlat=30.8, urcrnrlat=34.2,
            llcrnrlon=129.0, urcrnrlon=132.5)

 
m.drawcoastlines(linewidth=0.25)
m.drawcountries(linewidth=0.25)

m.drawparallels(np.arange(10.0, 90.0, 1.0), labels = [1,0,0,0], fontsize=12, fontproperties=prop_m) # 緯度線と左枠にラベル
m.drawmeridians(np.arange(0.0, 180.0, 1.0), labels = [0,0,0,1], fontsize=12, fontproperties=prop_m) # 経度線と下枠にラベル

# 矢印の描画
x,y=m(sendai_lon,sendai_lat)
u,v=0.01,-0.1
Q = m.quiver(x,y,u,v, width=0.002, color='blue', angles='xy', headwidth=5, scale=1,units='width')

# 矢印のスケールの描画
qk = plt.quiverkey(Q, 0.1, 0.1, 0.1, '10 m', labelpos='W')

# 川内原発
t_x, t_y = m( sendai_lon, sendai_lat)
m.plot( t_x, t_y, 'g*', ms = 10 )
# 玄海原発
o_x, o_y = m(genkai_lon, genkai_lat)
m.plot( o_x, o_y, 'bo', ms = 10 )
# テキストを入れる
plt.text(o_x + 10000, o_y - 5000, u"玄海原発", fontproperties=prop_g)
plt.text(t_x + 10000, t_y - 5000, u"川内原発", fontproperties=prop_g)

plt.savefig('1.jpg')
plt.show()

結果はこんな感じ。
図の矢印は例として、適当に引いたものですので、矢印の向き大きさには何の意味もありません。

f:id:memomemokun:20160505115506j:plain


例は、矢印1本だけでしたが、quiver(x,y,u,v)の引数には、ベクトルの始点(x,y)とベクトルの成分(u,v)を配列で一括で渡せますので、国土地理院さんから取得したGPSの変動データーを使って、自前でも、何となく、地殻変動の図を描けそうですね。

2006/04/03-2006/04/17-->2016/04/02-2016/04/16
Code    B(deg.) L(deg.) EW(m)  NS(m)  H(m)    Name
000841  34.9498 139.0699 0.0778-0.0432 0.0412 HIEKAWATOUGE-A
000842  34.9543 138.2499 0.1533-0.0227 0.0132 OKABE-A
000843  35.1749 134.0495 0.2890-0.0803-0.0133 OKAYAMAKAMO-A
010844  40.8344 140.8105 0.5643-0.7291 0.0936 AOMORI-A
010845  37.3618 140.3244 2.2795-0.2430-0.0124 KOHRIYAMA1-A
010846  33.8184 133.4618 0.1040 0.0024 0.0370 KOUCHIOOKAWA-A
020847  35.1605 137.8688 0.1983-0.0350 0.0735 MISAKUBO-A
020848  45.5141 141.9552 0.1163-0.1248 0.0051 WAKKANAI3
020849  45.2301 141.8818 0.1111-0.1345 0.0127 WAKKANAI4
020850  44.9905 142.2923 0.0923-0.1230 0.0031 NAKATONBETSU
020851  44.9161 142.0218 0.1162-0.1313-0.0128 HORONOBE
020852  44.7432 142.0387 0.1062-0.1326 0.0128 NAKAGAWA
020853  44.5465 142.5712 0.0673-0.1169 0.0181 BIFUKA
020854  44.3323 142.9358 0.0492-0.1026 0.0194 NISHIOKOPPE
020855  44.3177 141.8722 0.1093-0.1554 0.0295 HABORO2
020856  44.2609 143.3646 0.0290-0.0859 0.0065 MONBETU
020857  44.1655 142.4009 0.0645-0.1412 0.0146 SHIBETU
020858  44.1144 142.6012 0.0542-0.1226 0.0160 HOKKAIDOUASAHI
020859  44.0650 144.9935-0.0763 0.0232 0.0346 SHARI2
020860  44.0521 141.8607 0.0909-0.1533 0.0137 OBIRA2
020861  43.9099 143.5342-0.0141-0.0710 0.0074 IKUTAHARA
020862  43.8893 142.2365 0.0710-0.1499 0.0193 ASAHIKAWA2
020863  43.8787 143.1767 0.0190-0.0841 0.0178 SHIRATAKI
020864  43.7940 145.0569-0.1086 0.0229 0.0127 SHIBETSU2
020865  43.7257 142.1323 0.0785-0.1581 0.0125 FUKAGAWA
020866  43.7103 143.3811-0.0098-0.0782 0.0141 RUBESHIBE
020867  43.6469 142.7944 0.0289-0.1190 0.0372 HIGASHIKAWA
020868  43.6446 143.9917-0.0544-0.0346 0.0181 TSUBETSU