2017-06-11 15 views
0

matplotlibとBasemapを使用してマップ上にポイントをプロットしようとしています。ポイントは特定の建物の緯度/経度を表します。私のマップは本当に点をプロットしますが、間違った場所に配置します。私が同じデータを使用し、同じことをBokehを使って行うと、matplotlibとbasemapの代わりに正しいプロットが得られます。ここでベースマップを使用して緯度/経度をプロットする

はボケで正しい結果である: Bokeh Version

そして、ここでは、ベースマップに誤った結果である: Basemap Version

私はこれがあるという事実に関係している可能性を示唆している他の場所StackOverflowの上の議論を見てきましたplot()は何とか経度を「シフト」します。私は、そこからの提案を試してみました。 lons、lats = m.shiftdata(long、lat) シフトしたデータを使用します。それは目に見える影響はありませんでした。ベースマップとボケのプロットの両方を生成

私の完全なサンプルコードはここにある:

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import pandas as pd 

from bokeh.plotting import figure, show 
from bokeh.sampledata.us_states import data as states 
from bokeh.models import ColumnDataSource, Range1d 

# read in data to use for plotted points 
buildingdf = pd.read_csv('buildingdata.csv') 
lat = buildingdf['latitude'].values 
long = buildingdf['longitude'].values 

# determine range to print based on min, max lat and long of the data 
margin = .2 # buffer to add to the range 
lat_min = min(lat) - margin 
lat_max = max(lat) + margin 
long_min = min(long) - margin 
long_max = max(long) + margin 

# create map using BASEMAP 
m = Basemap(llcrnrlon=long_min, 
      llcrnrlat=lat_min, 
      urcrnrlon=long_max, 
      urcrnrlat=lat_max, 
      lat_0=(lat_max - lat_min)/2, 
      lon_0=(long_max-long_min)/2, 
      projection='merc', 
      resolution = 'h', 
      area_thresh=10000., 
      ) 
m.drawcoastlines() 
m.drawcountries() 
m.drawstates() 
m.drawmapboundary(fill_color='#46bcec') 
m.fillcontinents(color = 'white',lake_color='#46bcec') 
# convert lat and long to map projection coordinates 
lons, lats = m(long, lat) 
# plot points as red dots 
m.scatter(lons, lats, marker = 'o', color='r') 
plt.show() 


# create map using Bokeh 
source = ColumnDataSource(data = dict(lat = lat,lon = long)) 
# get state boundaries 
state_lats = [states[code]["lats"] for code in states] 
state_longs = [states[code]["lons"] for code in states] 

p = figure(
      toolbar_location="left", 
      plot_width=1100, 
      plot_height=700, 
      ) 

# limit the view to the min and max of the building data 
p.y_range = Range1d(lat_min, lat_max) 
p.x_range = Range1d(long_min, long_max) 
p.xaxis.visible = False 
p.yaxis.visible = False 
p.xgrid.grid_line_color = None 
p.ygrid.grid_line_color = None 

p.patches(state_longs, state_lats, fill_alpha=0.0, 
     line_color="black", line_width=2, line_alpha=0.3) 

p.circle(x="lon", y="lat", source = source, size=4.5, 
     fill_color='red', 
     line_color='grey', 
     line_alpha=.25 
     ) 
show(p) 

私はデータへのリンクを投稿するのに十分な評判ポイントを持っていないか、ここでそれを含めること。

答えて

3

ベースマッププロットでは、散点はfillcontinentsの後ろに隠れています。 2行を削除する

#m.drawmapboundary(fill_color='#46bcec') 
#m.fillcontinents(color = 'white',lake_color='#46bcec') 

あなたにポイントが表示されます。これは望ましくない可能性があるため、zorder引数を使用して、残りのマップの上にスキャターを配置することをお勧めします。ここで

enter image description here

m.scatter(lons, lats, marker = 'o', color='r', zorder=5) 
は完全なコード である(そして、それは誰もがの節約として、私は、質問をハードコーディングされたデータを次の時間を持つ実行可能な最小限の例のこの種を含めるようにお聞きしたいと思いますデータ身を考案作業)

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
import pandas as pd 
import io 

u = u"""latitude,longitude 
42.357778,-71.059444 
39.952222,-75.163889 
25.787778,-80.224167 
30.267222, -97.763889""" 

# read in data to use for plotted points 
buildingdf = pd.read_csv(io.StringIO(u), delimiter=",") 
lat = buildingdf['latitude'].values 
lon = buildingdf['longitude'].values 

# determine range to print based on min, max lat and lon of the data 
margin = 2 # buffer to add to the range 
lat_min = min(lat) - margin 
lat_max = max(lat) + margin 
lon_min = min(lon) - margin 
lon_max = max(lon) + margin 

# create map using BASEMAP 
m = Basemap(llcrnrlon=lon_min, 
      llcrnrlat=lat_min, 
      urcrnrlon=lon_max, 
      urcrnrlat=lat_max, 
      lat_0=(lat_max - lat_min)/2, 
      lon_0=(lon_max-lon_min)/2, 
      projection='merc', 
      resolution = 'h', 
      area_thresh=10000., 
      ) 
m.drawcoastlines() 
m.drawcountries() 
m.drawstates() 
m.drawmapboundary(fill_color='#46bcec') 
m.fillcontinents(color = 'white',lake_color='#46bcec') 
# convert lat and lon to map projection coordinates 
lons, lats = m(lon, lat) 
# plot points as red dots 
m.scatter(lons, lats, marker = 'o', color='r', zorder=5) 
plt.show() 
+0

ありがとうございます!そして、私はデータ(または少なくともいくつかのデータ)を含めなかったのは残念です。私はすべてのデータをcsvに添付することを意図しましたが、許可されませんでした。あなたのやり方と同じようにデータポイントを追加することは考えていませんでした。 – rsgny

+0

次回は、その方法を知っています。 ;-)また、リンクを直接入れることができない場合でも、URLをテキストとして提供し、他の人がそれに応じて投稿を編集できることを覚えておいてください。最後に、これで問題が解決された場合は、[受諾](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)と答えてください。 – ImportanceOfBeingErnest

関連する問題