idx_step = len(x) / text_count
for idx_num in range(text_count):
    idx = int(idx_num * idx_step)
text_pos = [x[idx], y[idx]]
xscreen = ax.transData.transform(zip(x[max(0, idx - 1):min(len(x), idx + 2)
    ], y[max(0, idx - 1):min(len(y), idx + 2)]))
a = np.abs(np.gradient(xscreen)[0][0])
rot = np.rad2deg(np.arctan2(*a)) - 90
ax.annotate(text, xy=text_pos, color='r', bbox=dict(ec='1', fc='1', alpha=
    0.9), rotation=rot, ha='center', va='center')
plot_with_text(x, y, 'test')
Plot dashed line interrupted with data (similar to contour plot)