Lucy’s blog

プログラムで気になったことの覚書

緯度経度を用いてmatplotlibで地図をplotする

ざっくりですが覚書です。

環境:OSX,Anaconda,Python3.5

#必要なものをインポート

#matplotlibとBasemap (OSXではどちらもpip installで入手可能だった気がします。違ったらスミマセン。。)

 

 

import pandas as pd

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from mpl_toolkits.basemap import Basemap,cm

 

#データを用意

#csvファイルをpandas dataframeで読み込む

#(今回は1/10メッシュコードの土地利用データを緯度経度変換したもの)

df = pd.read_csv('test.csv',header=0)

----------

Lat,Lon,MeshCode_100m,Landuse

35.33333333333333,139.0,5339000000,100

35.33333333333333,139.00125,5339000001,1400

...

----------

 

#図の大きさ等指定

fig = plt.figure(figsize=(10,5)) #図の大きさ

fig.patch.set_alpha(0.0) #図全体の背景透明度

 

#描画領域の指定

north = max(df.Lat)
south = min(df.Lat)
east = max(df.Lon)
west = min(df.Lon)

m=Basemap(projection='merc',llcrnrlat=south,urcrnrlat=north,llcrnrlon=west,urcrnrlon=east,resolution='l')
m.drawparallels(np.arange(24.0, 48.1, 2.0), labels = [1,0,0,0], fontsize=12) #緯線を引く
m.drawmeridians(np.arange(125.0, 145.1, 4.0), labels = [0,0,0,1], fontsize=12) #経線を引く

 

#散布図を描く準備。流れは以下のような感じ。

##########################

#lonlist=list(df.Lon)
#latlist=list(df.Lat)
#data = list(df.data)
#x, y = m(lonlist,latlist)
#nx = len(lonlist)
#ny = len(latlist)
#lons,lats = m.makegrid(400,400)

###########################

 

#データフレームから必要なデータを取得

df0 = df[(df.Landuse == 100)]
df1 = df[(df.Landuse == 1400)]

 

#緯度経度をリスト化

lonall=list(df.Lon)
latall=list(df.Lat)

lon0=list(df0.Lon)
lat0=list(df0.Lat)
lon1=list(df1.Lon)
lat1=list(df1.Lat)

 

#プロットしたいデータの緯度経度を指定

xall,yall = m(lonall,latall)

x0, y0 = m(lon0,lat0)

x1, y1 = m(lon1,lat1)

 

#色を設定

ccolor=['#008000','#00FF00'] #16進数カラーコードで指定してもよし、色名で指定してもよし。

#ラベルを設定
cname= ['田','海浜']

 

#マーカーのサイズを指定

msize=8.0

#マーカーの透明度を指定

alpha=0.5

 

#散布図をプロット

plt.scatter(xall,yall,c='0.85',alpha=1.0,s=2.0,label='九十九里町',marker='o')

plt.scatter(x0,y0,c=ccolor[0],alpha=alpha,s=msize,label=cname[0],marker='o')#100
plt.scatter(x1,y1,c='olive',alpha=alpha,s=msize,label=cname[1],marker='o')#1400

 

#枠線をグレーにする

ax = plt.gca()                        # get current axis
ax.spines["right"].set_color("lightgray")  # 右枠
ax.spines["top"].set_color("lightgray")    # 上枠
ax.spines["left"].set_color("lightgray")      # 左枠
ax.spines["bottom"].set_color("lightgray")    # 下枠
ax.patch.set_alpha(0.0) #描画領域の中の背景透明度

 

#フォントを指定

fp = FontProperties(fname='/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc')

 

#タイトルを指定
plt.title('九十九里町',fontdict={'fontproperties':fp})

 

#凡例の設定

leg=plt.legend(loc='upper left',prop=fp,markerscale=1.0,bbox_to_anchor(-0.5,0.8),fancybox=1)
leg.get_frame().set_alpha(0.0) #凡例を透明にする←これやったら透明にはなったけどlegendの枠線が消えてしまいました。。

 

#ファイルを保存する
plt.savefig('example.png')

 

#描画を表示する

plt.show()

 

だいたいこんな感じの図が描けます。

f:id:harutaromaru:20170712103949p:plain