2012-04-06 26 views
6

Tôi thường sử dụng ax.set_rasterized(True) để rasterize hình để nó có thể xử lý minh bạch khi lưu ở định dạng eps, nhưng rasterization cũng làm mờ nhãn trục và ticklabels, do đó, có cách để rasterize chỉ các bản vá lỗi trong trục chứ không phải là toàn bộ nhân vật? hoặc là có một tốt hơn xung quanh cho xuất khẩu định dạng eps với minh bạch? Cảm ơn.Làm thế nào để rasterize tốt hơn một cốt truyện mà không làm mờ các nhãn trong matplotlib?

+1

Tôi vừa phát hiện ra set_zorder và set_rasterization_zorder, tôi nghĩ chúng sẽ hữu ích, nhưng vẫn đào các tài liệu, vẫn còn bất kỳ trợ giúp nào được đánh giá cao. – nye17

+0

Bạn không thể sử dụng 'pdf'? Nó sẽ bảo toàn độ trong suốt mà không bị rasterisation. – Avaris

+0

@Avaris tiếc là tôi không thể sử dụng pdf, nhưng phải dính với eps, do đó, rasterization dường như là cách duy nhất ra ngoài. – nye17

Trả lời

7

Vì matplotlib Artists có thể được rasterized, bất kỳ lớp nào bắt nguồn từ Artist (http://matplotlib.sourceforge.net/api/artist_api.html) có thể được rasterized với từ khóa rasterized đặt thành True. Vì vậy, bạn chỉ có thể rasterize các bản vá lỗi của bạn.

Tôi vừa thử một số kết hợp và có vẻ như nó hoạt động. Tuy nhiên chất lượng dường như không tốt lắm (xem thêm http://www.mail-archive.com/[email protected]/msg13276.html).

import numpy as np 
import matplotlib.pyplot as plt 


def add_patch(ax, **kwargs): 
    if 'rasterized' in kwargs and kwargs['rasterized']: 
     ax.set_rasterization_zorder(0) 
    ax.fill_between(np.arange(1, 10), 1, 2, zorder=-1, **kwargs) 
    ax.set_xlim(0, 10) 
    ax.set_ylim(0, 3) 
    if 'alpha' in kwargs and kwargs['alpha'] < 1: 
     txt = 'This patch is transparent!' 
    else: 
     txt = 'This patch is not transparent!' 
    ax.text(5, 1.5, txt, ha='center', va='center', fontsize=25, zorder=-2, 
      rasterized=True) 

fig, axes = plt.subplots(nrows=4, sharex=True) 
add_patch(axes[0], alpha=0.2, rasterized=False) 
add_patch(axes[1], alpha=0.2, rasterized=True) 
add_patch(axes[2], rasterized=False) 
add_patch(axes[3], rasterized=True) 

plt.tight_layout() 
plt.savefig('rasterized_transparency.eps') 

tôi chuyển đổi eps để png để hiển thị nó trong trình duyệt:

rasterized_transparency.png

Xem thêm: How to save figures to pdf as raster images in matplotlib.

+0

Cảm ơn, tôi sẽ thử ví dụ của bạn và thử nghiệm mã ASAP của riêng tôi. Câu trả lời sẽ được chấp nhận bởi sau đó ;-). – nye17

2

Kết quả tốt hơn nếu bạn chỉ định dpi - dường như mặc định là giá trị khá thấp. Ví dụ: thay đổi dòng cuối cùng thành

plt.savefig('rasterized_transparency.eps',dpi=200) 

và tệp tăng lên 4.5M và có vẻ tốt trong Acrobat lên tới 200% độ phóng đại. Tuy nhiên, tôi đồng ý rằng có thể có nhiều định dạng nhỏ gọn hơn hỗ trợ tính minh bạch.

Các vấn đề liên quan