5

I have an xarray DataArray da containing a slice of data for Ireland which looks like this:

<xarray.DataArray 'co2' (lat: 733, lon: 720)>
array([[nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   ...,
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan],
   [nan, nan, nan, ..., nan, nan, nan]])
Coordinates:
  * lat      (lat) float32 49.9 49.908333 49.916664 49.924995 49.933327 ...
  * lon      (lon) float32 -11.0 -10.991667 -10.983334 -10.975 -10.966667 ...

I can map it like so:

import matplotlib.pyplot as plt
import xarray
import os
from mpl_toolkits.basemap import Basemap, cm

m= Basemap(projection='cyl',lat_0=ds.co2.lat[0],lon_0=ds.co2.lon[len(ds.co2.lon)/2])
m.drawcoastlines()
da.plot()

The problem is that lat/lon gridlines don't plot.

enter image description here

When I use the meridians command:

meridians = np.arange(10.,351.,20.)
m.drawmeridians(meridians,labels=[True,False,False,True])

I get the following error:

ValueError: dimensions () must have the same length as the number of data dimensions, ndim=1

I do not know what to try next.

EDIT: Full error trace:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-46-45a293c8bb99> in <module>()
  4 
  5 # draw grid plots
----> 6 m.drawmeridians(np.arange(-8.0,2.0,1.0),labels=[1,0,0,0]) #longitudes
      7 m.drawparallels(np.arange(51.0,59.0,1.0),labels=[0,0,0,1]) #latitudes
      8 

C:\Users\AppData\Local\Continuum\Anaconda\lib\site-    packages\mpl_toolkits\basemap\__init__.pyc in drawmeridians(self, meridians, color, linewidth, zorder, dashes, labels, labelstyle, fmt, xoffset, yoffset, ax, latmax, **kwargs)
   2593             # don't really know why, but this appears to be needed to
   2594             # or lines sometimes don't reach edge of plot.
-> 2595             testx = np.logical_and(x>=self.xmin-3*xdelta,x<=self.xmax+3*xdelta)
   2596             x = np.compress(testx, x)
   2597             y = np.compress(testx, y)

C:\Users\\AppData\Local\Continuum\Anaconda\lib\site-packages\xarray\core\dataarray.pyc in func(self, other)
   1550 
   1551             variable = (f(self.variable, other_variable)
-> 1552                         if not reflexive
   1553                         else f(other_variable, self.variable))
   1554             coords = self.coords._merge_raw(other_coords)

C:\Users\\AppData\Local\Continuum\Anaconda\lib\site-packages\xarray\core\variable.pyc in func(self, other)
   1164                         if not reflexive
   1165                         else f(other_data, self_data))
-> 1166             result = Variable(dims, new_data)
   1167             return result
   1168         return func

C:\Users\\AppData\Local\Continuum\Anaconda\lib\site-packages\xarray\core\variable.pyc in __init__(self, dims, data, attrs, encoding, fastpath)
    255         """
    256         self._data = as_compatible_data(data, fastpath=fastpath)
--> 257         self._dims = self._parse_dimensions(dims)
    258         self._attrs = None
    259         self._encoding = None

C:\Users\\AppData\Local\Continuum\Anaconda\lib\site-packages\xarray\core\variable.pyc in _parse_dimensions(self, dims)
    364             raise ValueError('dimensions %s must have the same length as the '
    365                              'number of data dimensions, ndim=%s'
--> 366                              % (dims, self.ndim))
    367         return dims
    368 

ValueError: dimensions () must have the same length as the number of data dimensions, ndim=1
11
  • Could it be that your grid is too sparse and none of the meridians actually pass through the plotted area? Commented Oct 26, 2018 at 11:36
  • @Thomas I don't think so, I tried # draw grid plots m.drawmeridians(np.arange(-8.0,2.0,1.0),labels=[1,0,0,0]) #longitudes m.drawparallels(np.arange(51.0,59.0,1.0),labels=[0,0,0,1]) #latitudes and got the same error Commented Oct 26, 2018 at 14:41
  • Can you post the full error trace? Commented Oct 26, 2018 at 17:44
  • full error trace added! Commented Oct 27, 2018 at 10:21
  • 3
    Can you maybe send only a little part of it please? :) I guess the problem would exist with 1 MB too :) Commented Nov 5, 2018 at 15:23

2 Answers 2

3

Try to use cartopy instead of Basemap. See related issue here.

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks, but this is giving me the error ImportError: DLL load failed: The specified module could not be found. - I reinstalled all the packages and updated them, error persists :(
Trying Python 3.6 I get the error ValueError: Can't use axes when making faceted plots.
2
+50

TL:DR- I didn't have a problem using your code with your dataset, let's find out why

I used your small dataset, and this code:

ds=xarray.open_dataset(r"C:\Users\SHIR\Downloads\OneYear.nc")
da=ds.co2
m= Basemap(projection='cyl',lat_0=ds.co2.lat[0],lon_0=ds.co2.lon[len(ds.co2.lon)/2])
m.drawcoastlines()
da.plot()
plt.show()

I got this graph:

enter image description here

When adding the meridians, using:

ds=xarray.open_dataset(r"C:\Users\SHIR\Downloads\OneYear.nc")
da=ds.co2
m= Basemap(projection='cyl',lat_0=ds.co2.lat[0],lon_0=ds.co2.lon[len(ds.co2.lon)/2])
m.drawcoastlines()
meridians = np.arange(10.,351.,20.)
m.drawmeridians(meridians,labels=[True,False,False,True])
da.plot()
plt.show()

I got-

enter image description here

Things that I can think of that cause this difference between us:

First- The smaller dataset- please try the smaller dataset you sent me, and let me know if you get the error again

Second- Packages and versions- I'm using python 2.7. I didn't have basemap before, so I tried to install it using conda, and had tons of problems. In the end, I uninstalled matplotlib using conda (conda uninstall matplotlib), reinstalled it using pip (pip install matplotlib --upgrade --force-reinstall), and installed basemap manually like described in this answer. I used the basemap‑1.2.0‑cp27‑cp27m‑win_amd64.whl file.

I'm really not sure it was smart, and I didn't mess things up with conda, but that was the only thing that worked for me. Maybe try to uninstall only basemap, not matplotlib first (I did it because I already messed things up with it...)

1 Comment

Thank you so much for this. I think you're right about the package issue, Basemap seems to bring everything else backwards, which is an issue for other scripts I run also. I might avoid Basemap completely to avoid screwing up other code! Your answer answers my question however!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.