# that was not in the input dataset. score = chain.score(*test) print("\nScore: {:.3f}".format(score)) # Create a grid of the vertical velocity and mask it to only show points close to the # actual data. region = vd.get_region(coordinates) grid_full = chain.grid( region=region, spacing=spacing, projection=projection, dims=["latitude", "longitude"], data_names=["velocity"], ) grid = vd.convexhull_mask( (data.longitude, data.latitude), grid=grid_full, projection=projection ) fig, axes = plt.subplots( 1, 2, figsize=(9, 7), subplot_kw=dict(projection=ccrs.Mercator()) ) crs = ccrs.PlateCarree() # Plot the data uncertainties ax = axes[0] ax.set_title("Data uncertainty") # Plot the uncertainties in mm/yr and using a power law for the color scale to highlight # the smaller values pc = ax.scatter( *coordinates, c=data.std_up * 1000, s=20,
# we'll need to use some damping regularization or not use the data locations for the # point forces. Here, we'll apply a bit of damping. spline = vd.Chain([ # Convert the spacing to meters because Spline is a Cartesian gridder ("mean", vd.BlockMean(spacing=spacing * 111e3, uncertainty=True)), ("spline", vd.Spline(damping=1e-10)), ]).fit(proj_coords, data.velocity_up, data.weights) grid = spline.grid( region=region, spacing=spacing, projection=projection, dims=["latitude", "longitude"], data_names=["velocity"], ) # Avoid showing interpolation outside of the convex hull of the data points. grid = vd.convexhull_mask(coordinates, grid=grid, projection=projection) ######################################################################################## # Calculate an unweighted spline as well for comparison. spline_unweighted = vd.Chain([ ("mean", vd.BlockReduce(np.mean, spacing=spacing * 111e3)), ("spline", vd.Spline()), ]).fit(proj_coords, data.velocity_up) grid_unweighted = spline_unweighted.grid( region=region, spacing=spacing, projection=projection, dims=["latitude", "longitude"], data_names=["velocity"], ) grid_unweighted = vd.convexhull_mask(coordinates,
# The Baja California bathymetry dataset has big gaps on land. We want to mask # these gaps on a dummy grid that we'll generate over the region just to show # what that looks like. data = vd.datasets.fetch_baja_bathymetry() region = vd.get_region((data.longitude, data.latitude)) # Generate the coordinates for a regular grid mask spacing = 10 / 60 coordinates = vd.grid_coordinates(region, spacing=spacing) # Generate a mask for points. The mask is True for points that are within the # convex hull. We can provide a projection function to convert the coordinates # before the convex hull is calculated (Mercator in this case). mask = vd.convexhull_mask( data_coordinates=(data.longitude, data.latitude), coordinates=coordinates, projection=pyproj.Proj(proj="merc", lat_ts=data.latitude.mean()), ) print(mask) # Create a dummy grid with ones that we can mask to show the results. Turn # points that are outside of the convex hull into NaNs so they won't show up in # our plot. dummy_data = np.ones_like(coordinates[0]) dummy_data[~mask] = np.nan # Make a plot of the masked data and the data locations. crs = ccrs.PlateCarree() plt.figure(figsize=(7, 6)) ax = plt.axes(projection=ccrs.Mercator()) ax.set_title("Only keep grid points that inside of the convex hull")
print(chain) # Fit on the training data chain.fit(*train) # And score on the testing data. The best possible score is 1, meaning a perfect # prediction of the test data. score = chain.score(*test) print("Cross-validation R^2 score: {:.2f}".format(score)) # Interpolate the wind speed onto a regular geographic grid and mask the data that are # outside of the convex hull of the data points. grid_full = chain.grid(region, spacing=spacing, projection=projection, dims=["latitude", "longitude"]) grid = vd.convexhull_mask(coordinates, grid=grid_full, projection=projection) # Make maps of the original and gridded wind speed plt.figure(figsize=(6, 6)) ax = plt.axes(projection=ccrs.Mercator()) ax.set_title("Uncoupled spline gridding of wind speed") tmp = ax.quiver( grid.longitude.values, grid.latitude.values, grid.east_component.values, grid.north_component.values, width=0.0015, scale=100, color="tab:blue", transform=ccrs.PlateCarree(), label="Interpolated",