Source code for vlf4ions.plot_map

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 15 14:48:32 2025

@author: pteysseyre
"""

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.basemap import Basemap
import matplotlib.cm as cm
from operator import attrgetter


[docs] def plot_map(stations_l, thisreceiver, today, path_to_results, Nemax=1e10): """Plots the current state on a geographical map :param stations_l: list of station class instances :param this_receiver: Receiver class instance :param today: Datetime (in UT !) of interest :param path_to_results: path to where the plot will be stored :param Ne_max: Maximum possible electron density to ajust the colorbar (default, 1e11 m^-3). Automatically adjusted if Ne for a function is more than Nemax. """ # Automatically center the map on the receiver/transmitters' paths max_lat = max(stations_l, key=attrgetter("lat")) max_lat = max_lat.lat max_lat = max(max_lat, thisreceiver.lat) + 5 max_lon = max(stations_l, key=attrgetter("lon")) max_lon = max_lon.lon max_lon = max(max_lon, thisreceiver.lon) + 5 min_lat = min(stations_l, key=attrgetter("lat")) min_lat = min_lat.lat min_lat = min(min_lat, thisreceiver.lat) - 5 min_lon = min(stations_l, key=attrgetter("lon")) min_lon = min_lon.lon min_lon = min(min_lon, thisreceiver.lon) - 5 max_Ne = max(stations_l, key=attrgetter("Ne")) max_Ne = max_Ne.Ne if max_Ne > Nemax: Ne_max = max_Ne fig, ax = plt.subplots(1, 1, figsize=(6, 8)) # setup the plot m = Basemap( llcrnrlon=min_lon, llcrnrlat=min_lat, urcrnrlon=max_lon, urcrnrlat=max_lat, projection="merc", ) m.drawmapboundary(fill_color="white", linewidth=0) m.fillcontinents(color="grey", alpha=0.7, lake_color="grey") m.drawcoastlines(linewidth=0.1, color="white") norm = mpl.colors.LogNorm(vmin=1e8, vmax=Nemax) cmap = cm.RdYlGn_r sm = cm.ScalarMappable(norm=norm, cmap=cmap) m.nightshade(today, alpha=0.25) for st in stations_l: color = sm.to_rgba(st.Ne) if st.flag == 0: m.drawgreatcircle( st.lon, st.lat, thisreceiver.lon, thisreceiver.lat, linestyle="-", linewidth=3, color=color, ) if st.name == "GQD": plt.annotate( st.name, xy=m(st.lon + 3, st.lat), xytext=(-40, -4), textcoords="offset points", fontsize=12, ) else: plt.annotate( st.name, xy=m(st.lon + 3, st.lat), xytext=(1, -5), textcoords="offset points", fontsize=12, ) sm = cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) # can be an empty list, only needed for matplotlib < 3.1 # ... cb = fig.colorbar(sm, ax=ax, orientation="horizontal", pad=0.02) cb.set_label("Ne ($m^{-3}$)", rotation=360) plt.title(today.strftime("%d/%m/%y %H:%M:%S")) plt.savefig(path_to_results + "last_map.pdf") plt.close() return