| # State of the Bay Plotting Style Guide |
|
|
| This guide ensures consistency across all data visualizations in the State of the Bay project. |
|
|
| ## 1. Layout and Sizing |
|
|
| ### Figure Dimensions |
| - Standard plots: `figsize=(12, 8)` |
| - Panel/faceted plots: `figsize=(15, 2.5 * n_panels)` |
| - Use `plt.tight_layout()` for proper spacing |
| - Arrange multi-panel plots vertically for better comparison |
|
|
| ## 2. Colors and Visual Elements |
|
|
| ### Color Palette |
| - Use predefined `COLOR_SCALE` for consistency |
| - Grey tones: |
| ```python |
| GREY30 = "#4d4d4d" # Dark grey for titles |
| GREY40 = "#666666" # Medium grey for axes and labels |
| ``` |
| - Use alpha transparency (0.5-0.7) for overlays |
|
|
| ### Line Styles |
| - Trend lines: dashed (`--`), red, `alpha=0.7`, `linewidth=1.5` |
| - Grid lines: light grey, `alpha=0.15` |
|
|
| ## 3. Axes and Spines |
|
|
| ### Spine Configuration |
| ```python |
| # Remove unnecessary spines |
| ax.spines["top"].set_visible(False) |
| ax.spines["right"].set_visible(False) |
| |
| # Style bottom spine |
| ax.spines["bottom"].set_color(GREY40) |
| ax.spines["bottom"].set_linewidth(0.5) |
| |
| # Remove tick marks but keep labels |
| ax.tick_params(axis="both", which="both", length=0, colors=GREY40) |
| ``` |
|
|
| ## 4. Grid Lines |
|
|
| ### Configuration |
| ```python |
| ax.grid(True, axis="y", alpha=0.15, linestyle="-", color="gray") |
| ``` |
|
|
| ## 5. Text Elements |
|
|
| ### Typography |
| - Main titles: centered, size 12 |
| - Panel titles: size 10, `color=GREY30`, `pad=10` |
| - Axis labels: size 10, `color=GREY40` |
|
|
| ### Statistics and Annotations |
| ```python |
| ax.text( |
| 0.02, 0.98, |
| stats_text, |
| transform=ax.transAxes, |
| verticalalignment="top", |
| fontsize=8, |
| bbox=dict(facecolor="white", alpha=0.8, edgecolor="none") |
| ) |
| ``` |
|
|
| ## 6. Data Visualization |
|
|
| ### Line Charts |
| - Include confidence intervals (shaded regions) |
| - Solid lines for main trends |
| - Consistent line thickness |
|
|
| ### Box Plots |
| ```python |
| boxplot_props = { |
| "patch_artist": True, |
| "medianprops": dict(color="black"), |
| "flierprops": dict( |
| marker="o", |
| markerfacecolor=color_scale[idx], |
| alpha=0.5, |
| markersize=4 |
| ), |
| "boxprops": dict(facecolor=color_scale[idx], alpha=0.6), |
| "widths": 0.6 |
| } |
| ``` |
|
|
| ## 7. Scales and Ranges |
|
|
| ### Automatic Log Scaling |
| ```python |
| use_log_scale = parameter in [ |
| "Turbidity", |
| "Fecal Coliform (MPN)", |
| "Total Nitrogen", |
| "Total Phosphorus", |
| ] |
| ``` |
|
|
| ### Best Practices |
| - Add padding to axis limits |
| - Use consistent y-axis ranges across comparison panels |
| - Handle edge cases gracefully |
|
|
| ## 8. Function Structure |
|
|
| ### Return Values |
| ```python |
| def plot_function(df: pd.DataFrame, parameter: str) -> tuple[Figure, pd.DataFrame, pd.DataFrame]: |
| """ |
| Create a visualization. |
| |
| Parameters: |
| ----------- |
| df : pd.DataFrame |
| Input dataframe |
| parameter : str |
| Parameter to plot |
| |
| Returns: |
| -------- |
| tuple[Figure, pd.DataFrame, pd.DataFrame] |
| - Figure: Matplotlib figure |
| - DataFrame: Raw data used in plot |
| - DataFrame: Processed data points |
| """ |
| # ... plotting code ... |
| return fig, raw_data, plot_data |
| ``` |
|
|
| ## 9. Error Handling |
|
|
| ### Guidelines |
| - Handle missing data gracefully |
| - Include data validation |
| - Provide appropriate fallbacks for edge cases |
| - Log warnings for potential issues |
|
|
| ## 10. Optional Features |
|
|
| ### Configurable Elements |
| ```python |
| def plot_function( |
| df: pd.DataFrame, |
| parameter: str, |
| show_sem: bool = True, |
| show_trend: bool = True, |
| panel_chart: bool = False, |
| color_scale: list[str] = COLOR_SCALE, |
| ) -> tuple[Figure, pd.DataFrame, pd.DataFrame]: |
| """...""" |
| ``` |
|
|
| ### Common Options |
| - `show_sem`: Toggle standard error margins |
| - `show_trend`: Toggle trend lines and statistics |
| - `panel_chart`: Toggle between single and multi-panel layouts |
| - `color_scale`: Override default color palette |