Python Matplotlib 散点图,每个数据点都有不同的文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14432557/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 11:29:15  来源:igfitidea点击:

Matplotlib scatter plot with different text at each data point

pythonmatplotlibtextscatter-plotannotate

提问by Labibah

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 yvs xand annotate with corresponding numbers from n.

我正在尝试制作散点图并使用列表中的不同数字注释数据点。因此,例如,我想绘制yvsx并使用来自n.

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]
ax = fig.add_subplot(111)
ax1.scatter(z, y, fmt='o')

Any ideas?

有任何想法吗?

采纳答案by Rutger Kassies

I'm not aware of any plotting method which takes arrays or lists but you could use annotate()while iterating over the values in n.

我不知道任何采用数组或列表的绘图方法,但您可以annotate()在迭代n.

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()
ax.scatter(z, y)

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

There are a lot of formatting options for annotate(), see the matplotlib website:

有很多格式化选项annotate(),请参阅matplotlib 网站:

enter image description here

在此处输入图片说明

回答by rafaelvalle

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

在早于 matplotlib 2.0 的版本中,ax.scatter不需要绘制没有标记的文本。在 2.0 版中,您需要ax.scatter为文本设置适当的范围和标记。

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 linkyou can find an example in 3d.

在此链接中,您可以找到 3d 示例。

回答by irudyak

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

您也可以使用pyplot.text(请参阅此处)。

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)

enter image description here

在此处输入图片说明

回答by Heather Claxton

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

如果有人试图将上述解决方案应用于 .scatter() 而不是 .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)

但是遇到了“无法解包不可迭代的 PathCollection 对象”的错误,错误特别指向代码行 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.

我没想到 .scatter() 和 .subplot() 之间会有区别,我应该更清楚。

回答by andor kesselman

As a one liner using list comprehension and numpy:

作为使用列表理解和 numpy 的单行:

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

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

setup is ditto to Rutger's answer.

setup 与 Rutger 的回答相同。

回答by palash

Python 3.6+:

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]))

回答by Anwarvic

I would love to add that you can even use arrows /text boxes to annotate the labels. Here is what I mean:

我想补充一点,您甚至可以使用箭头/文本框来注释标签。这就是我的意思:

import random
import matplotlib.pyplot as plt


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()
ax.scatter(z, y)

ax.annotate(n[0], (z[0], y[0]), xytext=(z[0]+0.05, y[0]+0.3), 
    arrowprops=dict(facecolor='red', shrink=0.05))

ax.annotate(n[1], (z[1], y[1]), xytext=(z[1]-0.05, y[1]-0.3), 
    arrowprops = dict(  arrowstyle="->",
                        connectionstyle="angle3,angleA=0,angleB=-90"))

ax.annotate(n[2], (z[2], y[2]), xytext=(z[2]-0.05, y[2]-0.3), 
    arrowprops = dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1))

ax.annotate(n[3], (z[3], y[3]), xytext=(z[3]+0.05, y[3]-0.2), 
    arrowprops = dict(arrowstyle="fancy"))

ax.annotate(n[4], (z[4], y[4]), xytext=(z[4]-0.1, y[4]-0.2),
    bbox=dict(boxstyle="round", alpha=0.1), 
    arrowprops = dict(arrowstyle="simple"))

plt.show()

Which will generate the following graph: enter image description here

这将生成以下图表: 在此处输入图片说明