[yt-users] scripts, the write_out method, plot_options, and 1D profiles, oh my!

Matthew Turk matthewturk at gmail.com
Tue May 12 18:14:05 PDT 2009


Hi David,

Glad to hear that your installation problems have largely been fixed.
Let's see if we can help out a bit with these other concerns!

> 1. How do I write scripts?  Presumably, they're Python scripts with the
> appropriate imports, but what do I import?  When I try, say, 'import
> yt.lagos as lagos' from within a vanilla Python interpreter, I get this
> error from with numpy:
>
>        ...undefined symbol: PyUnicodeUCS2_FromUnicode
>

This usually implies that the python interpreter you are using is not
the one your extensions were compiled with/against -- can you check
that you're running the one the install script installed?

> 2. How do I use the write_out() method to export data?  Specifically, I
> tried the following, which generated an error:
>
>        x = pf.h.ray(0, [0.5, 0.5], "Density")
>        x.write_out("x.dat",fields=["Density"])
>
> Eventually, I'll probably learn how to do everything I need to do from
> within yt, so this is a lower priority for me.

Okay, this one I have to say "mea culpa" on.  The release time between
the yt-1.0 and yt-1.5 has been much longer than anticipated.  The
actual meaning of pf.h.ray changed in that interim -- in yt-1.0, this
was an orthogonal ray.  In yt-1.5 (trunk, which I believe you are
using) it is the *non*-orthogonal ray.  I apologize for the confusion.
 The following commands work for me:

x = pf.h.ortho_ray( ... )
x.write_out( ... )

> 3. The background to question no. 2 is that I'd like to generate, not a
> radial profile, but a 1D profile along one axis through the center of a
> box, and I thought I'd see what my options are using other plotting
> tools.  But maybe EnzoOrthoRay isn't even the best way to go about this.
> What is the best way to make non-radial, 1D profiles along one axis?

Profiles can be taken with respect to any variable -- and the three
spatial variables, x,y,z, are available for profiling.  You can do
something like:

pc = PlotCollection(pf)
pc.add_profile_sphere(1.0, '1', ["x", "Density"])

or any of the other ways that adding profiles work -- just ensure that
the first field (which will be the field by which the data is binned)
is "x" or "y" or "z", and it will discretize and average the second
field into that bin.  This also works for phase space plots, if you
want to find the average Temperature as a function of Density, for
instance.

> 4. I did generate 1D line profiles using PlotCollection.add_ortho_ray
> (though I guess they're not binned), which may be just what I need.  In
> that case (and for other plots), how does one change the look of the
> plot, such as plot ranges, line weights, colors, types, etc.?

Unfortunately, right now, the means of doing this is kind of finicky.
The PlotCollection interface to 1D plots is not meant to be extremely
flexible just yet, but I am working on that front.  What you can do is
instead plot the data by hand.  You can generate a single 1D profile (
the example here is a bit complex -- you can strip it down
substantially -- but it explains it:
http://yt.enzotools.org/doc/cookbook/making_profiles.html or you can
add_profile_sphere as above and access the data attribute of the
returned object) and then plot it yourself with pylab:

import pylab
pylab.semilogy(prof1d["x"], prof1d["Density"], lw=2.5, c='g')
pylab.savefig("hidavid.png")

which would give you a 2.5 pixel wide line in green.  The matplotlib
documentation ( http://matplotlib.sf.net/ ) has lots of information
about how to handle these plots.

I apologize that some of this is a bit trickier than it ought to be --
one of the downsides of generating a programmatic API is that it can
get a bit verbose.  I'll work on the plot modification stuff to see if
I can make that easier.  Additionally, passing arguments to the plot
itself when making profiles should be a high priority for me, so I
will work on that as well.  As it stands, by using the PhasePlot and
then overlaying the line plot on top, you can get a much better
looking plot, with full customization:

http://yt.enzotools.org/wiki/Recipes/OverplottingLines

Let me know if this helped, and how else we can help out!

-Matt



More information about the yt-users mailing list