Растеризация контуров в заполненном контурном графике
У меня есть заполненный контурный график, который я хочу сохранить в виде файла.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)