2012-10-30 33 views
9

Tôi đang cố gắng sử dụng biểu đồ Matplotlib như một phần của bài nộp sẵn sàng cho máy ảnh và nhà xuất bản chỉ yêu cầu sử dụng phông chữ Loại 1 .Phông chữ loại 1 có biểu đồ nhật ký

Tôi nhận thấy rằng phụ trợ PDF vui vẻ xuất các phông chữ Type-1 cho các đồ thị đơn giản với trục Y tuyến tính, nhưng đầu ra phông chữ Type-3 cho các trục Y lôgarit .

Sử dụng thuật ngữ lôgarit phát sinh việc sử dụng mathtext, có vẻ như là sử dụng phông chữ Loại 3, có lẽ do sử dụng mặc định số mũ ký hiệu. Tôi có thể sử dụng hack xấu xí để giải quyết vấn đề này - sử dụng pyplot.yticks() để buộc các dấu trục không sử dụng số mũ - nhưng điều này sẽ yêu cầu di chuyển vùng ô để chứa các nhãn lớn (như 10^6) hoặc viết các trục như 10, 100, 1K, v.v. để chúng phù hợp.

Tôi đã thử nghiệm ví dụ dưới đây với matplotlib chi nhánh tổng thể như của ngày hôm nay, cũng như 1.1.1, trong đó sản xuất hành vi tương tự, vì vậy tôi không biết rằng đây là một lỗi, có lẽ chỉ hành vi bất ngờ.

#!/usr/bin/env python 
# Simple program to test for type 1 fonts. 
# Generate a line graph w/linear and log Y axes. 

from matplotlib import rc, rcParams 

rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']}) 
#rc('font',**{'family':'sans-serif','sans-serif':['computer modern sans serif']}) 

# These lines are needed to get type-1 results: 
# http://nerdjusttyped.blogspot.com/2010/07/type-1-fonts-and-matplotlib-figures.html 
rcParams['ps.useafm'] = True 
rcParams['pdf.use14corefonts'] = True 
rcParams['text.usetex'] = False 

import matplotlib.pyplot as plt 

YSCALES = ['linear', 'log'] 

def plot(filename, yscale): 
    plt.figure(1) 
    xvals = range(1, 2) 
    yvals = xvals 
    plt.plot(xvals, yvals) 
    plt.yscale(yscale) 
    plt.savefig(filename + '.pdf') 

if __name__ == '__main__': 
    for yscale in YSCALES: 
     plot('linegraph-' + yscale, yscale) 

Có ai biết cách sạch để nhận phông chữ loại 1 bằng trục đăng nhập không?

Cảm ơn!

+0

Chỉ cần cho nhận thức, điều này cũng đã được đăng trên danh sách gửi thư của người dùng mpl: http://matplotlib.1069221.n5.nabble.com/Type-1-fonts-with-log-graphs-tt39606.html – pelson

+0

S các tài liệu tham khảo hữu ích (không có câu trả lời cho câu hỏi này trong chúng): http://matplotlib.1069221.n5.nabble.com/Type-1-font-in-figures-needed-td10294.html & http: //nerdjusttyped.blogspot .co.uk/2010/07/type-1-fonts-and-matplotlib-figures.html – pelson

Trả lời

6

Đây là mã tôi sử dụng cho bản đệ trình camera đã sẵn sàng:

from matplotlib import pyplot as plt 

def SetPlotRC(): 
    #If fonttype = 1 doesn't work with LaTeX, try fonttype 42. 
    plt.rc('pdf',fonttype = 1) 
    plt.rc('ps',fonttype = 1) 

def ApplyFont(ax): 

    ticks = ax.get_xticklabels() + ax.get_yticklabels() 

    text_size = 14.0 

    for t in ticks: 
     t.set_fontname('Times New Roman') 
     t.set_fontsize(text_size) 

    txt = ax.get_xlabel() 
    txt_obj = ax.set_xlabel(txt) 
    txt_obj.set_fontname('Times New Roman') 
    txt_obj.set_fontsize(text_size) 

    txt = ax.get_ylabel() 
    txt_obj = ax.set_ylabel(txt) 
    txt_obj.set_fontname('Times New Roman') 
    txt_obj.set_fontsize(text_size) 

    txt = ax.get_title() 
    txt_obj = ax.set_title(txt) 
    txt_obj.set_fontname('Times New Roman') 
    txt_obj.set_fontsize(text_size) 

Các phông chữ sẽ không xuất hiện cho đến khi bạn chạy savefig

Ví dụ:

import numpy as np 

SetPlotRC() 

t = np.arange(0, 2*np.pi, 0.01) 
y = np.sin(t) 

plt.plot(t,y) 
plt.xlabel("Time") 
plt.ylabel("Signal") 
plt.title("Sine Wave") 

ApplyFont(plt.gca()) 
plt.savefig("sine.pdf") 
+1

Tôi vừa thử nó với trục log. Nó dường như làm việc cho tôi. Xin lỗi câu trả lời này quá muộn. Hy vọng bài nộp của bạn đã tốt! Tôi cũng đã ở đó. – DrRobotNinja

4

Các phương pháp ưa thích để lấy phông chữ Type 1 thông qua matplotlib có vẻ là sử dụng TeX để sắp chữ. Làm như vậy dẫn đến kết quả là tất cả các trục là sắp chữ trong phông chữ toán mặc định, thường không mong muốn nhưng có thể tránh được bằng cách sử dụng lệnh TeX.

câu chuyện dài ngắn, tôi thấy giải pháp này:

import matplotlib.pyplot as mp 
import numpy as np 

mp.rcParams['text.usetex'] = True #Let TeX do the typsetting 
mp.rcParams['text.latex.preamble'] = [r'\usepackage{sansmath}', r'\sansmath'] #Force sans-serif math mode (for axes labels) 
mp.rcParams['font.family'] = 'sans-serif' # ... for regular text 
mp.rcParams['font.sans-serif'] = 'Helvetica, Avant Garde, Computer Modern Sans serif' # Choose a nice font here 

fig = mp.figure() 
dim = [0.1, 0.1, 0.8, 0.8] 

ax = fig.add_axes(dim) 
ax.text(0.001, 0.1, 'Sample Text') 
ax.set_xlim(10**-4, 10**0) 
ax.set_ylim(10**-2, 10**2) 
ax.set_xscale("log") 
ax.set_yscale("log") 
ax.set_xlabel('$\mu_0$ (mA)') 
ax.set_ylabel('R (m)') 
t = np.arange(10**-4, 10**0, 10**-4) 
y = 10*t 

mp.plot(t,y) 

mp.savefig('tmp.png', dpi=300) 

Sau đó, kết quả trong này resulting image

Lấy cảm hứng từ: https://stackoverflow.com/a/20709149/4189024http://wiki.scipy.org/Cookbook/Matplotlib/UsingTex

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