2010-05-09 31 views
14

Tôi muốn tạo sơ đồ chất lượng cao cho bản trình bày. Tôi đang sử dụng matplotlib của Python để tạo đồ họa. Thật không may, việc xuất PDF dường như bỏ qua cài đặt phông chữ của tôi.Xuất PDF Matplotlib sử dụng phông chữ sai

Tôi đã thử đặt phông chữ bằng cách chuyển một đối tượng FontProperties đến các chức năng vẽ văn bản và bằng cách đặt tùy chọn trên toàn cầu. Đối với hồ sơ, đây là một MWe để tạo lại vấn đề:

import scipy 
import matplotlib 
matplotlib.use('cairo') 
import matplotlib.pylab as pylab 
import matplotlib.font_manager as fm 

data = scipy.arange(5) 

for font in ['Helvetica', 'Gill Sans']: 
    fig = pylab.figure() 
    ax = fig.add_subplot(111) 
    ax.bar(data, data) 
    ax.set_xticks(data) 
    ax.set_xticklabels(data, fontproperties = fm.FontProperties(family = font)) 
    pylab.savefig('foo-%s.pdf' % font) 

Trong cả hai trường hợp, sản lượng sản xuất là giống hệt nhau và sử dụng Helvetica (và vâng, tôi làm đã cả các phông chữ được cài đặt).

Chỉ cần chắc chắn, sau đây không giúp được gì:

matplotlib.rc('font', family = 'Gill Sans') 

Cuối cùng, nếu tôi thay thế các phụ trợ, thay vì sử dụng trình xem bản địa:

matplotlib.use('MacOSX') 

tôi làm get phông chữ chính xác được hiển thị - nhưng chỉ trong giao diện người xem. Đầu ra PDF lại một lần nữa sai.

Để chắc chắn - tôi thể thiết lập phông chữ khác - nhưng chỉ các lớp khác của gia đình phông chữ: Tôi có thể thiết lập serif phông chữ hoặc fantasy hoặc monospace. Nhưng tất cả các phông chữ sans-serif dường như mặc định với Helvetica.

Trả lời

3

Đối số "gia đình" và thông số rc tương ứng không có nghĩa là chỉ định tên của phông chữ thực sự có thể được sử dụng theo cách này. Có một hệ thống lựa chọn phông chữ giống như CSS (được cho là baroque) giúp cùng một tập lệnh hoạt động trên các máy tính khác nhau, chọn phông chữ gần nhất có sẵn. Cách thường được khuyến nghị sử dụng, ví dụ: Gill Sans sẽ thêm nó vào trước giá trị của tham số rc font.sans-serif (xem sample rc file), sau đó đặt font.family thành sans-serif.

Điều này có thể gây phiền toái nếu trình quản lý phông chữ quyết định một số lý do không rõ ràng rằng Gill Sans không phải là đối sánh gần nhất với đặc điểm kỹ thuật của bạn. Cách bỏ qua logic chọn phông chữ là sử dụng FontProperties(fname='/path/to/font.ttf') (docstring). Trong trường hợp của bạn, tôi nghi ngờ rằng chương trình phụ trợ MacOSX sử dụng phông chữ thông qua cơ chế của hệ điều hành và tự động hỗ trợ tất cả các loại phông chữ, nhưng chương trình phụ trợ pdf có mã hỗ trợ phông chữ riêng không hỗ trợ phiên bản Gill Sans của bạn .

+0

Bạn đã nói, "Đối số" gia đình "[không] có nghĩa là chỉ định tên của phông chữ" - xin lỗi nhưng [tài liệu] (http://matplotlib.sourceforge.net/api/font_manager_api.html# matplotlib.font_manager.FontProperties) nói khác: “Các mục ** có thể ** bao gồm tên họ phông chữ chung […]. ** Trong trường hợp đó **, phông chữ thực tế được sử dụng sẽ được tra cứu… ”(nhấn mạnh của tôi). Hơn nữa, * nó hoạt động * trong GUI. Dù sao, tôi sẽ thử các giải pháp được đề xuất của bạn. Cảm ơn. –

+1

Bằng cách sử dụng 'fname =…', tôi nhận được một dòng chữ TrueError "TrueType" bị thiếu bảng "trong dòng 776 của backend_pdf.py, trong' embedTTFType3' khi gọi 'savefig'. Tôi không ở nhà với TTF và PDF nhưng tôi * đã * nhúng Gill Sans vào các tệp PDF thông qua các tuyến đường khác, vì vậy tôi không chắc chắn điều gì ở đây không ổn. –

+0

Bạn đang đúng về việc sử dụng tên phông chữ thực tế làm đối số gia đình. Thông báo lỗi giống như một lỗi. Vui lòng gửi nó tại trình theo dõi Sourceforge, đề cập đến phông chữ chính xác, phiên bản matplotlib và truy xuất đầy đủ. –

8

Về cơ bản, @ Jouni là câu trả lời đúng nhưng kể từ khi tôi vẫn còn có một số rắc rối khi muốn làm việc, đây là giải pháp cuối cùng của tôi:

#!/usr/bin/env python2.6 

import scipy 
import matplotlib 
matplotlib.use('cairo') 
import matplotlib.pylab as pylab 
import matplotlib.font_manager as fm 

font = fm.FontProperties(
     family = 'Gill Sans', fname = '/Library/Fonts/GillSans.ttc') 

data = scipy.arange(5) 
fig = pylab.figure() 
ax = fig.add_subplot(111) 
ax.bar(data, data) 
ax.set_yticklabels(ax.get_yticks(), fontproperties = font) 
ax.set_xticklabels(ax.get_xticks(), fontproperties = font) 
pylab.savefig('foo.pdf') 

ý rằng phông chữ phải được thiết lập một cách rõ ràng cách sử dụng phím fontproperties. Rõ ràng, không có cài đặt rc cho thuộc tính fname (ít nhất là tôi không tìm thấy nó).

Cho một phím family trong quá trình khởi tạo font là không cần thiết ở đây, nó sẽ bị bỏ qua bởi chương trình phụ trợ PDF.

Mã này chỉ hoạt động với phụ trợ cairo. Sử dụng MacOSX sẽ không hoạt động.

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