title: Plotting Lat/Long Points Using Basemap
body: <p>I am trying to plot points on a map using matplotlib and Basemap, where the points represent the lat/long for specific buildings.  My map does indeed plot the points, but puts them in the wrong location.  When I use the same data and do the same thing using Bokeh, instead of matplotlib and basemap, I get the correct plot.</p>
  
  <p>Here is the CORRECT result in Bokeh:
  <a href="https://i.stack.imgur.com/edrH5.png" rel="nofollow noreferrer">Bokeh Version</a></p>
  
  <p>And here is the INCORRECT result in Basemap:
  <a href="https://i.stack.imgur.com/L3R3H.png" rel="nofollow noreferrer">Basemap Version</a></p>
  
  <p>I have seen discussion elsewhere on StackOverflow that suggested this might be related to the fact that plot() "shifts" the longitude somehow.  I've tried the suggestion from there, which was to include the line:
      lons, lats = m.shiftdata(long, lat)
  and then use the shifted data.  That didn't have any visible impact.</p>
  
  <p>My full sample code which generates both of the plots in Basemap and Bokeh is here:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I don't have enough reputation points to post a link to the data or to include it here.</p>