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

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

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

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