在图上标记python数据点


78

我搜索了年龄(小时数,类似于年龄),以找到一个非常烦人的(看似基本的)问题的答案,并且由于找不到合适的问题,我发布了一个问题并对其进行回答,希望将为别人节省大量我在noobie绘图技能上花费的时间。

如果要使用python matplotlib标记绘图点

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = anyarray
B = anyotherarray

plt.plot(A,B)
for i,j in zip(A,B):
    ax.annotate('%s)' %j, xy=(i,j), xytext=(30,0), textcoords='offset points')
    ax.annotate('(%s,' %i, xy=(i,j))

plt.grid()
plt.show()

我知道xytext =(30,0)与textcoords一起使用,您使用这些30,0值来定位数据标签点,因此它位于0 y轴上,位于30 x轴上位于自己的小区域。

您需要同时绘制i和j的线,否则仅绘制x或y数据标签。

您会得到类似这样的信息(仅注意标签):
我自己的图,标有数据点

它不理想,仍然存在一些重叠-但总比没有好,这就是我所拥有的。


1
为什么不做ax.annotate('(%s, %s)' % (i, j), ...)呢?(或者,如果您使用的是较新样式的字符串格式,'({}, {})'.format(i, j)。)
Joe Kington


pyplot.text似乎是注释的替代方法: pythonmembers.club/2018/05/08/…不知道是否做任何不同
10762409说,恢复莫妮卡

的维护者pythonmembers.club这里。XD就是我的初学者。那篇文章继续变得流行起来,被收录在斯坦福大学的自然语言处理课程中(是该文章的大胆直接链接)
Abdur-Rahmaan Janhangeer

Answers:


93

(x, y)一次打印怎么样。

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

plt.plot(A,B)
for xy in zip(A, B):                                       # <--
    ax.annotate('(%s, %s)' % xy, xy=xy, textcoords='data') # <--

plt.grid()
plt.show()

在此处输入图片说明


4
只是给任何使用此注释的人的注释:textcoords ='offset points'似乎具有可变的效果,具体取决于图表的比例(对我来说,这导致大多数标签显示在图表外)
Eric G

1
是的,您应该改用textcoords ='data'。
navari

@navari,谢谢您的信息。我相应地更新了答案。
falsetru

@EricG-我相信这textcoords='offset points'也需要xytext参数。换句话说,设置xytext=(x points, y points)偏移量即可textcoords='offset points'正常工作。
DaveL17 '16

2
假设您有一百万个3维数据点,则需要选择其中的几个并分别标记它们。你会怎么做?
June Wang

5

我有一个类似的问题,并最终得到了这个:

在此处输入图片说明

对我来说,这样做的好处是数据和注释不会重叠。

from matplotlib import pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

plt.plot(A,B)

# annotations at the side (ordered by B values)
x0,x1=ax.get_xlim()
y0,y1=ax.get_ylim()
for ii, ind in enumerate(np.argsort(B)):
    x = A[ind]
    y = B[ind]
    xPos = x1 + .02 * (x1 - x0)
    yPos = y0 + ii * (y1 - y0)/(len(B) - 1)
    ax.annotate('',#label,
          xy=(x, y), xycoords='data',
          xytext=(xPos, yPos), textcoords='data',
          arrowprops=dict(
                          connectionstyle="arc3,rad=0.",
                          shrinkA=0, shrinkB=10,
                          arrowstyle= '-|>', ls= '-', linewidth=2
                          ),
          va='bottom', ha='left', zorder=19
          )
    ax.text(xPos + .01 * (x1 - x0), yPos,
            '({:.2f}, {:.2f})'.format(x,y),
            transform=ax.transData, va='center')

plt.grid()
plt.show()

使用text参数会.annotate导致不利的文本位置。在图例和数据点之间画线是一团糟,因为图例的位置很难解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.