The adjust_text function is compatible with cartopy projection axes. Ensure you pass the specific ax object to the function.
import cartopy.crs as ccrs
fig = plt.figure(figsize=[10, 8])
ax = plt.subplot(1, 1, 1, projection=ccrs.NorthPolarStereo())
# ... setup map and scatter ...
texts = [ax.text(lon, lat, 'Label', transform=ccrs.PlateCarree()) for lon, lat in zip(lons, lats)]
adjust_text(texts, arrowprops=dict(arrowstyle='->', color='blue'), ax=ax)
import cartopy.crs as ccrs
fig = plt.figure(figsize=[10, 8])
ax = plt.subplot(1, 1, 1, projection=ccrs.NorthPolarStereo())
ax.coastlines(resolution='50m')
ax.set_extent([-180,180,53,90],crs=ccrs.PlateCarree())
np.random.seed(0)
loclon = np.random.randint(-180, 180, 25)
loclat = np.random.randint(53, 90, 25)
ax.scatter(loclon, loclat, transform=ccrs.PlateCarree())
texts = [ax.text(loclon[i], loclat[i], 'Location%s' %i, ha='center', color='r',
va='center', transform=ccrs.PlateCarree()) for i in range(len(loclon))]
adjust_text(texts, arrowprops=dict(arrowstyle='->', color='blue'), ax=ax);