Re: Layout of plot with PyNGL

From: David Brown <dbrown_at_nyahnyahspammersnyahnyah>
Date: Wed, 1 Apr 2009 14:15:42 -0600

Hi Daran,
Yes it sure would be easier if it were possible to use the panelling
code with wmbarbmap, but since it is not, let me try to suggest an
approach that will manually approximate what the panelling and plot-
maximizing code does.

First, it's important to realize that the viewspace for all PyNGL
graphics is a unit square that goes from 0 - 1 along both axes. So I
would suggest first drawing to the X11workstation, which only shows
the unit square, and adjusting your plots until all the graphics are
visible in the X window. Then determine the NDC coordinates of
the min and max X and Y extents of the graphics. In the case of a
group of plots such as the sample you have attached, you might have
values such as:
    left x: 0.3 right x: 0.7 bottom y: 0.05 top y: 0.95

In the X workstation this means a lot of white space on the left and
right and not much on the bottom and top. Now imagine taking this
unit square and adjusting the size and position such that the
graphics fill as much of an 8.5 x 11 sheet of paper as possible. This
implies that the left and right edges of the square will be off the
sheet of paper, while the top and bottom are at the edges of the
printable extent of the paper (this is assumed to be 0.5 inches
inside the paper edges -- a good approximation for typical printers).
This can be achieved by modifying the values of the PDF workstation
resources wkDevice[Upper | Lower][X | Y].

These resources have units of 1/72 of an inch. Since your plot will
have a portrait orientation, the origin of the page and of the PyNGL
viewspace are both in the lower left corner. This makes the
calculation a bit simpler. The default values of these resources are
designed to center the complete unit square on the plot. But in your
case you want to make the Y axis as big as possible without losing
anything along the X axis. Basically you need to compare the aspect
ratio of your plot to the aspect ratio of the drawing surface. This
will determine which axis limits the ultimate size of the plot. Using
the example numbers, the plot has a ratio of (Y/X) 0.9 / 0.4 or 2.25
while the paper ratio (subtracting the margin) is 10 / 7.5 or 1.333.
This make the Y axis the limiting factor, so it should be made as big
as possible.

So you would set wkDeviceLowerY to 36 and wkDeviceUpperY to 756 (792
- 36 ). That means the Y axis extent is 720 or 10 inches. Now since
the PyNGL viewspace is always square and your graphics are centered
along the X axis, you simply need to subtract and add half this
amount from the center of the drawing space X axis:
(8.5 * 72) / 2 = 306 ; 5 * 72 = 360 ; so you would set
wkDeviceLowerX to -54 (306 - 360) and wkDeviceUpperX to 666 (306 + 360).

If you are plotting in landscape mode, the calculations are bit more
complicated because the origin of the PyNGL viewspace is placed such
that the PyNGL viewspace origin is at the upper left of the PDF
coordinate system and the PyNGL X Axis increases in the negative
direction of the PDF Y axis. But the principles are the same.

I hope this is not too confusing an explanation.

On Apr 1, 2009, at 9:01 AM, Daran L. Rife wrote:

> Hello,
> I'm creating a multi-panel plot with PyNGL, and
> having a Dickens of a time getting all the panel
> to fit within the viewport, while simultaneously
> using the maximum amount of real estate on a PDF
> workstation. The end result is heaps of "white
> space" surrounding my panels, and the bottom two
> panels partially lying outside the viewport. I
> have attached the resulting plot.
> For this particular plot, I am unable to use the
> Ngl.panel function, which automatically lays out
> the panels, fitting them within the viewport while
> simultaneously using as much of the real estate
> on the PDF page as possible. The reason I cannot
> use Ngl.panel is that I am using the Ngl.wmbarbmap
> to draw my station data. Ngl.wmbarbmap cannot be
> used in conjunction with Ngl.panel.
> I have done extensive searching of the excellent
> online documentation and user forums, and have
> experimented with various PyNGL resource settings,
> all to no avail.
> I would be grateful if one of the PyNGL gurus could
> help me sort out the proper PyNGL calls needed to
> achieve my desired plot.
> I have placed the script and data on my FTP site:
> The main script is, and is called with the
> following arguments:
>> ./ orig_som.cod
>> stns_for_gmt
> I'm running this from an OS X (Intel) Leopard box, using NumPy
> 1.2.1, and PyNGL version 1.3.0b1, and Python 2.5.0.
> Thanks in advance for your help.
> Daran
> <test.pdf>_______________________________________________
> pyngl-talk mailing list
> List instructions, subscriber options, unsubscribe:

pyngl-talk mailing list
List instructions, subscriber options, unsubscribe:
Received on Wed Apr 01 2009 - 14:15:42 MDT

This archive was generated by hypermail 2.2.0 : Tue Apr 07 2009 - 10:04:30 MDT