Шрифты 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

  • Анимированная 3d диаграмма рассеяния в matplotlib
  • Делать более длинные метки подзаголовка в matplotlib?
  • Как сопоставить номер с цветом с помощью шаблона matplotlib?
  • Как построить линию (многоугольная цепь) с numpy / scipy / matplotlib с минимальным сглаживанием
  • как удалить избыточное время даты, когда ось x является недержанием pandas DatetimeIndex
  • Диаграмма двойного пончика в matplotlib
  • matplotlib: как обновить figure.canvas
  • matplotlib: расширенная линия над двумя контрольными точками
  •  
    Interesting Posts for Van-Lav

    Любые причины не использовать SQLObject для SQLAlchemy?

    Снять () нельзя интерпретировать?

    Django 1.7.1: детская модель, удалите все ссылки на родительскую модель и сделайте дочернюю модель наследованием от дедушки вместо

    Python OpenCv, только чтение части изображения

    Python unittest: как запустить только часть тестового файла?

    как переместить все эти вложения в автономный файл

    Многопроцессорное взаимодействие с блоками контекста fork для Linux / Intel Xeon с Python 3.6.1?

    Pandas: флаг последовательных значений

    Преобразование Pandas DataFrame в оранжевую таблицу

    Python обрабатывает переменную как литерал / необработанную строку

    pyserial – Как прочитать последнюю строку, отправленную с последовательного устройства

    Дендрограмма, созданная с помощью настройки scipy-cluster

    OSError – Errno 13 Разрешение отклонено

    Python: Импорт модуля

    Ошибка opencv: размеры входных аргументов не совпадают

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