Module hytraj.hyplot
Expand source code
import glob
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import xarray as xr
from mpl_toolkits.basemap import Basemap, addcyclic, cm
def mean_trajectory(latitudes, longitudes):
""" Get the centroid of parcels at each timestep. """
x = np.cos(np.radians(latitudes)) * np.cos(np.radians(longitudes))
y = np.cos(np.radians(latitudes)) * np.sin(np.radians(longitudes))
z = np.sin(np.radians(latitudes))
# Get average x, y, z values
mean_x = np.mean(x, axis=1)
mean_y = np.mean(y, axis=1)
mean_z = np.mean(z, axis=1)
# Convert average values to trajectory latitudes and longitudes
mean_longitudes = np.degrees(np.arctan2(mean_y, mean_x))
hypotenuse = np.sqrt(mean_x ** 2 + mean_y ** 2)
mean_latitudes = np.degrees(np.arctan2(mean_z, hypotenuse))
return mean_latitudes, mean_longitudes
class ClusterPlot:
def __init__(
self,
data,
cluster,
proj=Basemap(projection="spstere", lon_0=180, boundinglat=-30),
):
self.lat = data.sel(geo="lat").to_pandas()
self.lon = data.sel(geo="lon").to_pandas()
self.n_traj = len(self.lat.columns)
self.slat = self.lat.iloc[0, 0]
self.slon = self.lon.iloc[0, 0]
self.cluster = cluster
self.nclus = cluster.T.nunique().values[0]
self.m = proj
def get_representative_trajectories(self):
labels = self.cluster.values[0]
columns = self.cluster.columns
kcount = []
clusters = ["CLUS_" + str(i + 1) for i in np.arange(self.nclus)]
self.rep_traj_lat = pd.DataFrame(columns=clusters)
self.rep_traj_lon = pd.DataFrame(columns=clusters)
for num, cluster in enumerate(clusters):
col = columns[labels == num]
kcount.append(len(col))
lats, lons = mean_trajectory(self.lat[col], self.lon[col])
self.rep_traj_lat[cluster], self.rep_traj_lon[cluster] = (lats, lons)
return self.rep_traj_lat, self.rep_traj_lon, kcount
def plot_representative_trajectories(self, ax=None, cmap=plt.cm.jet, lw=3, s=200):
m = self.m
xx, yy = m(self.slon, self.slat)
m.scatter(xx, yy, color="r", s=s)
lat1, lon1, kcount = self.get_representative_trajectories()
colors = [cmap(i) for i in np.linspace(0, 1, self.nclus)]
for count, tr in enumerate(lat1.columns):
lwd = lw*kcount[count]/np.sum(kcount)
xx, yy = m(lon1[tr].values, lat1[tr].values)
m.plot(xx, yy, color=colors[count], lw=lwd)
return ax
Functions
def mean_trajectory(latitudes, longitudes)
-
Get the centroid of parcels at each timestep.
Expand source code
def mean_trajectory(latitudes, longitudes): """ Get the centroid of parcels at each timestep. """ x = np.cos(np.radians(latitudes)) * np.cos(np.radians(longitudes)) y = np.cos(np.radians(latitudes)) * np.sin(np.radians(longitudes)) z = np.sin(np.radians(latitudes)) # Get average x, y, z values mean_x = np.mean(x, axis=1) mean_y = np.mean(y, axis=1) mean_z = np.mean(z, axis=1) # Convert average values to trajectory latitudes and longitudes mean_longitudes = np.degrees(np.arctan2(mean_y, mean_x)) hypotenuse = np.sqrt(mean_x ** 2 + mean_y ** 2) mean_latitudes = np.degrees(np.arctan2(mean_z, hypotenuse)) return mean_latitudes, mean_longitudes
Classes
class ClusterPlot (data, cluster, proj=<mpl_toolkits.basemap.Basemap object>)
-
Expand source code
class ClusterPlot: def __init__( self, data, cluster, proj=Basemap(projection="spstere", lon_0=180, boundinglat=-30), ): self.lat = data.sel(geo="lat").to_pandas() self.lon = data.sel(geo="lon").to_pandas() self.n_traj = len(self.lat.columns) self.slat = self.lat.iloc[0, 0] self.slon = self.lon.iloc[0, 0] self.cluster = cluster self.nclus = cluster.T.nunique().values[0] self.m = proj def get_representative_trajectories(self): labels = self.cluster.values[0] columns = self.cluster.columns kcount = [] clusters = ["CLUS_" + str(i + 1) for i in np.arange(self.nclus)] self.rep_traj_lat = pd.DataFrame(columns=clusters) self.rep_traj_lon = pd.DataFrame(columns=clusters) for num, cluster in enumerate(clusters): col = columns[labels == num] kcount.append(len(col)) lats, lons = mean_trajectory(self.lat[col], self.lon[col]) self.rep_traj_lat[cluster], self.rep_traj_lon[cluster] = (lats, lons) return self.rep_traj_lat, self.rep_traj_lon, kcount def plot_representative_trajectories(self, ax=None, cmap=plt.cm.jet, lw=3, s=200): m = self.m xx, yy = m(self.slon, self.slat) m.scatter(xx, yy, color="r", s=s) lat1, lon1, kcount = self.get_representative_trajectories() colors = [cmap(i) for i in np.linspace(0, 1, self.nclus)] for count, tr in enumerate(lat1.columns): lwd = lw*kcount[count]/np.sum(kcount) xx, yy = m(lon1[tr].values, lat1[tr].values) m.plot(xx, yy, color=colors[count], lw=lwd) return ax
Methods
def get_representative_trajectories(self)
-
Expand source code
def get_representative_trajectories(self): labels = self.cluster.values[0] columns = self.cluster.columns kcount = [] clusters = ["CLUS_" + str(i + 1) for i in np.arange(self.nclus)] self.rep_traj_lat = pd.DataFrame(columns=clusters) self.rep_traj_lon = pd.DataFrame(columns=clusters) for num, cluster in enumerate(clusters): col = columns[labels == num] kcount.append(len(col)) lats, lons = mean_trajectory(self.lat[col], self.lon[col]) self.rep_traj_lat[cluster], self.rep_traj_lon[cluster] = (lats, lons) return self.rep_traj_lat, self.rep_traj_lon, kcount
def plot_representative_trajectories(self, ax=None, cmap=<matplotlib.colors.LinearSegmentedColormap object>, lw=3, s=200)
-
Expand source code
def plot_representative_trajectories(self, ax=None, cmap=plt.cm.jet, lw=3, s=200): m = self.m xx, yy = m(self.slon, self.slat) m.scatter(xx, yy, color="r", s=s) lat1, lon1, kcount = self.get_representative_trajectories() colors = [cmap(i) for i in np.linspace(0, 1, self.nclus)] for count, tr in enumerate(lat1.columns): lwd = lw*kcount[count]/np.sum(kcount) xx, yy = m(lon1[tr].values, lat1[tr].values) m.plot(xx, yy, color=colors[count], lw=lwd) return ax