class_docstr: A callback that stores plots of the validation losses and a macro-averaged validation loss curve every n epochs.
  
  Args:
      every_n_epochs: Specifies how often the plots are generated.
          Setting this to a large value can save time since plotting can be time consuming
          (especially when small datasets are used).
class_docstr_tok: ["A","callback","that","stores","plots","of","the","validation","losses","and","a","macro-averaged","validation","loss","curve","every","n","epochs",".","Args",":","every_n_epochs",":","Specifies","how","often","the","plots","are","generated",".","Setting","this","to","a","large","value","can","save","time","since","plotting","can","be","time","consuming","(","especially","when","small","datasets","are","used",")","."]
code: def on_validation_epoch_end(
      self, trainer: Trainer, pl_module: MetaLightningModule
  ) -> None:
      if trainer.current_epoch % self.every_n_epochs:
          return
      self.plot_crps(trainer, scaled=False)
      dm_super = trainer.lightning_module.trainer.datamodule
      if dm_super.standardize:
          self.plot_crps(trainer, scaled=True)
  
imports: from typing import Optional, Union, List
  from pytorch_lightning import Callback, Trainer
  import matplotlib.pyplot
  from meta.data.batch import TripletBatch
  from meta.models.module import MetaLightningModule
  from .common import get_save_dir_from_csvlogger, get_loss_steps
  from meta.data.batch import SeriesBatch
  from meta.vis.forecast import plot_quantile_forecast, plot_forecast_supportset_attention
label_desc: Use image node_id 2 for calling the MacroCRPSPlotCallback obj's underlying member method code with example usage: obj.on_validation_epoch_end(trainer, pl_module) without return types