Matplotlib scatter plot with different text at each data point

后端 未结 9 2086
挽巷
挽巷 2020-11-22 12:50

I am trying to make a scatter plot and annotate data points with different numbers from a list. So, for example, I want to plot y vs x and annotate

相关标签:
9条回答
  • 2020-11-22 13:16

    As a one liner using list comprehension and numpy:

    [ax.annotate(x[0], (x[1], x[2])) for x in np.array([n,z,y]).T]

    setup is ditto to Rutger's answer.

    0 讨论(0)
  • 2020-11-22 13:18

    You may also use pyplot.text (see here).

    def plot_embeddings(M_reduced, word2Ind, words):
        """ 
            Plot in a scatterplot the embeddings of the words specified in the list "words".
            Include a label next to each point.
        """
        for word in words:
            x, y = M_reduced[word2Ind[word]]
            plt.scatter(x, y, marker='x', color='red')
            plt.text(x+.03, y+.03, word, fontsize=9)
        plt.show()
    
    M_reduced_plot_test = np.array([[1, 1], [-1, -1], [1, -1], [-1, 1], [0, 0]])
    word2Ind_plot_test = {'test1': 0, 'test2': 1, 'test3': 2, 'test4': 3, 'test5': 4}
    words = ['test1', 'test2', 'test3', 'test4', 'test5']
    plot_embeddings(M_reduced_plot_test, word2Ind_plot_test, words)
    

    0 讨论(0)
  • 2020-11-22 13:18

    This might be useful when you need individually annotate in different time (I mean, not in a single for loop)

    ax = plt.gca()
    ax.annotate('your_lable', (x,y)) 
    

    where x and y are the your target coordinate and type is float/int.

    0 讨论(0)
  • 2020-11-22 13:20

    In version's earlier than matplotlib 2.0, ax.scatter is not necessary to plot text without markers. In version 2.0 you'll need ax.scatter to set the proper range and markers for text.

    y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
    z = [0.15, 0.3, 0.45, 0.6, 0.75]
    n = [58, 651, 393, 203, 123]
    
    fig, ax = plt.subplots()
    
    for i, txt in enumerate(n):
        ax.annotate(txt, (z[i], y[i]))
    

    And in this link you can find an example in 3d.

    0 讨论(0)
  • 2020-11-22 13:25

    In case anyone is trying to apply the above solutions to a .scatter() instead of a .subplot(),

    I tried running the following code

    y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
    z = [0.15, 0.3, 0.45, 0.6, 0.75]
    n = [58, 651, 393, 203, 123]
    
    fig, ax = plt.scatter(z, y)
    
    for i, txt in enumerate(n):
        ax.annotate(txt, (z[i], y[i]))
    

    But ran into errors stating "cannot unpack non-iterable PathCollection object", with the error specifically pointing at codeline fig, ax = plt.scatter(z, y)

    I eventually solved the error using the following code

    plt.scatter(z, y)
    
    for i, txt in enumerate(n):
        plt.annotate(txt, (z[i], y[i]))
    

    I didn't expect there to be a difference between .scatter() and .subplot() I should have known better.

    0 讨论(0)
  • 2020-11-22 13:30

    Python 3.6+:

    coordinates = [('a',1,2), ('b',3,4), ('c',5,6)]
    for x in coordinates: plt.annotate(x[0], (x[1], x[2]))
    
    0 讨论(0)
提交回复
热议问题