Add a list of labels in Pythons matplotlib
Question: I have a 3 dimensional plot in matplotlib, the input data consists of 3 lists
of x,y,z coordinates and a list of labels that indicates which class each
coordinate set belongs too. From the labels I create a colour list that then
assigns a colour to each of coordinates.:

    
    
    x_cords = projected_train[:,0]
    y_cords = projected_train[:,1]
    z_cords = projected_train[:,2]
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    colors = ['#008080',...,'#000000']
    plotlabels = ['Acer campestre L',...,'Viburnum tinus']
    
    #Creating colorlist from labels indexes
    colors = np.asarray(colors)
    colorslist = colors[labels]
    
    ax.scatter(x_cords, y_cords, z_cords, color=colorslist)
    
    plt.show()
    

![plot](http://i.imgur.com/jGpH8WB.png)

the labels list is created in the same fashion as the colour list:

    
    
    labels = np.asarray(labels)
    plotlabelslist = plotlabels[labels]
    

But when I add the labels to the plot:

    
    
    ax.scatter(x_cords, y_cords, z_cords, color=colorslist, label=plotlabelslist)
    
    plt.legend(loc='upper left')
    

I get the following result:

![plot2](http://imgur.com/FewZVon.png)

I have tried other ways of adding the labels but without any luck, are there
any ways of adding a list of labels just as the colours are added, or do I
have to plot every class one by one and add the labels, like in the answer
from: [How to get different colored lines for different plots in a single
figure?](http://stackoverflow.com/questions/4805048/how-to-get-different-
colored-lines-for-different-plots-in-a-single-figure)

any help or nudge in the right direction would be much appreciated!


Answer: Would this work for you? [![enter image description
here](http://i.stack.imgur.com/PqxQL.png)](http://i.stack.imgur.com/PqxQL.png)

    
    
    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    
    x_cords = [1,2,4,2,5,3,2,5,3,4,6,2,3,4,5,3,4,2,4,5]
    y_cords = [6,5,3,4,5,6,3,5,4,6,3,4,5,6,3,4,5,6,3,4]
    z_cords = [3,1,3,4,2,4,5,6,3,4,5,6,2,4,5,7,3,4,5,6]
    classlbl= [0,2,0,1,2,0,2,0,1,2,0,1,0,2,0,2,0,1,0,2]
    
    colors  = ['r','g','b']
    Labels  = ['RED','GREEN','BLUE']
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    #plotlabels = ['Acer campestre L',...,'Viburnum tinus']
    
    #Creating colorlist from labels indexes
    colors = np.asarray(colors)
    colorslist = colors[classlbl]
    Labels = np.asarray(Labels)
    labellist = Labels[classlbl]
    
    # Plot point by point
    for x,y,z,c,l in zip(x_cords, y_cords, z_cords,colorslist,labellist):
        ax.scatter(x, y, z, color=c,label=l)
    
    # Get the labels and handles
    handles, labels = ax.get_legend_handles_labels()
    
    # Filter the labels and handles to remove duplicates
    newLeg=dict()
    for h,l in zip(handles,labels):
        if l not in newLeg.keys():
            newLeg[l]=h
    
    # Create new handles and labels
    handles=[]
    labels=[]
    for l in newLeg.keys():
        handles.append(newLeg[l])
        labels.append(l)
    
    # Create new Legend
    ax.legend(handles, labels)    
    
    plt.show()
    

