Source code for hedvis.core.visualization_config

"""Configuration classes for HED visualizations."""

from dataclasses import dataclass, field
from typing import Optional, Dict, Any, List


[docs] @dataclass class WordCloudConfig: """Configuration for word cloud visualizations. Attributes: width: Width of word cloud in pixels. height: Height of word cloud in pixels. background_color: Background color name or None for transparent. prefer_horizontal: Fraction of words oriented horizontally (0.0-1.0). min_font_size: Minimum font size in points. max_font_size: Maximum font size in points (auto-calculated if None). font_path: Path to TTF/OTF font file (None uses default). colormap: Matplotlib colormap name for word colors. color_range: Tuple of (min, max) values from colormap to use. color_step_range: Tuple of (min, max) step sizes through colormap. use_mask: Whether to use a mask image to shape the cloud. mask_path: Path to mask image file (PNG/JPEG). contour_width: Width of contour line around masked region. contour_color: Color name for contour line. scale_adjustment: Adjustment factor for log-transformed frequencies. relative_scaling: Scaling factor for word sizes (0.0-1.0). """ # Dimensions width: int = 800 height: int = 600 # Appearance background_color: Optional[str] = None # None = transparent prefer_horizontal: float = 0.75 min_font_size: int = 8 max_font_size: Optional[int] = None # Auto-calculated if None # Font settings font_path: Optional[str] = None # Color scheme colormap: str = "nipy_spectral" color_range: tuple = (0.0, 0.5) color_step_range: tuple = (0.15, 0.25) # Mask settings use_mask: bool = False mask_path: Optional[str] = None contour_width: float = 3.0 contour_color: str = "black" # Scaling scale_adjustment: float = 0.0 # For log-transform adjustments relative_scaling: float = 1.0
[docs] @classmethod def from_dict(cls, config_dict: Dict[str, Any]) -> "WordCloudConfig": """Create configuration from dictionary. Parameters: config_dict: Dictionary with configuration parameters. Returns: WordCloudConfig: Configuration object. """ # Filter to only valid fields valid_fields = {k: v for k, v in config_dict.items() if k in cls.__dataclass_fields__} return cls(**valid_fields)
[docs] def to_dict(self) -> Dict[str, Any]: """Convert configuration to dictionary. Returns: dict: Dictionary representation of configuration. """ return {k: v for k, v in self.__dict__.items() if not k.startswith("_")}
[docs] @dataclass class VisualizationConfig: """Master configuration for all HED visualizations. Attributes: output_formats: List of output formats ('svg', 'png', 'jpg', etc.). save_directory: Directory path for saving visualizations (None = don't save). word_cloud: Configuration for word cloud visualization (None = don't generate). """ # Output settings output_formats: List[str] = field(default_factory=lambda: ["svg"]) save_directory: Optional[str] = None # Visualization types to generate word_cloud: Optional[WordCloudConfig] = None # Future visualization types can be added here: # timeline: Optional[TimelineConfig] = None # network: Optional[NetworkConfig] = None # heatmap: Optional[HeatmapConfig] = None
[docs] @classmethod def from_dict(cls, config_dict: Dict[str, Any]) -> "VisualizationConfig": """Create configuration from dictionary. Parameters: config_dict: Dictionary with configuration parameters. Returns: VisualizationConfig: Configuration object. Notes: Nested dictionaries are automatically converted to appropriate config objects. """ config = config_dict.copy() # Handle nested word_cloud config if "word_cloud" in config and isinstance(config["word_cloud"], dict): config["word_cloud"] = WordCloudConfig.from_dict(config["word_cloud"]) # Filter to only valid fields valid_fields = {k: v for k, v in config.items() if k in cls.__dataclass_fields__} return cls(**valid_fields)
[docs] def to_dict(self) -> Dict[str, Any]: """Convert configuration to dictionary. Returns: dict: Dictionary representation of configuration. """ result = {} for key, value in self.__dict__.items(): if key.startswith("_"): continue if hasattr(value, "to_dict"): result[key] = value.to_dict() else: result[key] = value return result