Inner boundaries in tricontourf

Hey Matplotlib users,

Im trying to use the tricontourf function in matplotlib to reduce the complexity of an unstructured dataset into contours.
The resulting contours are retrieved from the path by the to_polygon() function, but i have some trouble distinguishing inner boundaries on the polygons, while plot.show() clearly doesn't

Using Matplotlib 1.01, and the attached code, I get one level, consisting of 2 polygons, where the first is the outer boundary, and the second should be the inner boundary.
The figure shown by show() correctly displays a square with a inner square cut-out. However i cannot distinguish between inner and outer boundaries in the list of polygons that to_polygon() returns.

Is there a trick how the plot functions distinguish inner boundaries? Calculating for each polygon if it is contained in other polygons will become complicated with a large number of polygons: As far as i can tell this would be checking if the starting point of each polygon is contained in any of the other polygons. Is there a simpler method i missed?

Thanks in advance,
Tijs de Kler

debug.py (617 Bytes)

Matplotlib includes a function to determine if a set of points is within a polygon, called points_inside_poly. For an example see
http://matplotlib.sourceforge.net/faq/howto_faq.html#test-whether-a-point-is-inside-a-polygon

That is about as simple as it gets from a user’s perspective!

Since you ask about tricks in plot functions, no there aren’t any. Rendering functions don’t explicitly determine if a contour polygon is an inner or outer boundary. Usually a sweep algorithm is performed across all points to construct the triangulation of the polygons as it progresses. You could extract the inner/outer-ness of each boundary from such an algorithm but it would be overkill for what you want to do.

Ian Thomas

···

On 30 August 2011 18:23, Tijs de Kler <tijs.dekler@…3754…> wrote:

Im trying to use the tricontourf function in matplotlib to reduce the complexity of an unstructured dataset into contours.

The resulting contours are retrieved from the path by the to_polygon() function, but i have some trouble distinguishing inner boundaries on the polygons, while plot.show() clearly doesn’t

Using Matplotlib 1.01, and the attached code, I get one level, consisting of 2 polygons, where the first is the outer boundary, and the second should be the inner boundary.

The figure shown by show() correctly displays a square with a inner square cut-out. However i cannot distinguish between inner and outer boundaries in the list of polygons that to_polygon() returns.

Is there a trick how the plot functions distinguish inner boundaries? Calculating for each polygon if it is contained in other polygons will become complicated with a large number of polygons: As far as i can tell this would be checking if the starting point of each polygon is contained in any of the other polygons. Is there a simpler method i missed?

I forgot to mention the obvious solution! Outer boundaries are ordered anticlockwise, inner boundaries clockwise. Calculate the area of each boundary assuming it is ordered anticlockwise, and if the area is positive it is an outer boundary, if negative it is an inner boundary. I’ve attached a modified version of your debug.py to show this.

This may be simpler to use than points_inside_poly, but if you have multiple nested boundaries it could get confusing unless you know which boundary encloses which others.

Ian Thomas

debug.py (955 Bytes)