Re: Drawing order for polymarkers

From: Mary Haley <haley_at_nyahnyahspammersnyahnyah>
Date: Thu, 17 Sep 2009 09:48:22 -0600 (MDT)

[We have been iterating offline about this quite a bit, and Dave Brown
found a bug in gsn_csm_xxx functions we need to fix with regard to
"tfPolyDrawOrder" not being applied to map objects.]

[Lengthy explanation follows!]

When you run Dave's script, the map outlines are appearing on top of
the polygons, which is actually what should happen, though it may be

Here's an attempt at an explanation:

    - The "mpOutlineDrawOrder" resource defaults to "PostDraw".

    - The "tfPolyDrawOrder" resource also defaults to "PostDraw" (it
      was being set explicitly to this value in Dave's script, which is

    - When two draw order resources have the same value, there's
      still a pecking order that gets applied to what gets drawn first.

      According to the "tfPolyDrawOrder" documentation at:

      any primitives (in this case, the polygons) that are drawn during
      the "PostDraw" phase are drawn before "PostDraw" elements
      belonging to the "transform" object (which is the map in this

      This simply means that the map outlines will be drawn after the

I believe the only way to get the map outlines to be drawn before the
polygons is to set the "mpOutlineDrawOrder" resource to "Draw", so
they are drawn in an earlier phase.

This whole thing brings up the bigger and complicated issue of trying
to control the order that all the elements of a plot get drawn, like
filled map areas, map outlines, primitives, contour lines, contour
labels, etc.

In my opinion, it is easier to control the order which things are
drawn using draw order resources, of which there are 11 (not counting


There's only three phases that these items can be drawn in: "PreDraw",
"Draw", and "PostDraw". As mentioned above, when plot elements are set
to be drawn during the same phase, there's an internal draw order that
applies. If you don't like this ordering, then you may have to change
the draw order resources so the elements are drawn in different

We have it on our list to see if there's a way we can make this
easier. Dave Allured has also suggested a resource setting that allows
you to force primitives to be drawn dead last, like a "PostPostDraw".


On Wed, 16 Sep 2009, Dave Allured wrote:

> Rick and Adam,
> I tested both of your suggestions -- with and without tfPolyDrawList. In
> both cases, all documented settings for tfPolyDrawOrder seem to be ignored.
> Please see two attached test scripts. I am using NCL 5.1.1 on Mac OS 10.5
> PPC.
> I was not specific enough in my original message. I need to control
> polymarker/polygon drawing order with respect to other plot elements in the
> base plot. I would like to use tfPolyDrawOrder, not the other DrawOrder
> resources, because the latter sometimes come with cascading side effects.
> Am I doing something wrong? If not, would it be possible to get
> tfPolyDrawOrder working as documented in conjunction with gsn base plot
> functions? These are the particular base functions that I need currently:
> gsn_csm_contour_map_ce
> gsn_csm_vector_scalar_map_ce
> gsn_csm_contour (as overlay)
> Thanks for your help.
> --Dave
> Rick Brownrigg wrote on Sept 10:
>> Thanks for that pointer, Adam -- I was unaware of these resources.
>> It looks like if finer grain control over which lines/markers/polygons get
>> drawn first/last can be controlled with a related resource:
>> "tfPolyDrawList". The following snippet draws two filled and overlapping
>> boxes over a map of US:
>> boxes = new((/2/), graphic)
>> bRes=True
>> bRes_at_gsFillColor = "green"
>> x = (/-110, -90, -90, -110/)
>> y = (/40, 40, 30, 30/)
>> boxes(1) = gsn_add_polygon(wks, plot, x, y, bRes)
>> bRes_at_gsFillColor = "red"
>> x = (/-100, -80, -80, -100/)
>> y = (/35, 35, 25, 25/)
>> boxes(0) = gsn_add_polygon(wks, plot, x, y, bRes)
>> dummy = new(1,graphic)
>> NhlAddPrimitive(plot, boxes, dummy)
>> In this case, the green box is drawn last. Reordering the assignments in
>> "boxes" causes the red polygon to be drawn last.
>> FWIW...
>> Rick
>> On Sep 10, 2009, at 9:22 AM, Adam Phillips wrote:
>>> Hi Dave,
>>> I just became aware of this resource recently:
>>> res_at_tfPolyDrawOrder = "PreDraw" ; Draw any attached primitives
>>> ;
>>> before rest of plot.
>>> So give tfPolyDrawOrder a shot and let us know if that solves your
>>> problem..
>>> Best regards,
>>> Adam
>>> Dave Allured wrote:
>>>> NCL team,
>>>> I need to control the drawing order of polylines and polymarkers.
>>>> In a typical case, the base plot is made with
>>>> gsn_csm_vector_scalar_map_ce, plus an overlay made with gsn_csm_contour.
>>>> I find a number of DrawOrder resources, but none seem to apply to
>>>> objects made with gsn_add_poly* functions. In general, what is the
>>>> right way to control drawing order for these? I'm using NCL 5.1.1.
>>>> Thanks for your help.
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
Received on Thu Sep 17 2009 - 09:48:22 MDT

This archive was generated by hypermail 2.2.0 : Fri Sep 18 2009 - 15:36:15 MDT