title: matplotlib how to plot multiple lines with defined colours?
body: <p>I get an error when I plot with colours, and works fine without it. My line colours need to be restricted to 2 defined values.</p>
  
  <p><strong>This works</strong> in Jupyter Notebook</p>
  
  <pre><code>import random
  xStart = random.sample(range(1, 10), 6)
  xStart.sort()
  xEnd = [x + random.randint(1, 6) for x in xStart]
  yval = list(range(1, 7))
  colours = ['r']*6
  colours[1] = 'b'
  print(xStart)
  print(xEnd)
  print(yval)
  print(colours)
  f, ax1 = plt.subplots(figsize=(6,4))
  ax1.plot([xStart,xEnd], [yval,yval], '-', linewidth=1) #, color=colours)
  plt.show()
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/LLA21.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/LLA21.png" alt="Multiple line segments"></a></p>
  
  <p><strong>This does not work</strong>.
  If I uncomment the color argument, the code throws an (elaborate) error. While I can draw each line segment in a loop and colour each red or blue, I assume it will be slower than the below code. In this toy example I have 6 lines, but in reality I have 12,000 lines and it takes a few minutes, drawing one line at a time in a loop.</p>
  
  <p>I think the error is related to the size of my colour argument; it is likely expecting 1 (at a time internally) whereas I am providing a list of 6.</p>
  
  <pre><code>import random
  xStart = random.sample(range(1, 10), 6)
  xStart.sort()
  xEnd = [x + random.randint(1, 6) for x in xStart]
  yval = list(range(1, 7))
  colours = ['r']*6
  colours[1] = 'b'
  print(xStart)
  print(xEnd)
  print(yval)
  print(colours)
  f, ax1 = plt.subplots(figsize=(6,4))
  ax1.plot([xStart,xEnd], [yval,yval], '-', linewidth=1, color=colours)  #--&gt; Only change from above code
  plt.show()
  </code></pre>
  
  <blockquote>
    <p>TypeError                                 Traceback (most recent call
    last) C:\Anaconda3\lib\site-packages\matplotlib\colors.py in
    to_rgba(c, alpha)
        131     try:
    --> 132         rgba = _colors_full_map.cache[c, alpha]
        133     except (KeyError, TypeError):  # Not in cache, or unhashable.</p>
    
    <p><strong>TypeError: unhashable type: 'list'</strong></p>
    
    <p>During handling of the above exception, another exception occurred:</p>
    
    <p>ValueError                                Traceback (most recent call
    last) C:\Anaconda3\lib\site-packages\IPython\core\formatters.py in
    <strong>call</strong>(self, obj)
        339                 pass
        340             else:
    --> 341                 return printer(obj)
        342             # Finally look for special method names
        343             method = get_real_method(obj, self.print_method)</p>
    
    <p>C:\Anaconda3\lib\site-packages\IPython\core\pylabtools.py in
    (fig)
        236 
        237     if 'png' in formats:
    --> 238         png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
        239     if 'retina' in formats or 'png2x' in formats:
        240         png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))</p>
    
    <p>C:\Anaconda3\lib\site-packages\IPython\core\pylabtools.py in
    print_figure(fig, fmt, bbox_inches, **kwargs)
        120 
        121     bytes_io = BytesIO()
    --> 122     fig.canvas.print_figure(bytes_io, **kw)
        123     data = bytes_io.getvalue()
        124     if fmt == 'svg':</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\backend_bases.py in
    print_figure(self, filename, dpi, facecolor, edgecolor, orientation,
    format, **kwargs)    2214                     orientation=orientation,
    2215                     dryrun=True,
    -> 2216                     **kwargs)    2217                 renderer = self.figure._cachedRenderer    2218                 bbox_inches = self.figure.get_tightbbox(renderer)</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py in
    print_png(self, filename_or_obj, *args, **kwargs)
        505 
        506     def print_png(self, filename_or_obj, *args, **kwargs):
    --> 507         FigureCanvasAgg.draw(self)
        508         renderer = self.get_renderer()
        509         original_dpi = renderer.dpi</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py in
    draw(self)
        428             # if toolbar:
        429             #     toolbar.set_cursor(cursors.WAIT)
    --> 430             self.figure.draw(self.renderer)
        431         finally:
        432             # if toolbar:</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\artist.py in
    draw_wrapper(artist, renderer, *args, **kwargs)
         53                 renderer.start_filter()
         54 
    ---> 55             return draw(artist, renderer, *args, **kwargs)
         56         finally:
         57             if artist.get_agg_filter() is not None:</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\figure.py in draw(self,
    renderer)    1297     1298<br>
    mimage._draw_list_compositing_images(
    -> 1299                 renderer, self, artists, self.suppressComposite)    1300     1301<br>
    renderer.close_group('figure')</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\image.py in
    _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
        136     if not_composite or not has_images:
        137         for a in artists:
    --> 138             a.draw(renderer)
        139     else:
        140         # Composite any adjacent images together</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\artist.py in
    draw_wrapper(artist, renderer, *args, **kwargs)
         53                 renderer.start_filter()
         54 
    ---> 55             return draw(artist, renderer, *args, **kwargs)
         56         finally:
         57             if artist.get_agg_filter() is not None:</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\axes_base.py in draw(self,
    renderer, inframe)    2435             renderer.stop_rasterizing()<br>
    2436 
    -> 2437         mimage._draw_list_compositing_images(renderer, self, artists)    2438     2439         renderer.close_group('axes')</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\image.py in
    _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
        136     if not_composite or not has_images:
        137         for a in artists:
    --> 138             a.draw(renderer)
        139     else:
        140         # Composite any adjacent images together</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\artist.py in
    draw_wrapper(artist, renderer, *args, **kwargs)
         53                 renderer.start_filter()
         54 
    ---> 55             return draw(artist, renderer, *args, **kwargs)
         56         finally:
         57             if artist.get_agg_filter() is not None:</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\lines.py in draw(self,
    renderer)
        765                 self._set_gc_clip(gc)
        766 
    --> 767                 ln_color_rgba = self._get_rgba_ln_color()
        768                 gc.set_foreground(ln_color_rgba, isRGBA=True)
        769                 gc.set_alpha(ln_color_rgba[3])</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\lines.py in
    _get_rgba_ln_color(self, alt)    1267     1268     def _get_rgba_ln_color(self, alt=False):
    -> 1269         return mcolors.to_rgba(self._color, self._alpha)    1270     1271     # some aliases....</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\colors.py in to_rgba(c,
    alpha)
        132         rgba = _colors_full_map.cache[c, alpha]
        133     except (KeyError, TypeError):  # Not in cache, or unhashable.
    --> 134         rgba = _to_rgba_no_colorcycle(c, alpha)
        135         try:
        136             _colors_full_map.cache[c, alpha] = rgba</p>
    
    <p>C:\Anaconda3\lib\site-packages\matplotlib\colors.py in
    _to_rgba_no_colorcycle(c, alpha)
        183         # float)<code>and</code>np.array(...).astype(float)` all convert "0.5" to 0.5.
        184         # Test dimensionality to reject single floats.
    --> 185         raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
        186     # Return a tuple to prevent the cached value from being modified.
        187     c = tuple(c.astype(float))</p>
    
    <p><strong>ValueError: Invalid RGBA argument: ['r', 'b', 'r', 'r', 'r', 'r']</strong></p>
  </blockquote>