Source code for thuner.visualize.analysis

"""Methods for visualizing analyses of thuner output."""

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import thuner.visualize.utils as utils

__all__ = ["windrose", "windrose_legend"]


[docs] def windrose( ax, u: float, v: float, bins, yticks=None, label_angle=112.5, colormap=None, verticalalignment="top", horizontalalignment="right", ): """Cretae a windrose style figure.""" speed = np.sqrt(u**2 + v**2) direction = np.rad2deg(np.arctan2(v, u)) heading = (90 - direction) % 360 if colormap is None: colormap = plt.get_cmap("Spectral_r", len(bins)) edgecolor = plt.rcParams["axes.edgecolor"] kwargs = {"normed": True, "opening": 0.8, "edgecolor": edgecolor} kwargs.update({"linewidth": 1, "blowto": False, "bins": bins, "cmap": colormap}) ax.bar(heading, speed, **kwargs) if yticks is not None: ax.set_yticks(yticks) tick_labels = [t + "%" for t in yticks.astype(str)] kwargs = {"verticalalignment": verticalalignment} kwargs.update({"horizontalalignment": horizontalalignment}) ax.set_yticklabels(tick_labels, **kwargs) ax.set_rlabel_position(label_angle) return ax
[docs] def windrose_legend(legend_ax, bins, colormap=None, units="m/s", columns=2): """Create a legend for a windrose style figure.""" colors = colormap(np.linspace(0, 1, len(bins))) labels = [] for i in range(len(bins) - 1): labels.append(f"[{bins[i]} {units}, {bins[i+1]} {units})") labels.append(f"[{bins[-1]} {units}, " + r"$\infty$)") edgecolor = plt.rcParams["axes.edgecolor"] kwargs = {"linewidth": 1, "edgecolor": edgecolor} handles = [Patch(facecolor=colors[i], **kwargs) for i in range(len(labels))] kwargs = {"ncol": columns, "fancybox": True, "shadow": True} handles, labels = utils.reorder_legend_entries(handles, labels, columns=columns) return legend_ax.legend(handles, labels, **kwargs)