On Wed, Dec 1, 2010 at 11:58 AM, Justin McCann <[email protected]> wrote:
> Is there a straightforward way to limit the legend only to lines that
> appear within the current display limits? I have a plot that has too
> many separate data series to show on the legend at once, but once I
> zoom in it would be good to re-set the legend to show only the visible
> data points/lines.
>
> I guess the way to do that is:
>
> - catch the DrawEvent
> - call get_xlim() and get_ylim() to get the new bounds
> - figure out which lines are within the bounds and add them to a new
> legend. I could run through each line and compare xlim/ylim with
> line.get_xydata(); is there already a function to do this?
This seems to do the trick, but might be a bit too clever. I'm not
sure if get_children() (or findobjs) is the right call to retrieve all
the plot elements.
def add_legend_viewlim(ax, fontsize='xx-small', **kwargs):
"""Reset the legend in ax to only display lines that are currenlty
visible"""
label_objs = []
label_texts = []
font = matplotlib.font_manager.FontProperties(size=fontsize);
for obj in ax.get_children():
if not hasattr(obj, 'get_xydata'): continue
if ax.viewLim.overlaps(matplotlib.transforms.Bbox(obj.get_xydata())):
label = obj.get_label()
if (label is not None) and (label != ''):
label_objs.append(obj)
label_texts.append(label)
leg = ax.legend(label_objs, label_texts, prop=font, **kwargs)
return leg
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Matplotlib-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users