""" Color palette and style definitions for Voice Branding analysis plots. """ class ColorPalette: """ Consistent color palette for all visualizations. Update colors here to propagate changes to all plots. """ # Primary brand/chart color PRIMARY = "#0077B6" # Medium Blue # Gradient for rankings (Darkest -> Lightest or Strong -> Soft) RANK_1 = "#004C6D" # Dark Blue (1st Choice) RANK_2 = "#008493" # Teal (2nd Choice) RANK_3 = "#5AAE95" # Sea Green (3rd Choice) RANK_4 = "#9E9E9E" # Grey (4th Choice / Worst) # Neutral color for unhighlighted comparison items NEUTRAL = "#D3D3D3" # Light Grey # Character-specific colors (for individual character plots) # Each character has a main color and a lighter highlight for original traits CHARACTER_BANK_TELLER = "#004C6D" # Dark Blue CHARACTER_BANK_TELLER_HIGHLIGHT = "#669BBC" # Light Steel Blue CHARACTER_FAMILIAR_FRIEND = "#008493" # Teal CHARACTER_FAMILIAR_FRIEND_HIGHLIGHT = "#A8DADC" # Pale Cyan CHARACTER_COACH = "#5AAE95" # Sea Green CHARACTER_COACH_HIGHLIGHT = "#A8DADC" # Pale Cyan CHARACTER_PERSONAL_ASSISTANT = "#457B9D" # Steel Blue CHARACTER_PERSONAL_ASSISTANT_HIGHLIGHT = "#669BBC" # Light Steel Blue # General UI elements TEXT = "black" GRID = "lightgray" BACKGROUND = "white" # Statistical significance colors (for heatmaps/annotations) SIG_STRONG = "#004C6D" # p < 0.001 - Dark Blue (highly significant) SIG_MODERATE = "#0077B6" # p < 0.01 - Medium Blue (significant) SIG_WEAK = "#5AAE95" # p < 0.05 - Sea Green (marginally significant) SIG_NONE = "#E8E8E8" # p >= 0.05 - Light Grey (not significant) SIG_DIAGONAL = "#FFFFFF" # White for diagonal (self-comparison) # Extended palette for categorical charts (e.g., pie charts with many categories) CATEGORICAL = [ "#0077B6", # PRIMARY - Medium Blue "#004C6D", # RANK_1 - Dark Blue "#008493", # RANK_2 - Teal "#5AAE95", # RANK_3 - Sea Green "#9E9E9E", # RANK_4 - Grey "#D3D3D3", # NEUTRAL - Light Grey "#003049", # Dark Navy "#669BBC", # Light Steel Blue "#A8DADC", # Pale Cyan "#457B9D", # Steel Blue ] # Gender-based colors (Male = Blue tones, Female = Pink tones) # Primary colors by gender GENDER_MALE = "#0077B6" # Medium Blue (same as PRIMARY) GENDER_FEMALE = "#B6007A" # Medium Pink # Ranking colors by gender (Darkest -> Lightest) GENDER_MALE_RANK_1 = "#004C6D" # Dark Blue GENDER_MALE_RANK_2 = "#0077B6" # Medium Blue GENDER_MALE_RANK_3 = "#669BBC" # Light Steel Blue GENDER_FEMALE_RANK_1 = "#6D004C" # Dark Pink GENDER_FEMALE_RANK_2 = "#B6007A" # Medium Pink GENDER_FEMALE_RANK_3 = "#BC669B" # Light Pink # Neutral colors by gender (for non-highlighted items) GENDER_MALE_NEUTRAL = "#B8C9D9" # Grey-Blue GENDER_FEMALE_NEUTRAL = "#D9B8C9" # Grey-Pink def jpmc_altair_theme(): """JPMC brand theme for Altair charts.""" return { 'config': { 'view': { 'continuousWidth': 1000, 'continuousHeight': 500, 'strokeWidth': 0 }, 'background': ColorPalette.BACKGROUND, 'axis': { 'grid': True, 'gridColor': ColorPalette.GRID, 'labelFontSize': 11, 'titleFontSize': 12, 'labelColor': ColorPalette.TEXT, 'titleColor': ColorPalette.TEXT, 'labelLimit': 200 # Allow longer labels before truncation }, 'axisX': { 'labelAngle': -45, 'labelLimit': 200 # Allow longer x-axis labels }, 'axisY': { 'labelAngle': 0 }, 'legend': { 'orient': 'top', 'direction': 'horizontal', 'titleFontSize': 11, 'labelFontSize': 11 }, 'title': { 'fontSize': 14, 'color': ColorPalette.TEXT, 'anchor': 'start', 'subtitleFontSize': 10, 'subtitleColor': 'gray' }, 'bar': { 'color': ColorPalette.PRIMARY } } } # Register Altair theme try: import altair as alt alt.themes.register('jpmc', jpmc_altair_theme) alt.themes.enable('jpmc') except ImportError: pass # Altair not installed