Source code for foxes.output.rotor_point_plots

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colormaps

from foxes.input.states import SingleStateStates
from foxes.core import WindFarm
from foxes.algorithms import Downwind

from .output import Output


[docs] class RotorPointPlot(Output): """ Visualizes rotor points and their weights. Attributes ---------- rotor_model: foxes.core.RotorModel The rotor model algo: foxes.core.Algorithm, optional The algorithm :group: output """
[docs] def __init__(self, rotor_model, algo=None, **kwargs): """ Constructor. Parameters ---------- rotor_model: foxes.core.RotorModel The rotor model algo: foxes.core.Algorithm, optional The algorithm kwargs: dict, optional Additional parameters for the base class """ super().__init__(**kwargs) self.rotor_model = rotor_model self.algo = algo if self.algo is None: farm = WindFarm() states = SingleStateStates(ws=9, wd=270, ti=0.1, rho=1.225) self.algo = Downwind(farm, states, [])
[docs] def get_point_figure( self, ax=None, fig=None, figsize=(5, 5), title=None, **kwargs, ): """ Get a scatter plot of the rotor points. Parameters ---------- ax: matplotlib.Axes, optional The plot axes fig: matplotlib.Figure, optional The figure object figsize: tuple The default figure size title: str, optional The plot title kwargs: dict, optional Additional arguments for pyplot.scatter Returns ------- ax: matplotlib.Axes The plot axes """ if fig is None: fig = plt.figure(figsize=figsize) ax = fig.add_subplot(111) else: ax = fig.axes[0] if ax is None else ax if not self.rotor_model.initialized: self.rotor_model.initialize(self.algo) points = self.rotor_model.design_points() weights = self.rotor_model.rotor_point_weights() * 100 cmap = colormaps[kwargs.pop("cmap", "viridis_r")] wlist = np.sort(np.unique(weights)) im = ax.scatter(points[:, 1], points[:, 2], c=weights, cmap=cmap, **kwargs) ax.add_patch(plt.Circle((0, 0), 1, color="black", fill=False, alpha=0.8)) ax.set_xlabel("x/D") ax.set_ylabel("y/D") if title is None: title = str(self.rotor_model) if title != "": ax.set_title(title) ax.set_aspect("equal", adjustable="box") tlabels = [f"{wlist[-1]:.02f}"] for i in range(len(wlist) - 2, -1, -1): w = wlist[i] w1 = wlist[i + 1] if (w1 - w) / (wlist[-1] - wlist[0]) > 0.05: tlabels.insert(0, f"{w:.2f}") elif i == 0: tlabels[0] = "" tlabels.insert(0, f"{w:.2f}") else: tlabels.insert(0, "") cbar = fig.colorbar(im, ax=ax, label="Point weight [%]", shrink=0.8) cbar.set_ticks(ticks=wlist, labels=tlabels) return im