File size: 2,896 Bytes
da9b185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from turtle import title
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_species_distributions
from sklearn.neighbors import KernelDensity
import gradio as gr

def construct_grids(batch):
    xmin = batch.x_left_lower_corner + batch.grid_size
    xmax = xmin + (batch.Nx * batch.grid_size)
    ymin = batch.y_left_lower_corner + batch.grid_size
    ymax = ymin + (batch.Ny * batch.grid_size)
    xgrid = np.arange(xmin, xmax, batch.grid_size)
    ygrid = np.arange(ymin, ymax, batch.grid_size)
    return (xgrid, ygrid)

def plot_species_distributions(bandwidth):
    data = fetch_species_distributions()
    species_names = ["Bradypus Variegatus", "Microryzomys Minutus"]
    Xtrain = np.vstack([data["train"]["dd lat"], data["train"]["dd long"]]).T
    ytrain = np.array(
        [d.decode("ascii").startswith("micro") for d in data["train"]["species"]],
        dtype="int",
    )
    Xtrain *= np.pi / 180.0

    xgrid, ygrid = construct_grids(data)
    X, Y = np.meshgrid(xgrid[::5], ygrid[::5][::-1])
    land_reference = data.coverages[6][::5, ::5]
    land_mask = (land_reference > -9999).ravel()

    xy = np.vstack([Y.ravel(), X.ravel()]).T
    xy = xy[land_mask]
    xy *= np.pi / 180.0

    fig = plt.figure()
    fig.subplots_adjust(left=0.05, right=0.95, wspace=0.05)

    for i in range(2):
        plt.subplot(1, 2, i + 1)
        print(" - computing KDE in spherical coordinates")
        kde = KernelDensity(
            bandwidth=bandwidth, metric="haversine", kernel="gaussian", algorithm="ball_tree"
        )
        kde.fit(Xtrain[ytrain == i])
        Z = np.full(land_mask.shape[0], -9999, dtype="int")
        Z[land_mask] = np.exp(kde.score_samples(xy))
        Z = Z.reshape(X.shape)
        levels = np.linspace(0, Z.max(), 25)
        plt.contourf(X, Y, Z, levels=levels, cmap=plt.cm.Reds)
        plt.contour(
            X, Y, land_reference, levels=[-9998], colors="k", linestyles="solid"
        )
        plt.xticks([])
        plt.yticks([])
        plt.title(species_names[i])

    return plt

bandwidth_input = gr.inputs.Slider(minimum=0.01, maximum=0.3, default=0.01, step=0.01, label="Bandwidth")
title="Kernel Density Estimate of Species Distributions"
description="This shows an example of a neighbors-based query (in particular a kernel density estimate) on geospatial data, using a Ball Tree built upon the Haversine distance metric – i.e. distances over points in latitude/longitude. The dataset is provided by Phillips et. al. (2006). If available, the example uses basemap to plot the coast lines and national boundaries of South America. See the original scikit-learn example here: https://scikit-learn.org/stable/auto_examples/neighbors/plot_species_kde.html"
iface = gr.Interface(fn=plot_species_distributions, title = title, description=description, inputs=bandwidth_input, outputs="plot")
iface.launch()