Аннотировать диаграмму рассеяния из кадра данных pandas

Я использую pandas и matplotlib для визуализации этого кадра данных

    HDD  EnergyPerSquareMeter   Year
0    3333.6  23.11   1997
1    3349.6  24.30   1998
2    3319.5  24.78   1999
3    3059.1  22.01   2000
4    3287.5  24.17   2001
5    3054.9  20.01   2002
6    3330.0  21.25   2003
7    3307.3  19.22   2004
8    3401.4  18.31   2005
9    3261.6  20.40   2006
10   3212.8  15.34   2008
11   3231.2  15.95   2009
12   3570.1  15.79   2010
13   2995.3  13.88   2011

И я хотел бы построить EnergyPerSquareMeter как диаграмму рассеяния (с осью x = HDD) и аннотировать точки с годом.

Я сделал это:

ax =EnergyvsHDD.plot(x='HDD', y='EnergyPerSquareMeter', marker="o" , linestyle='None', figsize=(12,8))
for i, txt in enumerate(EnergyvsHDD['Year']):
    ax.annotate(txt, (x[i],y[i]), size=10, xytext=(0,0), ha='right', textcoords='offset points')

Результатом является:

enter image description here

Аннотированный текст лет не отображается рядом с точками. Что я делаю не так?

ОБНОВЛЕНО

Используя этот код:

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

А потом:

ax = EnergyvsHDD.set_index('HDD')['EnergyPerSquareMeter'].plot(style='o')
label_point_orig(EnergyvsHDD.HDD, EnergyvsHDD.EnergyPerSquareMeter, EnergyvsHDD.Year, ax)
draw()

Точки не отображаются в нужном месте:

enter image description here

Хотя использование этого кода работает:

plt.scatter(list(EnergyvsHDD.HDD), list(EnergyvsHDD.EnergyPerSquareMeter))
label_point_orig(EnergyvsHDD.HDD, EnergyvsHDD.EnergyPerSquareMeter, EnergyvsHDD.Year, plt)
draw()

enter image description here

Кто-нибудь знает, почему?

Ответ 1

Этот мой ответ дает рабочий пример. Обозначьте точки данных при построении графика из Pandas DataFrame.

который работает на вашем наборе данных

enter image description here

Код, который вы показали, не является самодостаточным. Что такое x и y? Будем надеяться, что они являются рядами, соответствующими правильным столбцам вашего DataFrame. Я думаю, что они не то, что вы думаете. Было бы безопаснее напрямую использовать столбцы из вашего EnergyvsHDD DataFrame. (См. Мой связанный ответ.)