Шрифты Type 1 с лог-диаграммами

Я пытаюсь использовать графики Matplotlib как часть готового к отправке камеры, и издательство требует использования шрифтов Type 1 только.

Я обнаружил, что бэкэнд PDF с радостью выводит шрифты Type-1 для простых графиков с линейными Y-осями, но выводит шрифты Type-3 для логарифмических Y-осей.

Использование логарифмического yscale приводит к использованию математического текста, который, по-видимому, использует шрифты Type 3, предположительно из-за использования экспоненциальной нотации по умолчанию. Я могу использовать уродливый хак, чтобы обойти это – используя pyplot.yticks (), чтобы заставить тики оси не использовать экспоненты, – но для этого потребуется переместить область сюжета для размещения больших меток (например, 10 ^ 6) или записать оси как 10, 100, 1K и т. Д., Чтобы они соответствовали друг другу.

Я тестировал приведенный ниже пример с ведущей ветвью matplotlib на сегодняшний день, а также с 1.1.1, которая производит такое же поведение, поэтому я не знаю, что это ошибка, возможно, просто неожиданное поведение.

#!/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) 

Кто-нибудь знает, как можно получить шрифты Type 1 с осями журнала?

Благодаря!

2 Solutions collect form web for “Шрифты Type 1 с лог-диаграммами”

Это код, который я использую для готовых камер:

 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) 

Шрифты не появятся, пока вы не запустите savefig

Пример:

 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") 

Предпочтительным способом получения шрифтов Type 1 с помощью matplotlib является использование TeX для набора текста. Это приводит к тому, что вся ось будет набираться в шрифте по умолчанию, который обычно нежелателен, но этого можно избежать с помощью TeX-команд.

Короче говоря, я нашел это решение:

 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) 

Тогда результат в этом итоговое изображение

Вдохновленный: https://stackoverflow.com/a/20709149/4189024 и http://wiki.scipy.org/Cookbook/Matplotlib/UsingTex

Interesting Posts

Matplotlib: добавьте ось двойного y без использования его значений на графиках

Регулярные выражения, но для записи в матче

Что такое Pythonic для реализации простого FSM?

Переопределить атрибуты по умолчанию формы Django

k-means в python: Определите, какие данные связаны с каждым центроидом

Преобразование строк в float в DataFrame

скрипт, который добавляет пакеты для импорта sys.path как ожидалось при запуске с ipython, но генерирует исключение, когда скрипт запускается из python

Как использовать cherrypy в качестве веб-сервера для статических файлов?

Как обновить Pandas от Anaconda и можно ли использовать eclipse с этим последним?

Python: проблема с перегруженными конструкторами

pandas: сопоставить несколько столбцов с одним столбцом

использовать «pip install / uninstall» внутри скрипта python

В Python, почему не работает импорт в exec в функции?

Удалить дубликаты подписчиков из списка

как перенаправить полный вывод скрипта

Python - лучший язык программирования в мире.