Matplotlib неправильно отображает градиент под кривой при прямом сохранении - PullRequest
1 голос
/ 31 мая 2019

Я использую некоторый пример кода, полученный из: https://stackoverflow.com/a/29331211/9469766

Я пытаюсь сохранить в формате PDF, но всякий раз, когда я делаю, цвета градиента форматируются неправильно.Но если я просто показываю вместо сохранения или сохранения файла как .png, градиенты отображаются правильно.Что заставляет меня верить, что проблема в формате .pdf.Есть ли конкретные параметры, которые мне нужно установить при сохранении в формате PDF?

Ожидаемый вывод изображения: Expected Image Output

Фактический вывод изображения Actual Image Output

Мой код:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib.patches import Polygon
np.random.seed(1977)
import os

def main():
    home_dir = os.path.expanduser('~/Desktop/test2.pdf')
    x, y = generate_data(100)
    for _ in range(5):
        gradient_fill(*generate_data(100))
    # plt.show()
    plt.savefig(home_dir, rasterized = True, dpi=300)
    plt.close()

def generate_data(num):
    x = np.linspace(0, 100, num)
    y = np.random.normal(0, 1, num).cumsum()
    return x, y

def gradient_fill(x, y, fill_color=None, ax=None, **kwargs):
    """
    """
    if ax is None:
        ax = plt.gca()

    line, = ax.plot(x, y, **kwargs)
    if fill_color is None:
        fill_color = line.get_color()

    zorder = line.get_zorder()
    alpha = line.get_alpha()
    alpha = 1.0 if alpha is None else alpha

    z = np.empty((100, 1, 4), dtype=float)
    rgb = mcolors.colorConverter.to_rgb(fill_color)
    z[:,:,:3] = rgb
    z[:,:,-1] = np.linspace(0, alpha, 100)[:,None]

    xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max()
    im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax],
                   origin='lower', zorder=zorder)

    xy = np.column_stack([x, y])
    xy = np.vstack([[xmin, ymin], xy, [xmax, ymin], [xmin, ymin]])
    clip_path = Polygon(xy, facecolor='none', edgecolor='none', closed=True)
    ax.add_patch(clip_path)
    im.set_clip_path(clip_path)

    ax.autoscale(True)
    return line, im

main()

1 Ответ

0 голосов
/ 01 июня 2019

Проблема такая же, как в https://github.com/matplotlib/matplotlib/issues/7151.

Решение состоит в том, чтобы использовать параметр "image.composite_image" rc и установить его в False.

plt.rcParams["image.composite_image"] =False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...