Quantcast

Problem with PatchCollection and FancyArrowPatch?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Problem with PatchCollection and FancyArrowPatch?

Skipper Seabold
Hi,

Trying to figure out why these two do not create the same plot. Bug or user error?

import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch
from matplotlib.collections import PatchCollection

def correct_patch(pos):
    fig, ax = plt.subplots()
    for src, dst in pos:
        arrow = FancyArrowPatch(posA=src, posB=dst,
                                color='k', arrowstyle='-|>',
                                mutation_scale=30, connectionstyle="arc3")
        ax.add_patch(arrow)
    return fig

def patch_collection_problem(pos):
    fig, ax = plt.subplots()
    pos = [[(.5, .5), (.25, .25)], 
           [(.1, .5), (.2, .75)]]
    arrows = []
    for src, dst in pos:
        arrows.append(FancyArrowPatch(posA=src, posB=dst,
                                color='k', arrowstyle='-|>',
                                mutation_scale=30, connectionstyle="arc3"))
    collection = PatchCollection(arrows, match_original=True)
    
    ax.add_collection(collection, autolim=False)
    return fig

pos = [[(.5, .5), (.25, .25)], 
          [(.1, .5), (.2, .75)]]

correct_patch(pos)
patch_collection_problem(pos)

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Problem with PatchCollection and FancyArrowPatch?

Jae-Joon Lee
FancyArrowPatch behaves quite differently from normal patches.
Most importantly, the path must be reevaluated during the drawing time, so a normal PatchCollection, which evaluate the paths during the instance creation, won't work. i.e., you need a new Collection class.

Below is a very incomplete implementation of FancyArrowPatchCollection, just for a demonstration purpose. And I recommend you to open a wishlist ticket at the issue tracker (https://github.com/matplotlib/matplotlib/issues).

Regards,

-JJ


class FancyArrowPatchCollection(PatchCollection):
    def set_paths(self, patches):
        self._patches = patches

    def get_paths(self):
        paths = []
        for p in self._patches:
            p.set_transform(self.get_transform())
            _path, fillable = p.get_path_in_displaycoord()
            paths.extend(_path)
        return paths

    def _prepare_points(self):
        import matplotlib.transforms as mtransforms
        transform, transOffset, offsets, paths = PatchCollection._prepare_points(self)
        return mtransforms.IdentityTransform(), transOffset, offsets, paths




On Thu, Jan 31, 2013 at 6:33 AM, Skipper Seabold <[hidden email]> wrote:
Hi,

Trying to figure out why these two do not create the same plot. Bug or user error?

import matplotlib.pyplot as plt
from matplotlib.patches import FancyArrowPatch
from matplotlib.collections import PatchCollection

def correct_patch(pos):
    fig, ax = plt.subplots()
    for src, dst in pos:
        arrow = FancyArrowPatch(posA=src, posB=dst,
                                color='k', arrowstyle='-|>',
                                mutation_scale=30, connectionstyle="arc3")
        ax.add_patch(arrow)
    return fig

def patch_collection_problem(pos):
    fig, ax = plt.subplots()
    pos = [[(.5, .5), (.25, .25)], 
           [(.1, .5), (.2, .75)]]
    arrows = []
    for src, dst in pos:
        arrows.append(FancyArrowPatch(posA=src, posB=dst,
                                color='k', arrowstyle='-|>',
                                mutation_scale=30, connectionstyle="arc3"))
    collection = PatchCollection(arrows, match_original=True)
    
    ax.add_collection(collection, autolim=False)
    return fig

pos = [[(.5, .5), (.25, .25)], 
          [(.1, .5), (.2, .75)]]

correct_patch(pos)
patch_collection_problem(pos)

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users



------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Loading...