Problem using imshow with Matplotlib/Basemap

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

Problem using imshow with Matplotlib/Basemap

Mauro Cavalcanti
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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

grid.py (1K) Download Attachment
testdata.csv (380 bytes) Download Attachment
Figure_1.png (85K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Benjamin Root
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users



_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Mauro Cavalcanti
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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

Figure_1.png (62K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Benjamin Root
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Mauro Cavalcanti
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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

Figure_1.png (93K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Benjamin Root
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Mauro Cavalcanti
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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

meshgrid.py (1K) Download Attachment
Figure_1.png (20K) Download Attachment
testdata.csv (380 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Jody Klymak
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: 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
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

--
Jody Klymak    






_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: Problem using imshow with Matplotlib/Basemap

Mauro Cavalcanti
Dear Jody,

Thank you very much for your suggestion! It looks interesting and I will play with it. (By the way, I don't consider any suggestion here as "dumb" and value very much all of them.)

All the best,

2017-10-10 20:10 GMT-03:00 Jody Klymak <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users





-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."




-- 
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: 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
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users

--
Jody Klymak    








--
Dr. Mauro J. Cavalcanti
E-mail: [hidden email]
Web: http://sites.google.com/site/maurobio
"Life is complex. It consists of real and imaginary parts."

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users