
yt's "arbitrary_grid" feature might also be useful here.
http://yt-project.org/docs/dev/analyzing/objects.html?highlight=arbitrary_gr...
I concur, though if the size of the grid or number of particles is large (as in the simulation I've been working with) this can result in memory issues.
I'm hesitating to push us further into the weeds here when you've given a very thoughtful and helpful reply to Junhwan, but arbitrary_grid can be flat along one dimension (i.e., NxMx1) and was designed for this use case.
Oh, this is intriguing - I stumbled across this when I came up with my original (hacktacular) solution, but in my reading of the documentation (and, admittedly, a cursory skim of the source code) suggested that if I wanted to, say, project the density of *all* of the particles in a simulation onto a grid of [NxMx1] that it would not work - I'd only get particles that happened to intersect the one-cell-thick volume of that grid, which would give me a slice but not a projection. Did I misread that? If so, it is a much more elegant solution than mine. :-) --Brian