Source code for lidarwind.visualization

import os

import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from .filters import Filtering


[docs] class PlotSettings: def __init__(self, mpl, style="dark_background"): self.mpl = mpl self.style = style
[docs] def update_settings(self): font_size = 16 self.mpl.style.use(self.style) self.mpl.rcParams["figure.figsize"] = [6, 6] self.mpl.rcParams["figure.dpi"] = 80 self.mpl.rcParams["savefig.dpi"] = 100 self.mpl.rcParams["font.size"] = font_size self.mpl.rcParams["legend.fontsize"] = font_size self.mpl.rcParams["figure.titlesize"] = font_size self.mpl.rcParams["ytick.labelsize"] = font_size self.mpl.rcParams["xtick.labelsize"] = font_size self.mpl.rcParams["axes.titlesize"] = font_size self.mpl.rcParams["axes.labelsize"] = font_size self.mpl.rcParams["legend.fancybox"] = True self.mpl.rcParams["legend.framealpha"] = 0.7 self.mpl.rcParams["legend.facecolor"] = "silver" self.mpl.rcParams["legend.frameon"] = True self.mpl.rcParams["lines.linewidth"] = 5 return self
[docs] def plot_setup(plot): plt.setp(plot.axes.xaxis.get_majorticklabels(), rotation=0) locator = mdates.AutoDateLocator() formatter = mdates.ConciseDateFormatter(locator) plot.axes.xaxis.set_major_formatter(formatter) plt.grid(b=True) return plot
[docs] class Visualizer: def __init__(self, data): self.data = data
[docs] def view_orig_var( self, var_name, cmap="Spectral", vmin=-1, vmax=1, elv="90", azm="-", save=False, plot_id=None, fig_path=None, name_prefix=None, show=False, min_time=None, max_time=None, ): if plot_id == "rad_wind_speed_panel": tmp_data = self.data self.plot_data_azm( data_non_90=tmp_data, cmap=cmap, vmin=vmin, vmax=vmax, plot_id=plot_id, fig_path=fig_path, save=save, show=show, min_time=min_time, max_time=max_time, ) else: tmp_data = Filtering(self.data).get_vertical_obs_comp(var_name) if name_prefix: std_name = tmp_data.attrs["standard_name"] string_name = f"{name_prefix}_{std_name}" else: string_name = tmp_data.attrs["standard_name"] self.plot_data( tmp_data=tmp_data, cmap=cmap, vmin=vmin, vmax=vmax, elv=elv, azm=azm, save=save, plot_id=plot_id, string_name=string_name, fig_path=fig_path, min_time=min_time, max_time=max_time, )
[docs] def view_ret_var( self, var_name, cmap="Spectral", vmin=-1, vmax=1, elv="90", azm="-", save=False, plot_id=None, fig_path=None, name_prefix=None, show=False, min_time=None, max_time=None, ): tmp_data = self.data[var_name] string_name = tmp_data.attrs["standard_name"] self.plot_data( tmp_data=tmp_data, cmap=cmap, vmin=vmin, vmax=vmax, elv=elv, azm=azm, save=save, plot_id=plot_id, string_name=string_name, fig_path=fig_path, show=show, min_time=min_time, max_time=max_time, )
[docs] def plot_data( self, tmp_data, cmap="Spectral", vmin=-1, vmax=1, elv="90", azm="-", save=False, plot_id=None, fig_path=None, string_name=None, show=False, min_time=None, max_time=None, ): sel_day = pd.to_datetime(tmp_data.time[0].values) if max_time is not None: max_time = pd.to_datetime(max_time) else: max_time = pd.to_datetime(sel_day.strftime("%Y%m%d 23:59:59")) if min_time is not None: min_time = pd.to_datetime(min_time) else: min_time = pd.to_datetime(sel_day.strftime("%Y%m%d 00:00:00")) tmp_data = tmp_data.sel(time=slice(min_time, max_time)) if string_name: tmp_data.attrs["standard_name"] = string_name plt.figure(figsize=(18, 8)) plot = tmp_data.plot(x="time", cmap=cmap, vmin=vmin, vmax=vmax) plot = PlotSettings.plot_setup(plot) plt.grid(b=True) plt.ylim(0, 12e3) plt.xlim(min_time, max_time) plt.title(f"elv: {elv}, azm: {azm}") if plot_id == "hor_wind_dir": plot.colorbar.set_ticks(np.linspace(0, 360, 9)) if save: sel_day_str = sel_day.strftime("%Y%m%d") file_name = f"{sel_day_str}_{plot_id}.png" output_file_name = os.path.join(fig_path, file_name) print(output_file_name) plt.savefig(output_file_name, bbox_inches="tight") if show: plt.show() plt.close()
[docs] def plot_data_azm( self, data_non_90, cmap="Spectral", vmin=-1, vmax=1, fig_path=None, save=False, plot_id=None, show=False, min_time=None, max_time=None, ): elv = data_non_90.elv.values[0] fig, axes = plt.subplots(5, 1, sharex=True, figsize=(18, 25)) sel_day = pd.to_datetime(data_non_90.time[0].values) if max_time is not None: max_time = pd.to_datetime(max_time) else: max_time = pd.to_datetime(sel_day.strftime("%Y%m%d 23:59:59")) if min_time is not None: min_time = pd.to_datetime(min_time) else: min_time = pd.to_datetime(sel_day.strftime("%Y%m%d 00:00:00")) for ax_number, i in enumerate(data_non_90.azm.values): tmp_data = data_non_90.sel(azm=i) tmp_data = tmp_data.sel(time=slice(min_time, max_time)) plot = tmp_data.plot( x="time", cmap=cmap, vmin=vmin, vmax=vmax, ax=axes[ax_number] ) plot = PlotSettings.plot_setup(plot) axes[ax_number].grid(b=True) axes[ax_number].set_ylim(0, 12e3) axes[ax_number].set_xlim(min_time, max_time) axes[ax_number].set_title(f"elv: {elv}, azm: {i}") if save: sel_day_str = sel_day.strftime("%Y%m%d") file_name = f"{sel_day_str}_{plot_id}.png" output_file_name = os.path.join(fig_path, file_name) print(output_file_name) plt.savefig(output_file_name, bbox_inches="tight") if show: plt.show() plt.close()