Issues Removing Paths from a filled polygon

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Issues Removing Paths from a filled polygon

matplotlib - users mailing list

This is an example that I reviewed in my effort to draw a polygon with certain zones masked, or clipped.

I have tried to find a way to Mask polygonal areas before filling/drawing, but so far I have not found what I really need.

I need to be able to fill plot areas without touching certain polygonal areas that may be totally or partially where the polygon will be filled.

I cannot fill with white the polygonal areas after rendering because I would be deleting information (e.g. colors and zorder) in those areas.

Can I copy the information in those polygonal areas, and then copy them back after filling/drawing what I needed ?

 

Here are the bugs issues that I found:

This example was found at: http://matplotlib.1069221.n5.nabble.com/removing-paths-inside-polygon-td40632.html

 

While doing this, I stumbled on a bug and a couple of issues:

  1. When .set_clip_path() is used, the "Zoom to rectangle" and "Pan" functions can move draw the plots outside the subplot.

See the attached 3 snapshots.

  1. “Pick events” are generated even for the "clipped" areas of the star.  It would be nice if this was not so.

 

import matplotlib.pyplot as plt

import matplotlib.path as mpath

import matplotlib.collections as mcol

import numpy as np

import copy

 

pick = 0

def on_pick(event):

    global pick

    # however pick events are NOT generated while the Zoom or Translate options are on !

    # https://matplotlib.org/3.1.1/gallery/event_handling/pick_event_demo2.html

 

    pick += 1

    #print("on_pick ",pick,": ", str(event.artist), " event=", str(event))

    print("on_pick ",pick,":  zorder:", event.artist.get_zorder())

 

exterior = mpath.Path.unit_rectangle()

exterior = mpath.Path(copy.deepcopy(exterior.vertices),

                      copy.deepcopy(exterior.codes[:]))

exterior.vertices *= 4

exterior.vertices -= 2

 

#interior = mpath.Path.unit_circle()

interior = mpath.Path.unit_rectangle()

interior = mpath.Path(copy.deepcopy(interior.vertices),

                      copy.deepcopy(interior.codes[:]))

interior.vertices = interior.vertices[::-1] # reverse the list

 

vertices = np.concatenate([exterior.vertices, interior.vertices])

codes = np.concatenate([exterior.codes, interior.codes])

 

interior = mpath.Path.unit_rectangle()

interior = mpath.Path(copy.deepcopy(interior.vertices),

                      copy.deepcopy(interior.codes[:]))

interior.vertices = interior.vertices[::-1]

interior.vertices -= 0.6

vertices = np.concatenate([vertices, interior.vertices])

codes = np.concatenate([codes, interior.codes])

 

clip_path = mpath.Path(vertices, codes)

star = mpath.Path.unit_regular_star(6)

star = mpath.Path(copy.deepcopy(star.vertices),

                  copy.deepcopy(star.codes[:]))

star.vertices *= 3.5

 

figu, ax = plt.subplots(figsize=(6,6), dpi=100)

cbid = figu.canvas.mpl_connect("pick_event", on_pick)

 

ax = plt.subplot(221)

col = mcol.PathCollection([clip_path], facecolor='green')

ax.add_collection(col)

ax.set_title('Clip path')

ax.autoscale()

 

ax = plt.subplot(222)

col = mcol.PathCollection([star], facecolor='red')

ax.add_collection(col)

ax.set_title('Target polygon')

ax.autoscale()

 

# BUG: "zoom to rectangle" on this subplot shows part of the star outside this subplot ?

# BUG: "Pan" on the clipped star can be translated to anywhere over the other subplots ?

# "Zoom to rect" and "Pan" work as expected on the two top subplots.

# This is an issue associated with set_clip_path(), when the line below is commented, Zoom / Pan behave as expected.

# NOTE: pick events are generated even for the "clipped" areas of the star ! It would be nice if this was not so.

ax = plt.subplot(2,2,4)

col = mcol.PathCollection([star])

col.set_clip_path(clip_path, ax.transData)

col.set(zorder=9, facecolor="blue", picker=True)

ax.add_collection(col)

ax.set_title('Target polygon clipped by clip_path')

ax.autoscale()

 

plt.tight_layout()

plt.show()

 


Schlumberger-Private


_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users