2016-05-04 2 views
0

Я хотел бы включить заполненный контур в pdf-документ (например, документ TeX). В настоящее время я использую pyplot с contourf и сэкономил до pdf с pyplot s savefig. Проблема в том, что размер графиков становится довольно большим по сравнению с высоким разрешением png.Уменьшение размера векторизованного контурного плана

Один из способов уменьшить размер - это, конечно, уменьшить количество уровней на графике, но слишком мало уровней дает плохой сюжет. Я ищу простой способ, например, сохранить цвета сюжета в виде png, чтобы оси, тики и т. Д. Сохранялись векторизованными.

+0

Можно ли увидеть типичный участок? Вы играли с параметром nchunk? –

+0

Пример, приведенный @tom, дает типичный сюжет. Я не играл с параметром nchunck, но для моих целей выбранный ответ был достаточным. Лучший –

ответ

5

Вы можете сделать это, используя опцию Axesset_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 

Вы можете увидеть this matplotlib example для получения более подробной информации.


Как отметил @tcaswell, чтобы rasterise только один художник, не влиять на его zorder, вы можете использовать .set_rasterized. Однако это не похоже на вариант с contourf, поэтому вам нужно будет перебрать PathCollections, созданный contourf и set_rasterized на каждом из них. Что-то вроде этого:

contours = ax.contourf(data) 
for pathcoll in contours.collections: 
    pathcoll.set_rasterized(True) 
+0

Отличный ответ, спасибо: D. Для тех, кто задается вопросом: сначала рисуются художники с более низким 'zorder', а художники с более низким значением, чем указано в' set_rasterization_zorder', будут растрированы. –

+0

Вы также можете использовать 'set_rasterized' для исполнителя, чтобы растрировать его независимо от zorder. – tacaswell

+1

@tcaswell: да, но не у всех артистов есть этот вариант. 'contourf' возвращает экземпляр' matplotlib.contour.QuadContourSet', который не имеет опции 'set_rasterized'. Вы можете зацикливаться на 'PathCollections', который он создает в' ax.collections', и использовать 'set_rasterized' для каждого из них, но я нашел, что использование' set_rasterization_zorder' имеет тенденцию быть более простым вариантом. – tom

Смежные вопросы