Colores, pinceles, fondos, postprocesado, temas y mapas de color
El aspecto de una escena sale de tres capas: el tema activo (colores semánticos, tipografía, reglas por tipo de objeto y tokens de espaciado), el fondo y los estilos que escribes en cada objeto, que siempre ganan.
from gaanim import BLUE, GOLD, Scene
scene =Scene(frame=(16, 9), theme="technical")
circle = scene.geometry.circle(1).fill(BLUE).stroke(GOLD, 0.05)
label = scene.text("Escena con tema", role="title").move_to(0, 2.5)
scene.play([circle.animate.create(), label.animate.write()])
scene.render()
Toda escena empieza con el tema technical: Scene() equivale a Scene(theme="technical"), scene.canvas.theme vale "technical" y el fondo es gris casi negro (#121212), con texto y ejes claros y formas rellenas con el color de acento. Otro tema (Scene(theme=...) o scene.canvas.set_theme(...)) sustituye al predeterminado, un fondo explícito (Scene(background=...)) gana al del tema y los colores que pones en cada objeto ganan a los del tema.
Para un lienzo sin tema, pasa Scene(theme=None) o llama a scene.canvas.set_theme(None). Sin tema el fondo vuelve a ser blanco (salvo que hayas elegido uno) y el texto, las formas y los ejes sin estilo propio son blancos, así que dales color o usa un fondo que contraste; gaanim check avisa cuando no se verían. Sin tema, scene.canvas.color(...) y scene.canvas.validate_theme() lanzan ValueError, y los componentes como badge o card usan los colores de technical.
from gaanim import Scene
scene =Scene(frame=(16, 9), theme=None, background="white")
dot = scene.geometry.circle(1).fill("#2563eb")
label = scene.text("Sin tema", color="black").move_to(0, 2)
scene.render()
Colores
Todo argumento ColorLike acepta un Color, una cadena CSS Color 4 ("#0f172a", "tomato", "oklch(62% 0.2 260)", "rgb(37 99 235 / 65%)") o una tupla (r, g, b) o (r, g, b, a) de enteros de 0 a 255. Una sintaxis inválida o un componente fuera de rango lanzan ValueError.
Para anotar tus propias funciones, importa esos tipos desde gaanim: ColorLike; Paint, que también acepta un Brush; ColorMapLike, y BackgroundLike, que también acepta un Background. Funcionan en el comprobador de tipos y al ejecutar la escena. El resto de alias de los stubs (Padding, TextAlign, Endpoint…) se importa desde gaanim.gaanim_core.
from gaanim import Paint, Scene
defdisc(scene: Scene, paint: Paint):
return scene.geometry.circle(1).fill(paint)
scene =Scene(frame=(16, 9))
disc(scene, "#2563eb").move_to(-2, 0)
disc(scene, (220, 38, 38)).move_to(2, 0)
scene.render()
colors.tailwind contiene las 26 familias de Tailwind CSS v4.3.3, con escalas de 50 a 950: colors.tailwind.blue[500] o colors.tailwind["rose"][600]. colors.tailwind.families() las enumera y colors.tailwind.version da la versión incluida.
Drawable.fill(...) y Drawable.stroke(...) aceptan un ColorLike o un Brush reutilizable. Las coordenadas de un gradiente están en el espacio local del objeto, así que la pintura acompaña sus transformaciones. Los colores se reparten uniformemente y hacen falta al menos dos. extend decide qué pasa fuera de la rampa: "pad" (predeterminado) prolonga los extremos, "repeat" la repite y "reflect" la repite en espejo.
Un grupo pasa el pincel a cada miembro, que lo pinta en sus propias unidades locales: un gradiente no cruza el grupo, sino que se repite en cada pieza. Para que un solo gradiente recorra varias formas, únelas con scene.geometry.union(...) o da a cada una un pincel desplazado según su posición.
animate.fill(paint) y animate.stroke(paint, width) interpolan entre pinturas: dos gradientes del mismo tipo interpolan su geometría y sus colores (con números de paradas distintos, se normalizan sus posiciones), y un color sólido puede convertirse en gradiente y al revés. Cambiar entre tipos incompatibles, como lineal y radial, o entre modos de extend distintos, lanza un error al programar la animación. Consulta Anim.fill.
StrokeStyle agrupa todo un trazo reutilizable; se aplica con Drawable.stroke_style o dentro de un tema.
Scene(background=...), scene.canvas.background y scene.segment(..., background=...) aceptan un color, un Brush o un Background. Sus coordenadas son las de la escena: con el marco de 16 × 9, un gradiente lineal de ancho completo va de x=-8 a x=8. El fondo explícito tiene prioridad sobre el del tema.
El fondo se ajusta al cuadro de la escena (16 × 9 por defecto) y se mueve con la cámara como el resto del mundo. Si la cámara se desplaza o se aleja más allá del cuadro, el fondo sigue llenando la vista: sus bordes se prolongan, así que un degradado o un shader continúan con el color de su borde en lugar de dejar una franja vacía.
WGSL inválido, un nombre de uniform inválido o reservado lanzan ValueError y un asset ilegible, RuntimeError. Como el Parameter o la pista se crean con la escena, un fondo con uniforms se asigna después: scene.canvas.background = Background.shader(...). Los paquetes .gaanim guardan los valores de cada fotograma.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
source
str | os.PathLike[str]
obligatorio
WGSL en línea, o la ruta de un asset .wgsl (con pathlib.Path), que se lee al crear el fondo. Una ruta relativa se busca en el directorio de trabajo, luego en la carpeta assets del script y luego junto a él.
fallback
ColorLike | None
None
Color fuera del marco, para calcular el contraste automático y si falla la rasterización; negro si se omite.
uniforms
Mapping[str, float | Parameter | Computed] | None
None
Campos f32 de gaanim_uniforms, como en PostProcess.shader: números fijos o un Parameter, Variable, Computed, scene.time o una señal de audio, evaluados en cada fotograma, así que el fondo reacciona a la música. Como máximo 32, con nombres que sean identificadores WGSL.
audio
Audio | None
None
Da al fondo el espectrograma de la pista con gaanim_audio_spectrum(x, ago) y las demás funciones gaanim_audio_* (ver Audio); reserva el uniform gaanim_audio_time.
Devuelve: Background — Un fondo procedural que sigue la línea de tiempo.
Ejemplo
from gaanim import Background, Scene
shader = Background.shader("""fn gaanim_background( uv: vec2<f32>, resolution: vec2<f32>, time: f32,) -> vec4<f32> { let center = vec2<f32>(0.35 + 0.1 * sin(time), 0.45); let glow = exp(-8.0 * distance(uv, center)); return vec4<f32>(0.02, 0.08 + 0.4 * glow, 0.18 + 0.6 * glow, 1.0);}""", fallback="#071022")
scene =Scene(frame=(16, 9), background=shader)
from pathlib import Path
asset_shader = Background.shader(Path("assets/background.wgsl"), fallback="#071022")
uv=(0, 0) es la esquina superior izquierda y uv=(1, 1) la inferior derecha: uv.y crece hacia abajo, aunque la escena use y hacia arriba. Usa 1.0 - uv.y para trabajar hacia arriba.
resolution es el tamaño efectivo en píxeles.
time es la posición absoluta de la línea de tiempo en segundos, así que las búsquedas, las capturas y la exportación son deterministas.
gaanim_frame_size(resolution) devuelve el tamaño del marco en unidades de la escena (por ejemplo (16, 9)), para dibujar en las mismas unidades que las formas.
El shader cubre el mismo rectángulo de escena que muestra el editor. En el visor se ejecuta en la misma GPU que dibuja la escena y solo se repite cuando cambian el tiempo o el tamaño en píxeles. Las exportaciones y las capturas producen los mismos píxeles.
PROPIEDADBackground.fallbackfallback: Color
Devuelve: Color — El color representativo del fondo, usado para limpiar y para el contraste.
Fondos vivos
Fondos procedurales listos para usar, construidos sobre Background.shader: se mueven con el tiempo de la línea de tiempo y la misma semilla da siempre la misma imagen. Los colores se mezclan en luz lineal. Un valor inválido lanza ValueError.
Manchas suaves de 2 a 8 colors que derivan por órbitas y se mezclan como un mesh gradient. speed escala el movimiento (0 lo congela) y seed elige otra disposición.
Ejemplo
from gaanim import WHITE, Background, Scene
scene =Scene(frame=(16, 9))
scene.canvas.background = Background.mesh_gradient(
["#0b1040", "#6a2cc8", "#12b8a6", "#f25f8b"], speed=0.3, seed=4
)
scene.text("Mesh gradient", role="title").fill(WHITE)
scene.wait(2.0)
scene.render()
Ruido fBm con dominio deformado, al estilo de los gradientes de Stripe, recorriendo una rampa de 2 a 8 colors. scale es el número de rasgos por altura del cuadro.
Puntos cada spacing unidades de la escena, con uno en el origen. radius está en unidades y es como mucho la mitad de spacing; color (blanco translúcido por defecto, respeta su alfa) sobre background oscuro. drift desplaza la rejilla en unidades por segundo.
Un PostProcess aplica una función WGSL sobre todo lo que la escena dibuja en 2D: fondo, texto, formas, imágenes y Lottie. Se ejecuta en el editor, en el modo presentación, en las capturas y en la exportación, siempre con el tiempo exacto de la línea de tiempo.
WGSL inválido, un campo sin declarar, un nombre inválido o un número no finito lanzan ValueError, y un asset ilegible, RuntimeError.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
source
str | os.PathLike[str]
obligatorio
WGSL en línea, o la ruta de un asset .wgsl que se lee al crear el objeto. Una ruta relativa se busca en el directorio de trabajo, luego en la carpeta assets del script y luego junto a él.
uniforms
Mapping[str, float | Parameter | Computed] | None
None
Valores que el shader lee como campos f32 de gaanim_uniforms (gaanim_uniforms.amount). Un Parameter, Variable, Computed o scene.time se evalúa en cada fotograma, así que animarlo anima el efecto. Como máximo 32 por pasada, con nombres que sean identificadores WGSL.
audio
Audio | None
None
Da al shader el espectrograma de la pista: gaanim_audio_spectrum(x, ago), gaanim_audio_level(ago), gaanim_audio_band(low, high, ago) y gaanim_audio_x(hz). Reserva el uniform gaanim_audio_time. Ver Audio.
Devuelve: PostProcess — Un postprocesado para Scene(post=...), scene.canvas.post o scene.segment(..., post=...).
Ejemplo
from gaanim import PostProcess, Scene
vignette = PostProcess.shader("""fn gaanim_post(uv: vec2<f32>, resolution: vec2<f32>, time: f32) -> vec4<f32> { let color = gaanim_scene(uv); let edge = smoothstep(0.9, 0.35, distance(uv, vec2<f32>(0.5))); return vec4<f32>(color.rgb * edge, color.a);}""")
scene =Scene(frame=(16, 9), post=vignette)
uv=(0, 0) es la esquina superior izquierda del cuadro de la cámara y uv=(1, 1) la inferior derecha.
resolution es el tamaño del cuadro en píxeles de salida.
time es la posición absoluta de la línea de tiempo en segundos.
gaanim_scene(uv) devuelve el color ya renderizado en ese punto: sRGB con alfa sin premultiplicar. Fuera del cuadro devuelve el píxel más cercano del borde.
El resultado se limita a [0, 1].
Solo se procesa el cuadro de la cámara. El shader recibe píxeles, así que un radio fijo como 1.0 / 1920.0 cambia con la resolución de salida: para un número de píxeles usa offset / resolution y, para que se vea igual a cualquier resolución, expresa el radio como fracción de uv. También se aplica con una cámara en perspectiva, pero no a la salida SVG.
Devuelve: str · list[str] — El código WGSL de la función y los nombres de sus uniforms, en orden.
Uniforms animables y cadenas
Un uniform enlazado a un Parameter se anima como cualquier valor, y el efecto se ve igual en el editor y en la exportación. Varias pasadas se encadenan con una lista: cada una lee con gaanim_scene lo que escribió la anterior.
from gaanim import GOLD, PostProcess, Scene
scene =Scene(frame=(16, 9), background="#0b1020")
amount = scene.viz.parameter(0.0)
split = PostProcess.shader("""fn gaanim_post(uv: vec2<f32>, resolution: vec2<f32>, time: f32) -> vec4<f32> { let shift = vec2<f32>(gaanim_uniforms.amount * 0.02, 0.0); let base = gaanim_scene(uv); return vec4<f32>(gaanim_scene(uv + shift).r, base.g, gaanim_scene(uv - shift).b, base.a);}""", uniforms={"amount": amount})
scene.canvas.post = [split, PostProcess.vignette(0.5)]
ring = scene.geometry.circle(2).no_fill().stroke(GOLD, 0.2)
scene.play([amount.animate.set(1.0).duration(0.5).repeat(2, yoyo=True)])
scene.render()
Presets de acabado
Pasadas listas para usar, sin escribir WGSL. Sus valores aceptan un número o un Parameter para animarlos. Los tamaños se miden en píxeles de un cuadro de 1080 de alto, así que se ven igual a cualquier resolución de salida, y el ruido cambia cada 1/24 s del tiempo de la línea de tiempo, así que un fotograma es siempre el mismo. Un número fuera de rango lanza ValueError.
Corrección de color: exposure en pasos y temperature (-1 frío a 1 cálido) en luz lineal; después contrast alrededor del gris medio y saturation alrededor de la luminancia. 1.0 deja contraste y saturación igual.
Aplica la tabla 3D de un archivo .cube (LUT_3D_SIZE de 2 a 65, con DOMAIN_MIN/DOMAIN_MAX opcionales), mezclada según strength. El archivo se lee al crear el objeto (una ruta relativa se busca en el directorio de trabajo, luego en la carpeta assets del script y luego junto a él): si no se puede leer lanza RuntimeError y una tabla inválida, ValueError.
halftone: puntos de imprenta en celdas de dot píxeles, más grandes cuanto más clara es la celda. dither: tramado ordenado (Bayer 4×4) a levels valores por canal. crt: pantalla curva, líneas de barrido y máscara RGB. pixelate: bloques de size píxeles. glitch: franjas que saltan de lado con separación RGB 12 veces por segundo; seed cambia el patrón y intensity se puede animar para dar golpes.
Ejemplo
from gaanim import BLUE, GOLD, PostProcess, Scene
scene =Scene(frame=(16, 9), background="#101826")
burst = scene.viz.parameter(0.0)
scene.canvas.post = [PostProcess.glitch(intensity=burst, seed=3), PostProcess.grain(0.05)]
scene.geometry.circle(1.6).fill(GOLD).move_to(-3, 0)
scene.geometry.rounded_rect(3, 3, 0.3).fill(BLUE).move_to(3, 0)
scene.play([burst.animate.set(1.0).duration(0.3).repeat(2, yoyo=True)])
scene.render()
Bloom multipaso: lo que supera threshold (brillo sRGB de 0 a 1, con rodilla suave) brilla. Extrae las zonas claras, las reduce en una cadena de mips y las vuelve a sumar con un filtro tienda, como el bloom de Blender. intensity escala la luz añadida y radius (0 a 1) la extiende de un halo ceñido a una neblina amplia. La luz se suma en luz lineal y los núcleos muy brillantes se vuelven blancos en vez de saturarse. Su alcance es una fracción del cuadro, así que se ve igual a cualquier resolución. Complementa el glow vectorial de cada objeto.
Ejemplo
from gaanim import PostProcess, Scene
scene =Scene(frame=(16, 9), background="#05060d")
glow = scene.viz.parameter(0.3)
scene.canvas.post = PostProcess.bloom(threshold=0.55, intensity=glow, radius=0.6)
ring = scene.geometry.circle(1.6).no_fill().stroke("#ff4fd8", 0.12).move_to(-3, 0)
star = scene.geometry.regular_polygon(5, 1.6).no_fill().stroke("#ffe45c", 0.12).move_to(3, 0)
scene.play([ring.animate.create(), star.animate.create()])
scene.play([glow.animate.set(1.4).duration(0.6).repeat(2, yoyo=True)])
scene.render()
Desenfoque de movimiento como el de una cámara de cine en las exportaciones y las capturas: cada cuadro promedia en luz lineal samples búsquedas exactas repartidas por el obturador, así que es determinista, y nunca mezcla dos segmentos. La duración del obturador sigue los fps de la exportación (las capturas usan 60). El visor interactivo se ve nítido, y renderizar cuesta samples veces más. Un valor fuera de rango lanza ValueError. Usa drawable.motion_blur(False) para mantener nítido un objeto, y Segment.motion_blur para darle a un segmento su propio obturador.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
shutter_angle
float | None
180.0
Grados de un cuadro que el obturador está abierto, de 0 a 720: 180 es el estándar del cine y 360 difumina todo el cuadro. None lo desactiva.
samples
int
8
Subcuadros promediados por cuadro, de 2 a 64.
phase
float | None
None
Dónde se abre el obturador respecto al tiempo del cuadro, en grados de un cuadro; por defecto se centra en él.
Devuelve: None
Ejemplo
from gaanim import CORAL, GOLD, WHITE, Scene
scene =Scene(frame=(16, 9), background="#101826")
scene.canvas.motion_blur(180, samples=6)
title = scene.text("Motion blur", role="title").fill(WHITE).move_to(0, 3).motion_blur(False)
ball = scene.geometry.circle(0.5).fill(CORAL).move_to(-6, 0)
bar = scene.geometry.rect(4, 0.35).fill(GOLD).move_to(0, -2)
scene.play([ball.animate.move_to(6, 0).duration(0.6), bar.animate.rotate_by(6.2832).duration(1.0)])
scene.render()
Una lista encadena las pasadas en orden. None o una lista vacía lo quitan. Un segmento puede cambiarlo mientras está activo: post=otro (o una lista) usa otra cadena, post=False dibuja el segmento sin postprocesado y post=None (el predeterminado) hereda el de la escena. drawable.post_process(False) deja un objeto fuera de todas las pasadas. Un uniform que lee un valor de otra escena lanza ValueError y cualquier otro valor, TypeError.
Devuelve: PostProcess | list[PostProcess] | None — El postprocesado de la escena; se puede leer y asignar.
Un tema reúne colores semánticos, tipografía, reglas de estilo por tipo de objeto, paletas de datos y tokens de espaciado. Los componentes (tarjetas, insignias, bandas, gráficas, tablas, paneles de código) toman de él sus colores de primer plano, acento, panel y regla. Un .fill(...) explícito siempre tiene prioridad.
Equivale a Scene(theme=...) después de crear la escena y sustituye al tema technical predeterminado. El fondo del tema reemplaza al actual salvo que la escena tenga un fondo explícito. Las reglas se aplican al compilar, así que también alcanzan a los objetos creados antes de la llamada. Un nombre desconocido lanza ValueError.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
theme
ThemeName | Theme | None
obligatorio
Nombre o alias de un tema incluido, un Theme, o None para quitar el tema.
Devuelve: None — Instala el tema en la escena, o lo quita.
Ejemplo
from gaanim import Scene
scene =Scene(frame=(16, 9))
scene.canvas.set_theme("presentation")
title = scene.text("Transformada de Fourier", role="title")
subtitle = scene.text("Representación en frecuencia", role="subtitle").move_to(0, -1)
scene.play([title.animate.write(), subtitle.animate.fade_in()])
scene.render()
Tema
Alias
Aspecto
technical (predeterminado)
scientific
Oscuro y sobrio, para matemáticas y documentación técnica: fondo #121212, texto #E6E6E6, datos en gris #BDBDBD, acento ámbar #F2A541 y rejilla #707070.
presentation
deck
Para proyectar: el mismo fondo gris casi negro que technical (#121212), títulos y acentos dorados, gráficos en coral #F4845F y cuerpo brillante.
paper
light
Lienzo blanco con tinta oscura.
dracula, nord, tokyo-night
tokyo
Paletas oscuras de editores conocidos.
solarized-dark, solarized-light
Solarized en sus dos variantes.
gruvbox-dark
gruvbox
Gruvbox oscuro.
catppuccin-mocha, catppuccin-latte
catppuccin, mocha, latte
Catppuccin oscuro y claro.
gaanim
Los colores de la marca: papel #F7F6FF sobre grafito #121212, acento violeta #7C6CFF, títulos en oro #FFC933, gráficos en violeta claro #A99FFF y reglas en bruma #3F37A8.
Los nombres no distinguen mayúsculas. En el stub, Scene(theme=...), Canvas.set_theme y Theme(base) tipan el nombre como ThemeName, un Literal con los doce nombres y los ocho alias de la tabla, así que el editor los autocompleta. Theme.schemes() devuelve solo los nombres canónicos.
PROPIEDADCanvas.themetheme: str | None
Es de solo lectura: para cambiarlo usa set_theme.
Devuelve: str | None — Nombre del tema activo: "technical" en una escena nueva, o None después de Scene(theme=None) o set_theme(None).
MÉTODOTheme.schemesschemes() -> list[str]
Devuelve: list[str] — Los nombres canónicos de los temas incluidos, sin alias.
Cambia solo las familias, sin crear un Theme. Lo omitido conserva su valor anterior. Las familias tienen prioridad sobre el tema activo y siguen vigentes si el tema cambia después; un font explícito en un objeto sigue ganando. Una familia vacía lanza ValueError.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
font
str | None
None
Familia para títulos, cuerpo, subtítulos, encabezados, pies y etiquetas.
math_font
str | None
None
Familia para ecuaciones y fragmentos matemáticos.
code_font
str | None
None
Familia para texto con rol code.
Devuelve: None — Configura el lienzo; no crea objetos.
Ejemplo
from gaanim import Scene
scene =Scene(frame=(16, 9), theme="technical")
scene.canvas.set_fonts(
font="Inter",
math_font="New Computer Modern Math",
code_font="JetBrains Mono",
)
scene.text("Texto y $x^2$", role="body")
scene.text("fn main() {}", role="code").move_to(0, -1)
MÉTODOCanvas.colorcolor(role: str) -> Color
Sirve para que tus propios objetos usen los colores del tema. Sin tema activo, o con un rol desconocido, lanza ValueError.
Resuelve un espaciado del tema activo. Sin tema usa la escala predeterminada: space_xs, space_sm, space_md, space_lg, page_padding, page_padding_wide, page_padding_x, column_gap, vertical_padding, vertical_padding_x y lower_third_offset. Un nombre desconocido lanza ValueError.
Comprueba el contraste de primer plano, título, texto atenuado y panel sobre el fondo, y la tipografía. Es orientativa: no rechaza nada, porque un estado animado puede tener poco contraste a propósito. Sin tema activo lanza ValueError.
Devuelve: list[str] — Advertencias; vacía si las combinaciones principales son legibles.
Ejemplo
warnings = scene.canvas.validate_theme()
if warnings:
raiseValueError("\n".join(warnings))
Los archivos de fuente se leen al crear el tema y se incorporan a la escena, así que la exportación no depende de que estén instalados. Con font_dir, cada cara se resuelve por la familia, el peso y el estilo que declara su archivo: con fonts={"text": "Aleo"}, weight=700 encuentra la negrita. Selectores, tokens, roles o métricas inválidos, una carpeta sin fuentes o una fuente ilegible lanzan ValueError; un archivo o carpeta inexistente, OSError.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
base
ThemeName | Theme | None
None
Tema del que se deriva; solo se sustituye lo que pasas. Sin él, se parte de la paleta de technical con el nombre custom.
name
str | None
None
Nombre del tema nuevo.
colors
dict[str, ColorLike] | None
None
Roles de color y tokens propios para las reglas.
fonts
dict[str, str] | None
None
Familias por rol de fuente. "text" nombra todos los roles de texto y "all" además math y code; un rol nombrado aparte, como "title", conserva su familia.
sizes
dict[str, float] | None
None
Tamaños por rol de texto, en unidades lógicas.
text
dict[TextRole, TextStyle] | None
None
TextStyle por rol, como capa sobre el rol semántico.
styles
dict[str, Style | AxesStyle] | None
None
Reglas por selector (ver abajo).
series
Sequence[ColorLike] | None
None
Colores de serie: el primero colorea los gráficos sin canal color.
heatmap
Sequence[ColorLike] | None
None
Colores continuos de los mapas de calor. Un heatmap cuyo campo color lleva Scale.colors usa los de su escala.
palette
PaletteLike | None
None
Paleta categórica de la escena: colorea las categorías de todos los gráficos, leyendas, tartas y carreras de barras. Una Palette, un nombre ("okabe_ito") o una lista de colores; por defecto, gaanim. Scale.category().colors(...) la sustituye en un campo concreto.
layout
dict[str, float] | None
None
Tokens de espaciado, nuevos o sustituidos.
font_files
dict[str, str] | None
None
Familia → archivo de fuente.
font_dir
str | os.PathLike | None
None
Carpeta cuyos .ttf, .otf, .ttc y .otc se registran (sin subcarpetas).
text_markup
bool | None
None
Con False, * y _ son literales por defecto en scene.text, badge y chip; None hereda el valor de la base.
Devuelve: Theme — Un tema reutilizable para Scene(theme=...) o set_theme.
Los roles de color incluidos son background, foreground, muted, title, accent, chart, panel, header, rule, success, warning, danger y shadow (la sombra de shadow=True en las cajas: negro suave sobre un fondo claro y casi opaco sobre uno oscuro, salvo que el tema elija otro); colors también acepta tokens propios no vacíos para las reglas. Los tokens code, code_keyword, code_string, code_number, code_comment, code_function y code_type eligen los colores con los que scene.text.code resalta el código; sin ellos, los temas de editores usan su esquema y los demás los derivan de la paleta. Los roles de fuente son text, all, title, subtitle, heading, body, caption, label, math y code.
Devuelve: list[str] — Advertencias de contraste y tipografía; vacía si todo es legible.
Reglas por selector
Las claves de styles seleccionan una familia (shape, line, text, glyph para las llaves, axes, plot), el nombre exacto de una fábrica (circle, rounded_rect, arrow), una parte semántica como axes/grid o axes/labels, o una clase propia como .warning, que se asigna con Drawable.style_class. La precedencia es: tema base, familia, tipo exacto o parte semántica, clases en orden, valores del constructor y, por último, los setters del objeto. Las reglas se aplican al compilar, así que cambiar de tema actualiza también los objetos ya creados. La pintura de los recursos importados sigue la de su archivo salvo que la cambies explícitamente.
Trazos de los ejes, la cuadrícula, la cuadrícula secundaria y las marcas.
numbers, labels
TextStyle | None
None
Tipografía de los números y de las etiquetas.
Devuelve: AxesStyle — Una regla para el selector axes.
Mapas de color
ColorMap ofrece 39 mapas canónicos de Matplotlib y 39 de Scientific Colour Maps, incluidos en Gaanim: no hace falta Matplotlib ni ningún archivo externo. Los nombres no distinguen mayúsculas. Las posiciones se normalizan a [0, 1]; los mapas continuos interpolan en sRGB y los categóricos conservan escalones. Un nombre, categoría, posición, alfa o lista de colores inválidos lanzan ValueError. Donde un parámetro acepta ColorMapLike, también vale el nombre como cadena.
Una Palette es una lista ordenada de colores que se reparten entre las categorías por turno: las de un campo color de texto, las porciones de una tarta o las barras de una carrera. La del tema (Theme(palette=...)) colorea toda la escena, y Scale.category().colors(...) la sustituye en un campo concreto. Cuando hay más categorías que colores, la paleta vuelve a empezar y cada vuelta aclara u oscurece un poco sus colores, así que dos categorías nunca comparten color. Donde un parámetro acepta PaletteLike, también vale el nombre de una paleta o una lista de colores.
Incluidas: gaanim (la predeterminada, de diez colores), tableau10, okabe_ito (siete colores distinguibles con daltonismo; sin el negro, que desaparece sobre un fondo oscuro), set2, dark2, paired y los mapas categóricos tab10, tab20, tab20b y tab20c. Los nombres no distinguen mayúsculas.
CLASEPalettePalette(colors: PaletteLike)
Un nombre desconocido o una lista vacía lanzan ValueError.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
colors
Palette | str | Sequence[ColorLike]
obligatorio
Una paleta, el nombre de una incluida o al menos un color.
Número de categorías; sin él, los colores propios de la paleta.
Devuelve: list[Color] — Los colores de las primeras count categorías, con las vueltas incluidas.
MÉTODOPalette.colorcolor(index: int) -> Color
Parámetros
Nombre
Tipo
Predeterminado
Descripción
index
int
obligatorio
Posición de la categoría, desde 0.
Devuelve: Color — Su color; palette[index] hace lo mismo y len(palette) cuenta los colores propios.
MÉTODOPalette.reversedreversed() -> Palette
Devuelve: Palette — Los mismos colores en orden inverso.
MÉTODOPalette.rotaterotate(steps: int) -> Palette
Parámetros
Nombre
Tipo
Predeterminado
Descripción
steps
int
obligatorio
Posiciones que avanza; negativo, hacia atrás.
Devuelve: Palette — Los mismos colores empezando steps más tarde: rotate(1) pone el segundo primero.
Efectos visuales
glow, blur y shadow se aplican a cualquier objeto y funcionan sobre rellenos y trazos, incluidos los gradientes; no_effects() los quita. Están en Drawable y sus versiones animadas en Animaciones.