def plot_heated_stacked_area(df: pd.DataFrame, lines: str, heat: str, backtest: str = None, reset_y_lim: bool = False, figsize: Tuple[int, int] = (16, 9), color_map: str = 'afmhot', ax: Axis = None, upper_lower_missing_scale: float = 0.05) -> Axis: color_function = plt.get_cmap(color_map) x = df.index y = df[lines].values c = df[heat].values b = df[backtest].values if backtest is not None else None # assert enough data assert len(y.shape) > 1 and len( c.shape) > 1, "lines and heat need to be 2 dimensions!" # make sure we have one more line as heats if c.shape[1] == y.shape[1] + 1: lower = np.full((c.shape[0], 1), y.min() * (1 - upper_lower_missing_scale)) upper = np.full((c.shape[0], 1), y.max() * (1 + upper_lower_missing_scale)) y = np.hstack([lower, y, upper]) # check for matching columns assert y.shape[1] - 1 == c.shape[ 1], f'unexpeced shapes: {y.shape[1] - 1} != {c.shape[1]}' _, ax = plt.subplots(figsize=figsize) if ax is None else (None, ax) ax.plot(x, y, color='k', alpha=0.0) for ci in range(c.shape[1]): for xi in range(len(x)): ax.fill_between(x[xi - 1:xi + 1], y[xi - 1:xi + 1, ci], y[xi - 1:xi + 1, ci + 1], facecolors=color_function(c[xi - 1:xi + 1, ci])) if ci > 0: # todo annotate all first last and only convert date if it is actually a date ax.annotate(f'{y[-1, ci]:.2f}', xy=(mdates.date2num(x[-1]), y[-1, ci]), xytext=(4, -4), textcoords='offset pixels') # reset limits ax.autoscale(tight=True) if reset_y_lim: ax.set_ylim(bottom=y[:, 1].min(), top=y[:, -1].max()) # backtest if backtest: ax.plot(x, b) return ax
def file_vs_value_plot( a_x: Axis, field_name: str, row: pd.DataFrame, range_columns: List[str], fontsize: float, pad: float ) -> None: """Create a dot plot with one point per file""" assert field_name in ["rt_peak", "peak_height"] a_x.tick_params(direction="in", length=1, pad=pad, width=0.1, labelsize=fontsize) num_files = len(range_columns) a_x.scatter(range(num_files), row[:num_files], s=0.2) if field_name == "rt_peak": a_x.axhline(y=row["atlas RT peak"], color="r", linestyle="-", linewidth=0.2) range_columns += ["atlas RT peak"] a_x.set_ylim(np.nanmin(row.loc[range_columns]) - 0.12, np.nanmax(row.loc[range_columns]) + 0.12) else: a_x.set_yscale("log") a_x.set_ylim(bottom=1e4, top=1e10) a_x.set_xlim(-0.5, num_files + 0.5) a_x.xaxis.set_major_locator(mticker.FixedLocator(np.arange(0, num_files, 1.0))) _ = [s.set_linewidth(0.1) for s in a_x.spines.values()] # truncate name so it fits above a single subplot a_x.set_title(row.name[:33], pad=pad, fontsize=fontsize) a_x.set_xlabel("Files", labelpad=pad, fontsize=fontsize) ylabel = "Actual RTs" if field_name == "rt_peak" else "Peak Height" a_x.set_ylabel(ylabel, labelpad=pad, fontsize=fontsize)