Plot lines in different colors from color dictionary in Python
Question: I'm trying to plot the path of 15 different storms on a map in 15 different
colors. The color of the path should depend on the name of the storm. For
example if the storm's name is AUDREY, the color of the storm's path should be
red on the map. Could some please help/point me in the right direction?

Here's the part of my code:

    
    
    import numpy as np
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import csv, os, scipy
    import pandas
    from PIL import *
    
    
    data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=1)
    '''print data'''
    fig = plt.figure(figsize=(12,12))
    
    ax = fig.add_axes([0.1,0.1,0.8,0.8])
    
    m = Basemap(llcrnrlon=-100.,llcrnrlat=0.,urcrnrlon=-20.,urcrnrlat=57.,
                projection='lcc',lat_1=20.,lat_2=40.,lon_0=-60.,
                resolution ='l',area_thresh=1000.)
    
    m.bluemarble()
    m.drawcoastlines(linewidth=0.5)
    m.drawcountries(linewidth=0.5)
    m.drawstates(linewidth=0.5)
    
    # Creates parallels and meridians
    m.drawparallels(np.arange(10.,35.,5.),labels=[1,0,0,1])
    m.drawmeridians(np.arange(-120.,-80.,5.),labels=[1,0,0,1])
    m.drawmapboundary(fill_color='aqua')
    color_dict = {'AUDREY': 'red', 'ETHEL': 'white', 'BETSY': 'yellow','CAMILLE': 'blue', 'CARMEN': 'green',
    'BABE': 'purple', 'BOB': '#ff69b4', 'FREDERIC': 'black', 'ELENA': 'cyan', 'JUAN': 'magenta', 'FLORENCE': '#faebd7',
    'ANDREW': '#2e8b57', 'GEORGES': '#eeefff', 'ISIDORE': '#da70d6', 'IVAN': '#ff7f50', 'CINDY': '#cd853f',
    'DENNIS': '#bc8f8f', 'RITA': '#5f9ea0', 'IDA': '#daa520'}
    
    # Opens data file witn numpy
    '''data = np.loadtxt('louisianastormb.csv',dtype=np.str,delimiter=',',skiprows=0)'''
    '''print data'''
    colnames = ['Year','Name','Type','Latitude','Longitude']
    data = pandas.read_csv('louisianastormb.csv', names=colnames)
    names = list(data.Name)
    lat = list(data.Latitude)
    long = list(data.Longitude)
    colorName = list(data.Name)
    #print lat
    #print long
    lat.pop(0)
    long.pop(0)
    latitude= map(float, lat)
    longitude = map(float, long)
    x, y = m(latitude,longitude)
    #Plots points on map
    for colorName in color_dict.keys():
        plt.plot(x,y,'-',label=colorName,color=color_dict[colorName], linewidth=2 )
        lg = plt.legend()
        lg.get_frame().set_facecolor('grey')
    plt.title('20 Hurricanes with Landfall in Louisiana')
    #plt.show()
    plt.savefig('20hurpaths1.jpg', dpi=100)
    

Here's the error message that I keep getting is:

    
    
    Traceback (most recent call last):                                                                                 
        File "/home/mikey1/lstorms.py", line 51, in <module>                                                          
        plt.plot(x,y,'y-',color=colors[names], linewidth=2 )                                                           
       TypeError: unhashable type: 'list'                                                                                 
     >>> 
    


Answer: You're accessing the dictionary entries incorrectly. First off you do this
`names = list(data.Name)`. So names is of type `lists`. Then you call
dictionary like this: `color_dict[names]`. The problem is not setting the
colour but how you try to access the dictionary (`list` is not a valid key).

Change it to something like:

    
    
    for colourName in color_dict.keys():
         plt.plot(x,y,'y-',color=color_dict[colourName], linewidth=2 ) # You need to use different data for the data series here.
    

And it'll work.

Also, your error message reads `plt.plot(x,y,'y-',color=colors[names],
linewidth=2 )` but in your code you've got `color=colors_dict[names]`. Are you
sure you posted the right code?

