matplotlib treats paired $...$ in ANY rendered string (titles, subtitles, tick labels, annotations) as mathtext delimiters: the span between the dollars silently renders italic and both dollar signs vanish. "HCOL median $91K vs LCOL $62K" renders as HCOL median 91K vs LCOL 62K with the middle italicized — no warning, no error. This is brutal for financial charts where multi-dollar strings are everywhere.
Rules that prevent it:
- Any string containing 2+
$MUST escape them as\$(in an f-string:\\$). - A single lone
$in a string is safe (unpaired delimiters are left alone). - The corruption is invisible to text-bbox overlap linters — the string still renders, just wrong. Only eyes-on review of the rendered PNG catches it.
Related dpi gotcha from the same render-review loop: OffsetImage(img, zoom=z) sizes images as zoom x image_pixels in POINTS, which scale with figure dpi — a 72px emoji at zoom 0.556 becomes 100px at 180dpi (2.5x intended). To get an image N points tall regardless of dpi use zoom = N / max(img.size).