[Matplotlib-users] Problem using imshow with Matplotlib/Basemap

Jody Klymak jklymak at uvic.ca
Tue Oct 10 19:10:46 EDT 2017


I’m not 100% following, but can’t you just `np.roll` your data by N/2 to get it between -180 and +180 instead of 0 and 360, and set llcrnrlon=-180 and urcrnrlon=180?

I didn’t test, so sorry if that is a dumb suggestion...

Cheers,  Jody





> On 10 Oct 2017, at  16:04 PM, Mauro Cavalcanti <maurobio at gmail.com> wrote:
> 
> Dear Ben,
> 
> Sure, I am aware of Cartopy and have been following its development. However, I am afraid it is not yet mature enough for the kind of application I have been working on (a PyQt-based multiplatform desktop application for mapping biodiversity data). Documentation is also not as good as that already available for Matplotlib/Basemap. But I surely intend to take the time to eventually port my application to Cartopy!
> 
> That said, I will be very grateful if you can help me with the 'tricky' part of my problem. I have also another test version using meshgrid instead of imshow. It looks promising because only the gridded data is displayed on the map (while imshow covers the whole map). However, as the attached image show, I have to fiddle with the grid limits when creating the mesh, and even so the grid is not yet plotted in the correct position. 
> 
> With warmest regards,
> 
> 2017-10-10 17:25 GMT-03:00 Benjamin Root <ben.v.root at gmail.com <mailto:ben.v.root at gmail.com>>:
> So, the problem here is that what you are asking for is in conflict with the settings. You are giving bounding box that starts at llcrnrlon=lon_inf and goes to urcrnrlon=lon_sup, and that is the extent of the data you are providing, too. But you want to view it in a different bounds. It is possible to get what you want, but it starts to get tricky at this point.
> 
> Before venturing further, I should point out to you that Basemap is effectively deprecated. Its support will be terminated in 2020. The CartoPy project, also built on top of matplotlib, is a far superior library, and I think would be much easier for you to use. It doesn't do everything that basemap does yet, but the things that it does do, it does better. I suggest checking it out before we go any further here.
> 
> Cheers!
> Ben Root
> 
> 
> On Tue, Oct 10, 2017 at 2:57 PM, Mauro Cavalcanti <maurobio at gmail.com <mailto:maurobio at gmail.com>> wrote:
> Dear Ben,
> 
> Thanks a lot again for your help and patience. 
> 
> After modifying the call to Basemap according to your suggestion:
> 
> m = Basemap(llcrnrlat=lat_inf, llcrnrlon=lon_inf, urcrnrlat=lat_sup, urcrnrlon=lon_sup)
> 
> the grid is correctly displayed where it belongs (thr west coast of Africa). But now I got a map centered at the Pacific basin, with the grid appearing on the lower left corner of it! In fact, See the attached image. I would like a conventional map centered around the Atlantic basin (ie., with center coordinates at lat_0=0 and long_0=0).
> 
> After using the superb Matplotlib for almost a decade (in the beginning, I even got some help here from the legendary John Hunter!), I nonetheless feel somewhat ashamed of having found a potential bug in the library...
> 
> All the best,
> 
> 2017-10-10 12:20 GMT-03:00 Benjamin Root <ben.v.root at gmail.com <mailto:ben.v.root at gmail.com>>:
> Ah, the problem was that by default, the limits for a Basemap goes from -180 to 180, and -90 to 90. If you do:
> 
> m = Basemap(llcrnrlat=lat_inf, llcrnrlon=lon_inf,
>             urcrnrlat=lat_sup, urcrnrlon=lon_sup)
> 
> Then things line up correctly, and you don't need the origin keyword argument, the transpose, or even the extent argument.
> 
> In fact, there might even be a bug, as I would have expected specifying the extent should have worked regardless of the original bounds. Might need to look into that.
> 
> Cheers!
> Ben Root
> 
> 
> On Mon, Oct 9, 2017 at 7:54 PM, Mauro Cavalcanti <maurobio at gmail.com <mailto:maurobio at gmail.com>> wrote:
> Hi,
> 
> Thanks for you reply and suggestions.
> 
> I changed the imshow call to:
> 
> im = m.imshow(grilla_salida, cmap='summer', extent=(lon_inf, lat_inf, lon_sup, lat_sup), aspect='auto', interpolation='none')
> 
> However, the figure is stil wrong (see attachment).
> 
> Maybe if instead of imshow, should I use meshgrid/pcolormesh?
> 
> Best regards,
> 
> 2017-10-09 11:29 GMT-03:00 Benjamin Root <ben.v.root at gmail.com <mailto:ben.v.root at gmail.com>>:
> First, you shouldn't need to transpose your image... that'll effectively rotate the data by 90 degrees. Second, you didn't specify the extents of your image, so Basemap is putting everything starting at coordinate 0,0 in the default projection.
> 
> If you specify the extent keyword argument to imshow as the (lon1, lat1, lon2, lat2) tuple for the lower-left and upper right corners, you won't even need the origin='lower', and you definitely won't need the transpose.
> 
> Cheers!
> Ben Root
> 
> 
> On Sun, Oct 8, 2017 at 2:33 PM, Mauro Cavalcanti <maurobio at gmail.com <mailto:maurobio at gmail.com>> wrote:
> Dear ALL,
> 
> I have a simple dataset of longitudes/latitudes (see the attached csv file). 
> 
> From such data, I want to generate a grid like this:
> 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 1 0 0 0 0 0 0 
> 0 0 0 0 0 0 1 1 2 0 0 0 0 
> 0 0 0 0 0 1 1 1 1 0 0 0 0 
> 0 0 0 1 0 1 0 0 0 0 0 0 0 
> 0 0 0 2 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 1 3 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 1 0 0 0 
> 0 0 0 0 0 0 0 0 0 1 0 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 0 1 0 0 
> 0 0 0 0 0 0 0 0 0 0 1 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0 
> 0 0 0 0 0 0 0 0 0 0 0 0 0
> 
> which gives the number of data records in each cell of the grid, using one of the variables in the dataset ("spp") as a categorical (grouping) factor.
> 
> From this grid, I then want to create a heat map, superimposed on a Matplotlib/Basemap.
> 
> I wrote some code which does what I want (see the attachments).
> 
> It (mostly) works, but te problem is that the grid image is not being displayed correctly: as shown in the attached figure, it appears too small, and in the lower left corner of the map, instead of where it should be (the West coast of Africa, along the Gulf of Guinea). 
> 
> Thanks in advance for any assistance you can provide.
> 
> Best regards,
> 
> -- 
> Dr. Mauro J. Cavalcanti
> E-mail: maurobio at gmail.com <mailto:maurobio at gmail.com>
> Web: http://sites.google.com/site/maurobio <http://sites.google.com/site/maurobio>
> "Life is complex. It consists of real and imaginary parts."
> 
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org <mailto:Matplotlib-users at python.org>
> https://mail.python.org/mailman/listinfo/matplotlib-users <https://mail.python.org/mailman/listinfo/matplotlib-users>
> 
> 
> 
> 
> 
> -- 
> Dr. Mauro J. Cavalcanti
> E-mail: maurobio at gmail.com <mailto:maurobio at gmail.com>
> Web: http://sites.google.com/site/maurobio <http://sites.google.com/site/maurobio>
> "Life is complex. It consists of real and imaginary parts."
> 
> 
> 
> 
> -- 
> Dr. Mauro J. Cavalcanti
> E-mail: maurobio at gmail.com <mailto:maurobio at gmail.com>
> Web: http://sites.google.com/site/maurobio <http://sites.google.com/site/maurobio>
> "Life is complex. It consists of real and imaginary parts."
> 
> 
> 
> 
> -- 
> Dr. Mauro J. Cavalcanti
> E-mail: maurobio at gmail.com <mailto:maurobio at gmail.com>
> Web: http://sites.google.com/site/maurobio <http://sites.google.com/site/maurobio>
> "Life is complex. It consists of real and imaginary parts."
> <meshgrid.py><Figure_1.png><testdata.csv>_______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org <mailto:Matplotlib-users at python.org>
> https://mail.python.org/mailman/listinfo/matplotlib-users <https://mail.python.org/mailman/listinfo/matplotlib-users>
--
Jody Klymak    
http://web.uvic.ca/~jklymak/





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20171010/b5ef6ad4/attachment-0001.html>


More information about the Matplotlib-users mailing list