Сохранить исходные данные изображения при сохранении в PDF - PullRequest
1 голос
/ 19 января 2020

У меня есть графики, которые я аннотирую, используя изображения:

def add_image(axe, filename, position, zoom):
    img = plt.imread(filename)
    off_img = matplotlib.offsetbox.OffsetImage(img, zoom = zoom, resample = False)
    art = matplotlib.offsetbox.AnnotationBbox(off_img, position, xybox = (0, 0),
        xycoords = axe.transAxes, boxcoords = "offset points", frameon = False)
    axe.add_artist(art)

Затем я сохраняю рисунок в некоторый файл PDF, скажем fig.pdf. Я ожидаю, что точное исходное изображение будет встроено в полученный PDF без повторной выборки. Тем не менее, изображение пересэмплируется в соответствии с параметром dpi savefig().

Как заставить matplotlib НЕ повторно сэмплировать изображение (нет смысла делать что для векторного вывода в любом случае)?

Для более подробной информации, вот простой пример, используя это изображение как image.png:

import numpy as np
import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt

def add_image(axe, filename, position, zoom):
    img = plt.imread(filename)
    off_img = matplotlib.offsetbox.OffsetImage(img, zoom = zoom, resample = False)
    art = matplotlib.offsetbox.AnnotationBbox(off_img, position, xybox = (0, 0),
        xycoords = axe.transAxes, boxcoords = "offset points", frameon = False)
    axe.add_artist(art)

# ==========
fig = plt.figure()
axe = plt.axes()
fig.set_size_inches(3, 1.5)
axe.plot(np.arange(10), np.arange(10))

add_image(axe, "image.png", position = (0.2, 0.7), zoom = 0.07)

fig.savefig("temp.pdf", bbox_inches = "tight", pad_inches = 0)

Ожидаемый результат:

expected

Фактический результат:

actual

РЕДАКТИРОВАТЬ: Существует ошибка / особенность вопроса для этого вопроса

1 Ответ

1 голос
/ 21 января 2020

Просто краткое резюме обсуждения в https://github.com/matplotlib/matplotlib/issues/16268:

  • Передача изображения без повторной выборки действительно является желательной функцией, в основном потому, что для векторного вывода , это действительно должно быть до средства визуализации (например, просмотрщик PDF, принтер и т. д. c.), чтобы определить разрешение. упущение.

  • Обходное решение (быстрый взлом) заключается в добавлении следующего кода перед созданием рисунка:

    from matplotlib.backends.backend_mixed import MixedModeRenderer
    
    def _check_unsampled_image(self, renderer):
        if isinstance(renderer, MixedModeRenderer):
            return True
        else:
            return False
    
    matplotlib.image.BboxImage._check_unsampled_image = _check_unsampled_image
    

    Это не предназначено для использования хотя в производственном коде и более надежное решение должно быть реализовано в будущей версии matplotlib. Взносы приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...