basemap icon indicating copy to clipboard operation
basemap copied to clipboard

Fail on basemap.drawcounties() Python 3.5.2

Open scollis opened this issue 8 years ago • 23 comments

Platform:

Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux

Throws error on basemap.drawcounties() (over Illinois)

 Traceback (most recent call last):
  File "animate_aws.py", line 171, in <module>
    writer='imagemagick', fps=5)
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/matplotlib/animation.py", line 832, in save
    anim._init_draw()
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/matplotlib/animation.py", line 1221, in _init_draw
    self._draw_frame(next(self.new_frame_seq()))
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/matplotlib/animation.py", line 1243, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "animate_aws.py", line 166, in animate
    display.basemap.drawcounties()
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 1980, in drawcounties
    default_encoding='latin-1',drawbounds=drawbounds)
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/__init__.py", line 2146, in readshapefile
    for shprec in shf.shapeRecords():
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/shapefile.py", line 543, in shapeRecords
    for rec in zip(self.shapes(), self.records())]
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/shapefile.py", line 515, in records
    r = self.__record()
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/shapefile.py", line 491, in __record
    value = u(value)
  File "/home/scollis/anaconda/envs/pyart35/lib/python3.5/site-packages/mpl_toolkits/basemap/shapefile.py", line 58, in u
    return v.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 2: invalid continuation byte

scollis avatar Oct 12 '16 18:10 scollis

>>> import matplotlib
>>> matplotlib.__version__
'1.5.3'
>>> 


scollis avatar Oct 12 '16 20:10 scollis

Does installing the version that is in the repository fix the problem?

micahcochran avatar Dec 16 '16 21:12 micahcochran

Having this problem too. Python 3.5.2 on matplotlib version 1.5.1 and 1.5.3 (tried both).

johnrobertlawson avatar Jan 10 '17 21:01 johnrobertlawson

but which version of basemap?

On Tue, Jan 10, 2017 at 4:39 PM, John Lawson [email protected] wrote:

Having this problem too. Python 3.5.2 on matplotlib version 1.5.1 and 1.5.3 (tried both).

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-271706160, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-EnEDI6AQBQzV5dH-unS9GNh2iMmks5rQ_qIgaJpZM4KVEE9 .

WeatherGod avatar Jan 10 '17 21:01 WeatherGod

Is it possible to have the failing code to try and reproduce the issue?

guziy avatar Jan 10 '17 21:01 guziy

I'm using Basemap version 1.0.7, which is the newest Anaconda will install under Python 3.5.2. (I notice there are newer Basemap versions.)

The code uses one of my own packages but you can get the idea with this example:

# W is a class instance that loads a WRF model netCDF datafile
# Hope it's fairly self-descriptive here

def create_basemap(W,ax=None):
    width_m = W.dx*(W.x_dim-1)
    height_m = W.dy*(W.y_dim-1)
    m = Basemap(projection='lcc',lon_0=W.cen_lon,lat_0=W.cen_lat,lat_1=W.truelat1,
            lat_2=W.truelat2,resolution='i',area_thresh=500,ax=ax,
            width=width_m,height=height_m,)
    mx, my = m(W.lons,W.lats)
    return m, mx, my

# data is a 2-D numpy array from that netCDF file

fig,axes = plt.subplots(4,4)
    mm,mx,my = create_basemap(W,ax=axes.flat[0])
    mm.contourf(mx,my,data)
    mm.drawcounties()

johnrobertlawson avatar Jan 10 '17 22:01 johnrobertlawson

@johnrobertlawson I had to tweak your code for me but it seems there is no issue for basemap 1.0.8

Here is the quick notebook:

https://github.com/guziy/PyNotebooks/blob/master/basemap_demos/drawcoastlines_issue.ipynb

Cheers

guziy avatar Jan 10 '17 22:01 guziy

@guziy Thanks for verifying that. What's your Python version?

johnrobertlawson avatar Jan 10 '17 22:01 johnrobertlawson

My python info:

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

What worries me a bit here is that I do not see the plotted field... Are my projection params too off?

Cheers

guziy avatar Jan 10 '17 22:01 guziy

Ah ok, now I see the field, had lons and lats in the wrong order in m.__call__

Cheers

guziy avatar Jan 10 '17 22:01 guziy

Turns out, after removing the data plotting (i.e. simply trying to plot a basemap), the counties still break the script. I tried to reproduce your exact code and it also breaks. This leaves just the 1.0.7 vs 1.0.8 version. I'm going to look into why conda update basemap doesn't go past 1.0.7.

johnrobertlawson avatar Jan 10 '17 23:01 johnrobertlawson

I'm going to look into why conda update basemap doesn't go past 1.0.7.

@johnrobertlawson basemap version 1.0.8 has not been released. If you want to read more about that read issue #267.

micahcochran avatar Jan 11 '17 15:01 micahcochran

@micahcochran Good to know, thanks.

johnrobertlawson avatar Jan 11 '17 15:01 johnrobertlawson

Set your channel to conda-forge to get the unofficial v1.0.8.

On Wed, Jan 11, 2017 at 10:11 AM, John Lawson [email protected] wrote:

@micahcochran https://github.com/micahcochran Good to know, thanks.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-271893363, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-HsCTjpPRQXbNAHOs3R0WSdp2hfgks5rRPEEgaJpZM4KVEE9 .

WeatherGod avatar Jan 11 '17 15:01 WeatherGod

@WeatherGod I'm running basemap version 1.0.8, Python version 3.5.2, matplotlib 2.0.0. For me, drawcounties() doesn't give an error, it simply does nothing. I get no county boundaries drawn. Here is my code:

mm = Basemap(projection = 'merc', lat_0 = 42.0, lon_0 = -83.0, resolution = 'i', area_thresh = 0.1,
            llcrnrlon = -86.0, llcrnrlat = 39.0, urcrnrlon = -80.0, urcrnrlat = 45.0)
mm.drawmapboundary()
mm.fillcontinents(color = 'brown', lake_color = 'blue')
mm.drawcounties()
plt.show()

There is a similar problem on stackoverflow here but unfortunately it has no answer. Any ideas?

datacathy avatar Feb 02 '17 18:02 datacathy

Could you try explicitly setting a color for the county lines? I am starting to wonder if a change in defaults in matplotlib is causing a problem.

On Thu, Feb 2, 2017 at 1:42 PM, Catharine Wyss [email protected] wrote:

@WeatherGod https://github.com/WeatherGod I'm running basemap version 1.0.8, Python version 3.5.2, matplotlib 2.0.0. For me, drawcounties() doesn't give an error, it simply does nothing. I get no county boundaries drawn. Here is my code:

mm = Basemap(projection = 'merc', lat_0 = 42.0, lon_0 = -83.0, resolution = 'i', area_thresh = 0.1, llcrnrlon = -86.0, llcrnrlat = 39.0, urcrnrlon = -80.0, urcrnrlat = 45.0) mm.drawmapboundary() mm.fillcontinents(color = 'brown', lake_color = 'blue') mm.drawcounties() plt.show()

There is a similar problem on stackoverflow here http://stackoverflow.com/questions/38827756/matplotlib-basemap-drawcounties-doesnt-work but unfortunately it has no answer. Any ideas?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-277044311, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-NdVBXbNyKLOETYfUv_QadMMF_Drks5rYiODgaJpZM4KVEE9 .

WeatherGod avatar Feb 02 '17 18:02 WeatherGod

@datacathy

It fills continents over your county boundaries (which is a bit weird)... A workaround is to use mm.drawcounties(zorder=20)

Cheers

guziy avatar Feb 02 '17 18:02 guziy

oooh, good catch! Perhaps I should update the default zorder of the county stuff so that it goes above other stuff?

On Thu, Feb 2, 2017 at 1:53 PM, Huziy Oleksandr (Sasha) < [email protected]> wrote:

@datacathy https://github.com/datacathy

It fills continents over your county boundaries (which is a bit weird)... A workaround is to use mm.drawcounties(zorder=20)

Cheers

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-277047335, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-LwitRatOYuc_zzXTN5aFVK1crWEks5rYiYWgaJpZM4KVEE9 .

WeatherGod avatar Feb 02 '17 19:02 WeatherGod

Oooh, it is a bit more trickier than that. drawstates() and drawcountries() is implemented using LineCollection objects, but drawcounties() is implemented using a PolyCollection, which has a lower default zorder. This wouldn't be too much of an issue, but because the coastline drawing is done as PolyCollection, and came after the county drawing, the coastline stuff clobbers the county polygons. Perhaps I can "fix" it by keeping the counties as PolyCollection for backwards compat, but initializing it with the default zorder of a LineCollection (which is what the documentation says it should do, anyway).

On Thu, Feb 2, 2017 at 2:00 PM, Benjamin Root [email protected] wrote:

oooh, good catch! Perhaps I should update the default zorder of the county stuff so that it goes above other stuff?

On Thu, Feb 2, 2017 at 1:53 PM, Huziy Oleksandr (Sasha) < [email protected]> wrote:

@datacathy https://github.com/datacathy

It fills continents over your county boundaries (which is a bit weird)... A workaround is to use mm.drawcounties(zorder=20)

Cheers

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-277047335, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-LwitRatOYuc_zzXTN5aFVK1crWEks5rYiYWgaJpZM4KVEE9 .

WeatherGod avatar Feb 02 '17 19:02 WeatherGod

@guziy it works, thanks for the workaround! @WeatherGod thanks for looking into it.

datacathy avatar Feb 02 '17 19:02 datacathy

Created #340 that should help fix this

On Thu, Feb 2, 2017 at 2:16 PM, Benjamin Root [email protected] wrote:

Oooh, it is a bit more trickier than that. drawstates() and drawcountries() is implemented using LineCollection objects, but drawcounties() is implemented using a PolyCollection, which has a lower default zorder. This wouldn't be too much of an issue, but because the coastline drawing is done as PolyCollection, and came after the county drawing, the coastline stuff clobbers the county polygons. Perhaps I can "fix" it by keeping the counties as PolyCollection for backwards compat, but initializing it with the default zorder of a LineCollection (which is what the documentation says it should do, anyway).

On Thu, Feb 2, 2017 at 2:00 PM, Benjamin Root [email protected] wrote:

oooh, good catch! Perhaps I should update the default zorder of the county stuff so that it goes above other stuff?

On Thu, Feb 2, 2017 at 1:53 PM, Huziy Oleksandr (Sasha) < [email protected]> wrote:

@datacathy https://github.com/datacathy

It fills continents over your county boundaries (which is a bit weird)... A workaround is to use mm.drawcounties(zorder=20)

Cheers

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/matplotlib/basemap/issues/324#issuecomment-277047335, or mute the thread https://github.com/notifications/unsubscribe-auth/AARy-LwitRatOYuc_zzXTN5aFVK1crWEks5rYiYWgaJpZM4KVEE9 .

WeatherGod avatar Feb 02 '17 19:02 WeatherGod

I have the same problem. I've solved it. I replace all "utf-8" with "latin-1" in shapefile.py, which located in ~/Library/Python/3.7/lib/python/site-packages/shapefile.py

Ackeraa avatar Apr 03 '19 02:04 Ackeraa

The suggestion given by @Ackeraa worked for me as well. 👍🏽

andersonbrito avatar May 13 '19 01:05 andersonbrito