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
parameter.

Thanks for clarifying.

Regards,

Markus