Matplotlib 从数据框打印时注释数据点

Matplotlib 从数据框打印时注释数据点,matplotlib,pandas,Matplotlib,Pandas,我想在绘图点旁边用数据点的值对数据点进行注释。我发现的例子只处理x和y作为向量。但是,我希望对包含多个列的pandas数据帧执行此操作 ax = plt.figure().add_subplot(1, 1, 1) df.plot(ax = ax) plt.show() 为多列数据框的所有点添加批注的最佳方式是什么?是否要使用其他列之一作为批注文本?这是我最近做的事情 从一些示例数据开始 In [1]: df Out[1]: x y val 0 -1.0

我想在绘图点旁边用数据点的值对数据点进行注释。我发现的例子只处理x和y作为向量。但是,我希望对包含多个列的pandas数据帧执行此操作

ax = plt.figure().add_subplot(1, 1, 1)
df.plot(ax = ax)
plt.show()

为多列数据框的所有点添加批注的最佳方式是什么?

是否要使用其他列之一作为批注文本?这是我最近做的事情

从一些示例数据开始

In [1]: df
Out[1]: 
           x         y val
 0 -1.015235  0.840049   a
 1 -0.427016  0.880745   b
 2  0.744470 -0.401485   c
 3  1.334952 -0.708141   d
 4  0.127634 -1.335107   e
画出要点。在这个例子中,我用y和x作图

ax = df.set_index('x')['y'].plot(style='o')
编写一个循环x、y和点旁边要注释的值的函数

def label_point(x, y, val, ax):
    a = pd.concat({'x': x, 'y': y, 'val': val}, axis=1)
    for i, point in a.iterrows():
        ax.text(point['x'], point['y'], str(point['val']))

label_point(df.x, df.y, df.val, ax)

draw()
以下是一个(非常)稍微圆滑的版本:

其中:

          x         y
a  0.541974  0.042185
b  0.036188  0.775425
c  0.950099  0.888305
d  0.739367  0.638368
e  0.739910  0.596037
f  0.974529  0.111819
g  0.640637  0.161805
h  0.554600  0.172221
i  0.718941  0.192932
j  0.447242  0.172469
然后:

fig, ax = plt.subplots()
df.plot('x', 'y', kind='scatter', ax=ax)

for k, v in df.iterrows():
    ax.annotate(k, v)
最后,如果处于交互模式,则可能需要刷新绘图:

fig.canvas.draw()
产生:

或者,因为它看起来非常丑陋,你可以很容易地美化事物:

from matplotlib import cm
cmap = cm.get_cmap('Spectral')
df.plot('x', 'y', kind='scatter', ax=ax, s=120, linewidth=0, 
        c=range(len(df)), colormap=cmap)

for k, v in df.iterrows():
    ax.annotate(k, v,
                xytext=(10,-5), textcoords='offset points',
                family='sans-serif', fontsize=18, color='darkslategrey')
看起来好多了:

我发现前面的答案非常有用,尤其是它稍微改进了布局

唯一困扰我的是,我不喜欢从数据帧中提取数据,然后在数据帧上循环。似乎是在浪费数据帧

这里有一个替代方案,它避免了使用.apply()进行循环,并包含了外观更好的注释(我认为颜色比例有点过火,无法使颜色栏消失):

ax=df.plot('x','y',kind='scatter',s=50)
def注释_df(行):
ax.注释(row.name、row.values、,
xytext=(10,-5),
textcoords='offset points',
尺寸=18,
颜色(深灰色)
_=df.apply(注释_-df,轴=1)

编辑注释 我最近编辑了我的代码示例。最初它使用的是相同的:

但是,与其他立柱一样,这是不必要的,并使:

行也不必要

另请注意:

  • 如果您试图重现此示例,并且您的绘图与我们的任何绘图都不在同一位置,可能是因为数据帧使用了随机值。如果我们使用一个固定的数据表或一个随机种子,可能就不会那么混乱了
  • 根据点的不同,您可能需要使用
    xytext
    值来获得更好的位置

假设您的
df
有多个列,其中三个是
x
y
lbl
。要使用
lbl
注释您的
(x,y)
散点图,只需:

ax = df.plot(kind='scatter',x='x',y='y')
df[['x','y','lbl']].apply(lambda row: ax.text(*row),axis=1);

美丽的!(正如你所说的第二个情节…@LondonRob,你能告诉我怎样才能每隔N个标记标注一次吗?@st19297创建一个新问题!并包括一个链接到这个答案(见“分享”链接),让人们知道你从哪里开始!这个方法的问题是,如果标签超出绘图区域,标签就会被截断。知道如何解决这个问题吗?对于第一行,当前的pandas将使用df.plot('x','y',kind='scatter'))
fig, ax = plt.subplots()
import matplotlib.pyplot as plt
ax = df.plot(kind='scatter',x='x',y='y')
df[['x','y','lbl']].apply(lambda row: ax.text(*row),axis=1);