[AstroPy] Problem creating all-sky projection with matplotlib
Eduardo Bañados Torres
eebanado@uc...
Tue Sep 13 15:30:48 CDT 2011
Hi Matt,
Thanks for your response!! your explanation of why I was getting this
behavior is very clear.
So, I finally solved the problem (I think) thanks to your answer and the one
posted by Joe Kington in Stackoverflow.
This time I used pcolormesh instead of imshow and I got this beautiful (at
least for me) image:
http://i53.tinypic.com/2r6l5k6.png
The only "problem" is that now I cannot show the "grid" (ax.grid(True) is
not working), so if someone know how to add the grid, please let me know ;)
(although this is just a detail)
If this is useful for someone else, I attach the "corrected version" of my
code (which produces the image above).
Thanks again!
=========================corrected version========================
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.backends.backend_agg
#array between 0 and 360 deg
#CAVEAT: it seems that is needed an array from -180 to 180, so is just a
#shift in the coordinates
RA = np.random.random(10000)*360-180
#array between -45 and 90 degrees
DEC= np.random.random(10000)*135-45
fig = plt.Figure((10, 5))
ax = fig.add_subplot(111,projection='mollweide')
ax.set_xlabel('RA')
ax.set_ylabel('DEC')
ax.set_xticklabels(np.arange(30,331,30))
#The ax.grid is not working though =/
ax.grid(color='r', linestyle='-', linewidth=2)
hist,xedges,yedges =
np.histogram2d(DEC,RA,bins=[60,40],range=[[-90,90],[-180,180]])
X,Y = np.meshgrid(np.radians(yedges),np.radians(xedges))
image = ax.pcolormesh(X,Y,hist)
cb = fig.colorbar(image, orientation='horizontal')
canvas = matplotlib.backends.backend_agg.FigureCanvasAgg(fig)
fig.canvas.print_figure("image4.png")
2011/9/13 Matt Davis <mrdavis@stsci.edu>
> Hi Eduardo,
>
> You are seeing this behavior because imshow works just by filling in rows
> of the image with rows of your array. In your case, your array is zeros in
> the bottom quarter and non-zero in the top three-quarters, so that's what
> you see in the resulting plot. Imshow *does not* account for the projection.
>
> I think you would prefer to use pcolor so that your data is mapped to the
> projection. See:
> http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.pcolor
>
> Best,
>
> Matt Davis
>
> On Sep 13, 2011, at 9:38 AM, Eduardo Bañados Torres wrote:
>
> Hi all,
>
> I posted this question in Stackoverflow (
> http://stackoverflow.com/questions/7355497/curious-bad-behavior-creating-all-sky-projections-with-matplotlib)
> but I haven't get any answer so far, so I hope some of you can help me :-)
>
> In short, I am plotting a density all-sky plot using the molloweide
> projection. I create objects with coordinates ranging from 0 to 360 deg in
> RA and from -45 to 90 deg in DEC, but the output I get is the following:
>
> image1.png -> http://i56.tinypic.com/24mu96s.png
>
> A plot which is OK in RA (0-360) but in DEC ranges only between -35 to 90,
> so I am missing 10 degrees in the south.
>
> But I would expect this image:
>
> image2.png -> http://oi53.tinypic.com/2yl1nch.jpg
> A plot ranging between 0 to360 and -45 to 90 as it was defined
>
> I attach the self-contained code to produce these images, I hope someone
> can tell me if I am doing something wrong that I can't notice now or
> misunderstanding something in the code or if there is a curious bug in
> matplotlib??
>
>
> ############the self-contained example################
>
> import numpy as np
> import matplotlib.pyplot as plt
> import matplotlib.backends.backend_agg
> from math import pi
>
> #array between 0 and 360 deg
> RA = np.random.random(10000)*360
> #array between -45 and 90 degrees. By construction!
> DEC= np.random.random(10000)*135-45
>
> fig = plt.Figure((10, 5))
>
> ax = fig.add_subplot(111,projection='mollweide')
>
> ax.grid(True)
> ax.set_xlabel('RA')
>
> ax.set_ylabel('DEC')
>
> ax.set_xticklabels(np.arange(30,331,30))
>
> hist,xedges,yedges = np.histogram2d(DEC,RA,bins=[90,180],range=[[-90,90],[0,360]])
> #TO RECOVER THE EXPECTED BEHAVIOUR (image2.png), I HAVE TO CHANGE -90 FOR -80 IN THE PREVIOUS LINE:
> #hist,xedges,yedges = np.histogram2d(DEC,RA,bins=[90,180],range=[[-80,90],[0,360]])
> #I DO NOT WHY!
>
> extent = (-pi,pi,-pi/2.,pi/2.)
>
> image = ax.imshow(hist,extent=extent,clip_on=False,aspect=0.5,origin='lower')
>
> cb = fig.colorbar(image, orientation='horizontal')
>
> canvas = matplotlib.backends.backend_agg.FigureCanvasAgg(fig)
>
> fig.canvas.print_figure("image1.png")
>
> ######################################################
>
> Thanks,
>
>
>
> --
> Eduardo Bañados
>
> _______________________________________________
> AstroPy mailing list
> AstroPy@scipy.org
> http://mail.scipy.org/mailman/listinfo/astropy
>
>
>
--
Eduardo Bañados
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/astropy/attachments/20110913/7c2b7a0c/attachment-0001.html
More information about the AstroPy
mailing list