2026 Матрица доставки визуализации данных: Matplotlib и Plotly — экспорт PNG, DPI, sRGB и пакетная приёмка на удалённом M4

Презентации, инвестиционные деки и продуктовая аналитика по-прежнему требуют чётких 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 на ночь, пока ноутбук закрыт. Остальные матрицы доставки дизайна — в разделе Технические идеи.

Пакетный узел Apple Silicon

Matplotlib / Plotly на удалённом Mac

Держите задачи Kaleido и Agg на стабильном хосте, закрепляйте шрифты и версии, в прод промоутьте только PNG с подписанным манифестом — для ночных дек, регламентированных отчётов и массовых снимков дашбордов.

Главная Арендовать сейчас Тарифы и узлы Помощь и настройка
Удалённый Mac M4 · PNG графиков Пакет Matplotlib и Plotly
Арендовать