我正在尝试制作散点图,并从列表中标注不同数字的数据点。 举个例子,我想画出y和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')

什么好主意吗?


当前回答

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

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

其中x和y是你的目标坐标类型是float/int。

其他回答

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

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
import pandas as pd

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

我不知道任何绘图方法,它接受数组或列表,但你可以使用注释(),而迭代在n的值。

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)

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

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

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

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

其中x和y是你的目标坐标类型是float/int。

在matplotlib 2.0之前的版本中,ax。在没有标记的情况下,对文本进行分散绘制是不必要的。在2.0版本中,您将需要ax。为文本设置适当的范围和标记。

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

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

在这个链接中,你可以找到一个3d的例子。