Уменьшение размера векторизованного контурного участка

Я хотел бы включить контурный график с заливкой в ​​документ 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)
Другие вопросы по тегам