This is a bug. In the current implementation, "annotate" has a
side-effect that modifies the arrowprops dictionary.
As a workaround, you may do,

arrowprops = dict(arrowstyle='-', relpos=(0, 1))
plt.annotate('Good relpos', (3, 3), xytext = (3, 2),
            annotation_clip=False, arrowprops=arrowprops.copy())

Works for me. Thanks a lot!

> plt.annotate('No ha/va', (5, 5), xytext = (5, 4),
> arrowprops=dict(arrowstyle='-'),
>              ha='left', va='top')

ha and va controls the location of the text relative to the xytext,
and I believe it does work as expected. It has nothing to do with the
starting point of the arrow, which should be controlled by the relpos

Thanks for clarifying.