Подтвердить что ты не робот

Метка точек данных питона на графике

Я искал возраст (часы, подобные возрасту), чтобы найти ответ на действительно раздражающую (казалось бы, основную) проблему, и потому что я не могу найти вопрос, который вполне соответствует ответам. Я отправляю вопрос и отвечаю на него в надеюсь, что он спасет кого-то еще огромное количество времени, которое я только что потратил на свои навыки создания нуоби.

Если вы хотите пометить свои сюжетные точки, используя 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) согласуется с текстовыми кодами, вы используете эти 30,0 значений для размещения метки метки данных, поэтому ее на оси 0 y и 30 на оси x самостоятельно немного площадь.

Вам нужны обе строчки, изображающие я и j, в противном случае вы будете только рисовать метку данных x или y.

Вы получите что-то подобное (обратите внимание только на этикетки):
My own plot with data points labeled

Это не идеальный, есть еще некоторое совпадение, но его лучше, чем ничего, что было у меня.

4b9b3361

Ответ 1

Как насчет печати (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()

enter image description here

Ответ 2

У меня была похожая проблема, и я закончил с этим:

enter image description here

Для меня это имеет то преимущество, что данные и аннотации не перекрываются.

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

Использование текстового аргумента в .annotate к неблагоприятным позициям текста. Рисование линий между легендой и точками данных является беспорядком, так как местоположение легенды трудно определить.