matplotlib - control capstyle of line collection/large number of lines
Question: Similarly to a [previous
question](http://stackoverflow.com/questions/11312579/networkx-draw-networkx-
edges-capstyle) of mine, I'd like to control the capstyle of lines being drawn
using matplotlib. However, I have an extremely large number of lines, and
drawing with anything other than a line collection takes way too long. Are
there any workarounds to control the capstyle of lines in a line collection in
a generic way (or alternatively, super fast ways of drawing a large number of
`Line2D` lines). For instance, I've tried using the matplotlib rc settings
via:

    
    
    import matplotlib as mpl
    mpl.rcParams['lines.solid_capstyle'] = 'round'
    mpl.rcParams['lines.solid_joinstyle'] = 'round'
    

But this doesn't appear to have any affect. From the docstring for
`collections.py`:

> The classes are not meant to be as flexible as their single element
> counterparts (e.g. you may not be able to select all line styles) but they
> are meant to be fast for common use cases (e.g. a large set of solid line
> segemnts)

Which explains _why_ I can't seem to control various parameters, but I still
want to do it! I've had a look at the code for the AGG backend
(`_backend_agg.cpp`: not that I really understand it), and it appears that
line_cap and line_join are controlled by `gc.cap` and `gc.join`, where gc
comes from the `GCAgg` class. Does anyone know how one can control this from
Python? Am I asking the right question here? Perhaps that are easier ways to
control these parameters?

Any help is greatly appreciated... I'm desperate to get this working, so even
crazy hacks are welcome!

Thanks,

Carson


Answer: I was struggling with the same issue. I ended up plotting a scatter plot on
top of my line collection. It's not perfect, but it may work for your
application. There's a few subtleties - below is a working example.

    
    
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import LineCollection
    
    x = np.random.random(10)
    y = np.random.random(10)
    z = np.arange(0,10)
    
    points = np.array([x, y]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    linewidth = 10
    cmap = plt.get_cmap('jet')
    norm = plt.Normalize(np.min(z), np.max(z))
    color = cmap(norm(z))
    
    lc = LineCollection(segments, linewidths=linewidth, cmap=cmap, norm=norm)
    lc.set_array(z)
    lc.set_zorder(z.tolist())
    ax.add_collection(lc)
    
    ax.scatter(x,y,color=color,s=linewidth**2,edgecolor='none', zorder=(z+2).tolist())
    

