Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

contour not closed across 0 meridian in polar projection #416

Open
Xunius opened this issue Aug 1, 2018 · 6 comments
Open

contour not closed across 0 meridian in polar projection #416

Xunius opened this issue Aug 1, 2018 · 6 comments

Comments

@Xunius
Copy link

Xunius commented Aug 1, 2018

Hi all,
I'm trying to fetch contour line coordinates from a npaeqd projection plot and I noticed that the contour lines will be broken into 2 parts whenever it crosses the 0-degree longitude, even though they form a closed contour and after calling addcyclic(). Below is minimal working example:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import addcyclic
from mpl_toolkits.basemap import Basemap

lats=np.linspace(0,90,90)
lons=np.linspace(0,360,360)

# make some toy data
xx,yy=np.meshgrid(lons,lats)
z=np.cos(xx*np.pi/180)*np.sin(yy*np.pi/180)

# add cyclic
z,lons=addcyclic(z,lons)
xx,yy=np.meshgrid(lons,lats)

# get contours
bmap=Basemap(projection='npaeqd',boundinglat=0,lon_0=0,
        resolution='l')

fig=plt.figure(figsize=(12,6))
ax1=fig.add_subplot(1,2,1)

contours=bmap.contour(xx,yy,z,[-0.6,0.6],latlon=True,ax=ax1)
bmap.drawcoastlines(ax=ax1)

clines1=contours.collections[0].get_paths()
clines2=contours.collections[1].get_paths()

print 'len(clines1), num of contours across 180', len(clines1)
print 'len(clines2), num of contours across 0', len(clines2)

# plot contours
ax2=fig.add_subplot(1,2,2)

xs=clines1[0].vertices[:,0]
ys=clines1[0].vertices[:,1]
ax2.plot(xs,ys,'b-',label='Contour across 180')

xs=clines2[0].vertices[:,0]
ys=clines2[0].vertices[:,1]
ax2.plot(xs,ys,'r-',label='Half contour across 0')

xs=clines2[1].vertices[:,0]
ys=clines2[1].vertices[:,1]
ax2.plot(xs,ys,'g-',label='Half contour across 0')

ax2.legend()

plt.show(block=False)

Figure output here
The yellow contour on the left are made up by 2 lines (red+green) on the right. This makes it difficult when I try to detect and track some features that move across the 0-meridian.
Is it intended or a bug?

Some specs:
basemap 1.0.7
matplotlib 2.2.2, both installed via conda install

@WeatherGod
Copy link
Member

WeatherGod commented Aug 1, 2018 via email

@Xunius
Copy link
Author

Xunius commented Aug 1, 2018

Cheers @WeatherGod. I assume by projecting the data you meant calling the m.transform_scalar() function? I thought basemap did that before doing the contour under the hood so the contours should be closed.
I'm currently trying to manually link those discontinuities as their coordinates do overlap. I'm bit concerned with possible accuracy lost in the projection approach. I've to project the data to do contouring, and also project the longitude/latitude mesh so I could get lon/lat coordinates from the contours, do I?

@WeatherGod
Copy link
Member

WeatherGod commented Aug 1, 2018 via email

@Xunius
Copy link
Author

Xunius commented Aug 1, 2018

Or it computes the contour and only project the contour?

@chayanroyc
Copy link

I still get this error, File "C:\Users\acer\Anaconda3\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 5111, in addcyclic return list(map(_addcyclic,arr[:-1]) + [_addcyclic_lon(arr[-1])]) TypeError: unsupported operand type(s) for +: 'map' and 'list'

@Xunius
Copy link
Author

Xunius commented Aug 8, 2019

@chayanroyc See this issue #440

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants