Презентации, инвестиционные деки и продуктовая аналитика по-прежнему требуют чётких PNG с графиками, которые переживают PowerPoint, Notion и вставки в CMS. Трение возникает не на вопросе «экспортируем ли», а какой стек задаёт истину для пикселей, альфы и цветового намерения. Ниже — матрица доставки 2026 для Matplotlib и Plotly: готовые параметры экспорта (dpi, figsize, transparent, MPLBACKEND, write_image / Kaleido, низкоуровневый PNG через plotly.io.to_image), практика выравнивания под sRGB и дерево каталогов на удалённом Mac mini M4 с гейтами приёмки, которые можно перенести в CI или ночной launchd.
На этой странице
① Матрица решений: Matplotlib и Plotly для PNG
Выбирайте библиотеку по модели управления. Matplotlib подходит командам, которым нужен детерминированный, ревьюируемый в Python стиль. Plotly — когда дашборд уже живёт как объект Figure и нужны те же PNG из JSON без дублирования токенов темы.
| Критерий | Matplotlib | Plotly |
|---|---|---|
| Пакет / сервер без дисплея | Отлично — MPLBACKEND=Agg или matplotlib.use("Agg") до import matplotlib.pyplot |
Отлично — extra kaleido; fig.write_image("out.png") |
| Модель размера | figsize (дюймы) × dpi в savefig ⇒ итоговый холст; bbox_inches="tight" — осторожно с полями для слайдов |
Явные width / height в px и множитель scale (Retina) |
| Прозрачность | transparent=True, facecolor / edgecolor; проверить бахрому антиалиаса на тёмном фоне |
Фон через paper_bgcolor / plot_bgcolor в rgba(0,0,0,0); тест на #000 / #FFF |
| Интерактив vs статика | Статика в приоритете; ближе к печатным спецификациям | Тот же Figure для Dash и PNG; следить за состоянием камеры при программном снимке |
| Типичный риск | Шрифты, fallback начертаний, обрезка подписей при tight bbox | Дрейф версий Kaleido; тяжёлые WebGL-трассы раздувают растр |
② Исполняемые параметры (копипаст)
Фрагменты рассчитаны на macOS или Linux; на удалённом Mac M4 запускайте под тем же пользователем, что и LaunchAgent или оболочка CI, чтобы кэш шрифтов не «холодный».
Matplotlib — бэкенд Agg, dpi, прозрачность
figsize[0] * dpi, если не агрессивно режете поля через tight bbox — после экспорта перепроверьте sips -g pixelWidth или Pillow.
# Оболочка: принудительно неинтерактивный бэкенд для пакета
export MPLBACKEND=Agg
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 5.625), layout="constrained") # ~16:9 в дюймах
ax.plot([0, 1], [0, 1])
fig.savefig(
"out/matplotlib_chart.png",
dpi=300,
transparent=True,
facecolor="none",
edgecolor="none",
bbox_inches="tight",
pad_inches=0.05,
metadata={"Software": "None"}, # по политике: убрать служебные строки генератора
)
dpi: 144–300 для дек; 300+ если текст должен пережить даунскейл в печатный PDF.figsize: дюймы как контракт — одна задокументированная ступеньdpiна бренд-гайд.transparent+facecolor="none": без белого матового фона за легендой.- Альтернатива:
mplcairo, если критичен субпиксельный текст — всё равно валидируйте в целевых вьюверах.
Plotly — Kaleido, write_image и PNG на байтах
У объекта Figure растр пишется через write_image; отдельного write_png нет — укажите format="png" или имя с суффиксом .png. Низкоуровневый путь: import plotly.io as pio и pio.write_image(fig, "out.png", format="png", engine="kaleido") либо bytes = pio.to_image(fig, format="png", engine="kaleido") с последующей записью файла, если оркестратор диктует имя.
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=[0, 1], y=[0, 1]))
fig.update_layout(
template="plotly_white",
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
)
fig.write_image(
"out/plotly_chart.png",
format="png",
width=1920,
height=1080,
scale=2,
engine="kaleido",
)
width/height: явные боксы под мастера слайдов (1920×1080, 3840×2160 и т.д.).scale:1для веба 1x;2для Retina, если даунстрим ждёт удвоенный растр.engine="kaleido": закрепитеkaleidoиplotlyв lockfile — мажорные обновления меняли границы растра.
Мост Pillow (Image.save(..., format="PNG"))
Если композите вывод Matplotlib с логотипами, финальный save с compress_level=6 — только после проверки RGBA и straight alpha. Напрямую PngImagePlugin обычно не нужен: достаточно img.save("out.png") с режимом RGBA при оверлеях.
③ sRGB, ICC и минимальная приёмка для дата-виз
Ни Matplotlib, ни Plotly сами по себе не встраивают «контракт ICC из дизайн-системы», если пайплайн это не добавляет. Для веба и дек зафиксируйте sRGB как общий язык между DS и data science, и докажите его так же, как экспорт из Figma: плашки превью, политика профиля, манифест. Подробности — в чеклисте Mac PNG: sRGB и Display P3 и метаданных ICC и lossless-пережатии; здесь — минимум для графиков.
| Проверка | Действие | Pass |
|---|---|---|
| Цветовое намерение задокументировано | В README: «доставка sRGB» vs «внутри только P3» | Формулировки тикетов согласованы с параметрами дизайн-PNG |
| Нейтральный фон | Подложить PNG на #FFFFFF и #0B0B0B в Safari и Chrome | Без сюрпризов по гамме; сетка и текст в допуске к эталонным hex |
| Прозрачные графики | Масштаб 400% у углов легенды | Без серой бахромы; края альфы как у векторного эталона, где применимо |
| Опционально ICC | Если маркетинг требует встраивание — exiftool / sips по политике после пиксельной QA |
Тег профиля по правилам орг. без сдвига пикселей |
④ Удалённый Mac mini M4: каталоги и чеклист
Вынесите длинные партии графиков на выделенный Apple Silicon, чтобы сон ноутбука, дрожь VPN и локальный дрейф шрифтов не портили ночной экспорт. Дисциплина папок — как у пакетного 4K PNG на удалённом M4:
~/png_jobs/viz_export/inbox/— сюда пишет воркер.~/png_jobs/viz_export/work/— композитинг / водяной знак.~/png_jobs/viz_export/out/ГГГГ-ММ-ДД/— промоут + манифест.~/png_jobs/viz_export/log/export.jsonl— одна JSON-строка на файл: инструмент, версия, dpi или scale, sha256.
Автоматические гейты размеров, байт и retry — по паттернам из пакетной PNG-QA с OpenClaw, даже если начинаете с чистого shell.
| # | Гейт приёмки | Подсказка по инструментам |
|---|---|---|
| 1 | Ширина / высота = спецификации (±0 px) | sips -g pixelWidth -g pixelHeight или Image.open(...).size в Pillow |
| 2 | Размер файла в min/max байт (ловим пустой рендер) | stat -f%z на macOS / пороги в watcher |
| 3 | Нет скрытого даунскейла (дрейф dpi / scale) | Сверка манифеста с версиями из lockfile |
| 4 | Читаемость текста spot-check | Preview 100% + целевой мастер слайда |
| 5 | Повторяемость | Повторный экспорт того же коммита → тот же sha256 (при закреплённых шрифтах) |
⑤ Итог
Путь Agg + savefig в Matplotlib и Kaleido + write_image в Plotly дают отличные PNG, если заморозить бэкенды и версии и выразить размер либо как дюймы × dpi, либо как пиксели × scale, без двусмысленности. Сочетайте экспорт с малой sRGB-плашкой QA, проверкой прозрачной альфы и датированным out/ на удалённом Mac M4, чтобы handoff дата-виза наследовал ту же строгость, что и маркетинговые PNG.
Дальше: аренда удалённого Mac M4 под пакет графиков
Откройте главную MacPng для контекста сценариев, затем аренду и покупку и тарифы и узлы — вход в аккаунт не требуется, чтобы сравнить пакеты. После выбора узла следуйте инструкции SSH / VNC, скопируйте дерево каталогов выше и планируйте задачи Matplotlib или Plotly на ночь, пока ноутбук закрыт. Остальные матрицы доставки дизайна — в разделе Технические идеи.
Matplotlib / Plotly на удалённом Mac
Держите задачи Kaleido и Agg на стабильном хосте, закрепляйте шрифты и версии, в прод промоутьте только PNG с подписанным манифестом — для ночных дек, регламентированных отчётов и массовых снимков дашбордов.