Растеризация контуров в заполненном контурном графике

У меня есть заполненный контурный график, который я хочу сохранить в виде файла.svg или.pdf. Ниже приведен упрощенный пример. Я хочу растеризовать сам контурный контур (красочную часть!), Сохранив все остальное (все оси, метки и т. Д.) Как векторную графику.

import numpy as np
import matplotlib.pylab as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.linspace(0, 2*np.pi, 100)
xi, yi = np.meshgrid(x, y)
zi = np.cos(xi)**2 + np.sin(yi)**2

plt.figure()
plt.contourf(xi, yi, zi, rasterized=True)
plt.savefig('fig.svg', dpi=100)

Выход

Однако, когда я проверяю fig.svg или открываю его для редактирования в Inkscape (я могу разгруппировать заполненный контур в векторные фигуры), становится ясно, что растеризация не сработала!

Это хорошо для такого простого графика, но если мой график имеет большее количество уровней контура (ниже), векторное изображение будет нуждаться в большом количестве кривых, а размер файла будет намного больше.

plt.close()
plt.figure()
plt.contourf(xi, yi, zi, 100, rasterized=True)
plt.savefig('fig.svg', dpi=100)

введите описание изображения здесь

Может кто-нибудь предложить решение и объяснить, почему это rasterized=True Флаг не сделал то, что мне нужно?

1 ответ

Решение

Я только что обнаружил, что это дубликат этого вопроса.

С помощью rasterized=True в качестве аргумента contour или же contourf должен показать

UserWarning: Следующие kwargs не были использованы контуром: 'rasterized'

Чтобы растеризовать контурный график, вам необходимо растеризовать его отдельные части, т.е.

cs = plt.contour(...) 
for c in cs.collections:
    c.set_rasterized(True)

Пример из вопроса, следовательно, будет выглядеть

import numpy as np
import matplotlib.pylab as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.linspace(0, 2*np.pi, 100)
xi, yi = np.meshgrid(x, y)
zi = np.cos(xi)**2 + np.sin(yi)**2

plt.figure()
cs = plt.contourf(xi, yi, zi)

for c in cs.collections:
    c.set_rasterized(True)

plt.savefig('fig.svg', dpi=100)
Другие вопросы по тегам