[yt-users] sliceplot and frb problems

Matthew Turk matthewturk at gmail.com
Fri Dec 6 06:54:16 PST 2013


Hi Kathy,

On Thu, Dec 5, 2013 at 4:22 PM, Kathy Eastwood <kathy.eastwood at nau.edu> wrote:
> Hi, Matt
>
> I am still struggling with this issue of creating non-square plots. I can
> now create an FRB, and get plots from it, but I cannot seem to get anything
> except square plots. And because my matplotlib experience is "limited", to
> say the least, I'm not sure exactly what the square plot represents.

To be honest, I always struggle a bit when I have to do matplotlib
operations like this -- so I completely understand!  On the plus side,
what it looks like is that you're at the point where you can manually
manipulate the matplotlib plots pretty in depth.

>
> So, here is one of the SlicePlots from before, 1 kpc wide by 2 kpc tall
> (even though I would like it to be even taller, and even though it cuts off
> the side of the plot window).
>
>
> from yt.mods import *
> %matplotlib inline
> import matplotlib.pyplot as plt
> import matplotlib.colorbar as cb
> from matplotlib.colors import LogNorm
>
> import numpy as np
>
> pf = load("Strat_Box_hdf5_plt_cnt_0064")
> slc = SlicePlot(pf, 'x', 'Density',center='c',width=((1,"kpc"),(2.0,"kpc")))
> slc.annotate_title('This is a Density plot')
> slc.save('test_2kpc.png')
> slc.show()
>
> and here is the plot:
> http://i.imgur.com/wW64TYV.png
>
> So, with the ultimate goal of creating an even taller plot with an FRB, and
> using your suggestions, I tried using an FRB, which is now working mostly
>
> sl = pf.h.slice(2, pf.domain_center[2],fields=["Density","Temperature"] )
> frb = sl.to_frb( (1.0, 'kpc'), (2048,1024),height=(2.0, 'kpc'))
> fig = plt.figure()
> ax = fig.add_axes([0.1,0.1,0.85,0.85])

I think this might be where it's making the square plot.  The add_axes
call accepts a rectangle definition which is defined as [left, bottom,
width, height].  So the axes you're describing will in fact be square.
 I think you want it to have an aspect ratio of 2.0 and you'll want
the figure to be that way too.  So you'll need to change the figure
call:

plt.figure((width, height))

(where width and height are in inches, which is typically pixel_size /
dpi, where dpi is default 100) and then try with the usual axes call
you had above.  The axes width, height are both relative, so I think
for a non-unitary aspect ratio figure, they can remain the same here.

Here's some documentation:
http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.add_axes

I think there are examples of this on matplotlib's website, but I
wasn't able to find them off-hand.

You might also have luck doing this interactively, so that you can
quickly iterate on the commands -- I think that the only ones that are
going to be necessary to experiment with are fig = ... , ax = ...,
ax.imshow and fig.savefig.

Hope that helps!

-Matt

>
> ax.imshow(frb["Density"],
>     origin="lower",
>     norm = LogNorm(),
>     clim = (1.0e-25,1.0e-22),
>     cmap = "spectral")
>
> fig.savefig("test_dens.png")
>
> However, even given my current ("limited") matplotlib skills and doing a
> stretch with clim the best I could, this doesn't look right to me -- it
> seems to be square, and missing the parts above and below the galactic
> plane:
> http://i.imgur.com/OGQiHUh.png
>
> Any suggestions?
>
> thanks in advance, and for all your work on yt...
> kathy
>
>
> On Wed, Nov 27, 2013 at 7:06 AM, Matthew Turk <matthewturk at gmail.com> wrote:
>>
>> Hi Kathy,
>>
>> Sorry you're having trouble!
>>
>> On Tue, Nov 26, 2013 at 1:21 PM, Kathy Eastwood <kathy.eastwood at nau.edu>
>> wrote:
>> > Dear (very helpful) yt folk:
>> >
>> > I have been struggling with trying to make a slice plot of some FLASH
>> > data
>> > that is an odd size; the volume is 1 kpc square in x and y, and 40 kpc
>> > tall
>> > in z.  The grid sizes vary widely, as expected. I have two questions:
>> > one, I
>> > would like to understand the odd behavior that I get with regular
>> > SlicePLots, and I would like some help using the FixedResolutionBuffer,
>> > which I *suspect* is the way I want to go, but I have not been able to
>> > make
>> > it work.  I am using the newest version of yt (upgraded this morning!)
>> > on
>> > Mac OS 10.7.5.
>> >
>> > The SlicePlot weirdnesses:
>> > from yt.mods import *
>> > %matplotlib inline
>> > import matplotlib.pyplot as plt
>> > import matplotlib.image as mpimg
>> > import matplotlib.colorbar as cb
>> > import numpy as np
>> > pf = load("Strat_Box_hdf5_plt_cnt_0064")
>> > #First try a 20 kpc tall box
>> > slc = SlicePlot(pf, 'x',
>> > 'Density',center='c',width=((1,"kpc"),(20.0,"kpc")))
>> > slc.annotate_title('This is a Density plot')
>> > slc.save('test_20kpc.png')
>> > slc.show()
>> > #Please see plot at http://i.imgur.com/N65CNfU.png
>>
>> Whoa!  That's pretty squished.
>>
>> >
>> > #Now try a 5 kpc tall plot
>> > slc = SlicePlot(pf, 'x',
>> > 'Density',center='c',width=((1,"kpc"),(5.0,"kpc")))
>> > slc.annotate_title('This is a Density plot')
>> > slc.save('test_5kpc.png')
>> > slc.show()
>> >
>> > #Please see plot at http://i.imgur.com/L1YORNK.png ; note that it seems
>> > to
>> > filling
>> > #a different part of the plotting "window"
>> >
>> > #Now try a 2 kpc tall plot
>> > slc = SlicePlot(pf, 'x',
>> > 'Density',center='c',width=((1,"kpc"),(2.0,"kpc")))
>> > slc.annotate_title('This is a Density plot')
>> > slc.save('test_2kpc.png')
>> > slc.show()
>> >
>> > #Please see plot at http://i.imgur.com/Bq1WaIP.png ; note that it seems
>> > to
>> > filling
>> > #even MORE of the plotting "window", but that the density labels were
>> > cut
>> > off a bit.
>> >
>>
>> Okay, so I *think* I might have an idea what's going on here.  I've
>> replicated the problem here, but I don't have any ideas how to fix it.
>>  It's basically just that (automatically) coming up with the right
>> aspect ratio for the *figure* is tricky when the image is not the
>> right aspect ratio.  I think Devin Silvia, Nathan Goldbaum and Kacper
>> Kowalik have all worked hard on this but not had a lot of success.  It
>> also looks to me like the FRB may have a uniform aspect ratio
>> (800x800) which may be contributing to the problem.  So, on to FRBs
>> ...
>>
>> >
>> > OK, now the part that doesn't work.  After reading, I decided that an
>> > frb
>> > must be
>> > the way to go, so I tried
>> > frb = FixedResolutionBuffer(slc, (0.0, 1.0, 0.0, 1.0), (1024,1024))
>> > plt.imshow(frb['Density'])
>> > plt.savefig('test_figure.png')
>> >
>> > and I get the following error.  Note: I also tried slc.to_frb and that
>> > didn't work either.
>> >
>> >
>> > ---------------------------------------------------------------------------
>> > AttributeError                            Traceback (most recent call
>> > last)
>> > <ipython-input-17-e68719d58ae4> in <module>()
>> > ----> 1 frb = FixedResolutionBuffer(slc, (0.0, 1.0, 0.0, 1.0),
>> > (1024,1024))
>> >       2 plt.imshow(frb['Density'])
>> >       3 plt.savefig('test_figure.png')
>> >       4
>> >       5
>> >
>> > /Users/kde/yt-x86_64/src/yt-hg/yt/visualization/fixed_resolution.pyc in
>> > __init__(self, data_source, bounds, buff_size, antialias, periodic)
>> >      89         self.antialias = antialias
>> >      90         self.data = {}
>> > ---> 91         self.axis = data_source.axis
>> >      92         self.periodic = periodic
>> >      93
>> >
>> > AttributeError: 'SlicePlot' object has no attribute 'axis'
>> >
>>
>> Ah, this one we can fix.  Here what the FRB wants is actually the
>> slice itself, not the slice plot.  There are two ways to do this.  The
>> first is to grab the *existing* slice object:
>>
>> sl = slc.data_source
>>
>> and feed sl into a FixedResolutionBuffer creation.  But I think, since
>> you're going to avoid all of the slice plot machinery altogether, it'd
>> probably make more sense to take control of it with the data object
>> machinery directly.  So you can create a slice, which is a data
>> source, like this:
>>
>> sl = pf.h.slice(2, pf.domain_center[2])
>>
>> What I'm doing here is saying axis 2 (z) and at the z-th coordinate of
>> the domain center.  Now if we query sl, we get all of the data points;
>> this isn't what we want, since they are all different resolutions, so
>> we use the FRB.  sl objects have a handy way of making FRBs:
>>
>> sl.to_frb( ...
>>
>> this takes a width (which can be a tuple), a resolution, and
>> optionally a height.  help(sl.to_frb) will show the arguments and an
>> example.  Now the FRB can be queried like you would a data object, and
>> it gives back (N,N) arrays.  Hope that helps, and let us know!
>>
>> -Matt
>>
>> PS Those are some gorgeous simulation results, by the way.
>>
>> > THanks in advance for any help.
>> > cheers
>> > kathy
>> >
>> >
>> > --
>> > Kathy DeGioia Eastwood, Ph.D.
>> > Professor of Physics and Astronomy
>> > Northern Arizona University
>> > Flagstaff, AZ 86011-6010
>> > Ph: 928-523-7159   FX: 928-523-1371
>> > Kathy.Eastwood at nau.edu
>> > deliveries: 602 S. Humphreys St., Bldg 19 Rm 209
>> >
>> > _______________________________________________
>> > yt-users mailing list
>> > yt-users at lists.spacepope.org
>> > http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>> >
>
>
>
>
> --
> Kathy DeGioia Eastwood, Ph.D.
> Professor of Physics and Astronomy
> Northern Arizona University
> Flagstaff, AZ 86011-6010
> Ph: 928-523-7159   FX: 928-523-1371
> Kathy.Eastwood at nau.edu
> deliveries: 602 S. Humphreys St., Bldg 19 Rm 209



More information about the yt-users mailing list