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

Python Matplotlib散点图,每个数据点具有不同的文本,python,matplotlib,text,scatter-plot,annotate,Python,Matplotlib,Text,Scatter Plot,Annotate,我试图做一个散点图,并从列表中用不同的数字标注数据点。 例如,我想绘制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') y = [2.56422, 3.77284, 3.52623

我试图做一个散点图,并从列表中用不同的数字标注数据点。 例如,我想绘制
y
vs
x
,并用
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')
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]))

有什么想法吗?

我不知道有哪种绘图方法采用数组或列表,但您可以在迭代
n
中的值时使用
annotate()

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')
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]))
annotate()
有很多格式选项,请参见


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

您可以在3d中找到一个示例。

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


如果有人试图将上述解决方案应用于.scatter()而不是.subplot()

我试着运行以下代码

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

for i, txt in enumerate(n):
    plt.annotate(txt, (z[i], y[i]))
但遇到错误,指出“无法解包不可编辑的PathCollection对象”,错误具体指向代码线fig,ax=plt.scatter(z,y)

我最终用下面的代码解决了这个错误

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

for i, txt in enumerate(n):
    plt.annotate(txt, (z[i], y[i]))
我没想到.scatter()和.subplot()之间会有区别
我早该知道的

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

[ax.为np.数组([n,z,y]).T中的x注释(x[0],(x[1],x[2])

安装程序与Rutger的答案相同。

Python3.6+:

coordinates = [('a',1,2), ('b',3,4), ('c',5,6)]
for x in coordinates: plt.annotate(x[0], (x[1], x[2]))

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

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()
这将生成以下图表:

对于有限的值集,matplotlib可以。但是当您有很多值时,工具提示开始与其他数据点重叠。但由于空间有限,您不能忽略这些值。因此,最好缩小或放大

巧妙地使用

import plotly.express as px
df = px.data.tips()

df = px.data.gapminder().query("year==2007 and continent=='Americas'")


fig = px.scatter(df, x="gdpPercap", y="lifeExp", text="country", log_x=True, size_max=100, color="lifeExp")
fig.update_traces(textposition='top center')
fig.update_layout(title_text='Life Expectency', title_x=0.5)
fig.show()

当您需要在不同的时间(我的意思是,不是在单个for循环中)单独注释时,这可能很有用


其中
x
y
是您的目标坐标,类型为float/int。

在Seaborn
regplot
s上运行良好,没有太多干扰。@Rutger我使用了pandas datframe,不知怎的得到了一个
KeyError
-所以我猜应该是
dict()
对象?有没有其他方法可以使用
枚举
注释
和熊猫数据框来标记数据?@Rachel,您可以对df.iterrows()中的行使用
,然后使用
行['text',行['x-coord']访问值
等。如果您发布一个单独的问题,我会看一看。对于恰好非常接近的点,是否有任何方法可以偏移注释并绘制从数据点指向标签的线,以便很好地分离其他重叠的标签?@aviator,不幸的是,不是内置的。但请参见使用networkx的布局引擎的示例:这太棒了!感谢分享此解决方案。你能分享一下设置图形大小的正确代码吗?像
plt.figure(figsize=(20,10))
这样的实现没有按预期工作,因为调用此代码实际上不会改变图像的大小。期待您的帮助。谢谢图,ax=plt.subplot(figsize=(20,10))您还可以使用mpld3库获得带有悬停工具提示标签的散点图。我在我的一个脚本(这里的第二个块)中使用了完全相同的代码,但是我遇到了一条错误消息:“IndexError:index 1超出了大小为1的轴0的界限”,这是指annotate函数中的“txt”。知道为什么会发生这种情况吗?你在这里用什么进行内联缩放?这不是mpld3,不是吗?嗯,一个这样速度的动画不会增加任何东西,一个精心设计的固定图像就不会那么令人沮丧了。在这一点上,为什么不做
坐标=[('a',(1,2)),('b',(3,4)),('c',(5,6))]
plt.注释(*x)
?而不是列表理解,它会创建一个不需要的值列表,使用类似于
deque(…,maxlen=0)