.. _pylab_examples-legend_demo5:

pylab_examples example code: legend_demo5.py
============================================



.. plot:: /home/tcaswell/source/p/matplotlib/doc/mpl_examples/pylab_examples/legend_demo5.py

::

    from __future__ import (absolute_import, division,
                            print_function, unicode_literals)
    import six
    from matplotlib import pyplot as plt
    import numpy as np
    from matplotlib.legend_handler import HandlerLineCollection
    import matplotlib.collections as mcol
    from matplotlib.lines import Line2D
    
    
    class HandlerDashedLines(HandlerLineCollection):
        """
        Custom Handler for LineCollection instances.
        """
        def create_artists(self, legend, orig_handle,
                           xdescent, ydescent, width, height, fontsize, trans):
            # figure out how many lines there are
            numlines = len(orig_handle.get_segments())
            xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
                                                 width, height, fontsize)
            leglines = []
            # divide the vertical space where the lines will go
            # into equal parts based on the number of lines
            ydata = ((height) / (numlines + 1)) * np.ones(xdata.shape, float)
            # for each line, create the line at the proper location
            # and set the dash pattern
            for i in range(numlines):
                legline = Line2D(xdata, ydata * (numlines - i) - ydescent)
                self.update_prop(legline, orig_handle, legend)
                # set color, dash pattern, and linewidth to that
                # of the lines in linecollection
                try:
                    color = orig_handle.get_colors()[i]
                except IndexError:
                    color = orig_handle.get_colors()[0]
                try:
                    dashes = orig_handle.get_dashes()[i]
                except IndexError:
                    dashes = orig_handle.get_dashes()[0]
                try:
                    lw = orig_handle.get_linewidths()[i]
                except IndexError:
                    lw = orig_handle.get_linewidths()[0]
                if dashes[0] is not None:
                    legline.set_dashes(dashes[1])
                legline.set_color(color)
                legline.set_transform(trans)
                legline.set_linewidth(lw)
                leglines.append(legline)
            return leglines
    
    x = np.linspace(0, 5, 100)
    
    plt.figure()
    colors = plt.rcParams['axes.prop_cycle'].by_key()['color'][:5]
    styles = ['solid', 'dashed', 'dashed', 'dashed', 'solid']
    lines = []
    for i, color, style in zip(range(5), colors, styles):
        plt.plot(x, np.sin(x) - .1 * i, c=color, ls=style)
    
    
    # make proxy artists
    # make list of one line -- doesn't matter what the coordinates are
    line = [[(0, 0)]]
    # set up the proxy artist
    lc = mcol.LineCollection(5 * line, linestyles=styles, colors=colors)
    # create the legend
    plt.legend([lc], ['multi-line'], handler_map={type(lc): HandlerDashedLines()},
               handlelength=2.5, handleheight=3)
    
    plt.show()
    

Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)