Уменьшение размера векторизованного контурного участка
Я хотел бы включить контурный график с заливкой в документ PDF (например, документ TeX). В настоящее время я использую pyplot
s contourf
и сохранение в pdf
с pyplot
s savefig
, Проблема в том, что размер графиков становится довольно большим по сравнению с высоким разрешением png
,
Один из способов уменьшить размер - это, конечно, уменьшить количество уровней на графике, но слишком мало уровней дает плохой график. Я ищу простой способ, например, чтобы цвета графика сохранялись в виде png, а оси, галочки и т. Д. Сохранялись векторизованными.
1 ответ
Вы можете сделать это с помощью Axes
вариант set_rasterization_zorder
,
Что-нибудь с zorder
меньше установленного значения будет сохранено как растровая графика, даже при сохранении в векторный формат, например pdf
,
Например:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(500,500)
# fig1 will save the contourf as a vector
fig1,ax1 = plt.subplots(1)
ax1.contourf(data)
fig1.savefig('vector.pdf')
# fig2 will save the contourf as a raster
fig2,ax2 = plt.subplots(1)
ax2.contourf(data,zorder=-20)
ax2.set_rasterization_zorder(-10)
fig2.savefig('raster.pdf')
# Show the difference in file size. "os.stat().st_size" gives the file size in bytes.
print os.stat('vector.pdf').st_size
# 15998481
print os.stat('raster.pdf').st_size
# 1186334
Вы можете увидеть этот пример matplotlib для получения дополнительной информации.
Как отмечает @tcaswell, растеризация только одного художника без необходимости zorder
, ты можешь использовать .set_rasterized
, Тем не менее, это не похоже на вариант с contourf
так что вам нужно будет перебрать PathCollections
создано contourf
а также set_rasterized
на каждом из них. Что-то вроде этого:
contours = ax.contourf(data)
for pathcoll in contours.collections:
pathcoll.set_rasterized(True)