2015-05-04 4 views
2

Я использую matplotlib для создания графиков. В большинстве случаев он работает так, как предполагается. Но если я использую TeX как текст в тиках, он ведет себя иначе, чем текст в других меток или аннотаций. Я установил rc.text.usetex = False, и ярлыки экспортируются в виде исходного текста, но текст тиков интерпретируется. В случае логарифмических графиков или если используются другие команды TeX, такие как \ frac, это приводит к простым числам, которые перемещаются в их позиции (например, надстрочный или дробный).Как экспортировать сырые строки для текста в тиках на svg из matplotlib?

Я использую следующую функцию для экспорта графики svg с необработанными строками. Впоследствии я использую Inkscape для работы над деталями и экспортирую его как PDF и TeX, поэтому весь текст помещается в графику с помощью команды put.

def export_svg(plt=plt,svg_name='name'): 
    plt.rc('text', usetex=False) 
    plt.rc('text.latex', unicode = False) 
    plt.rc('svg',fonttype = 'none') 
    for blub in plt.findobj(match=plt.Text): 
     blub.set_text(blub.get_text().replace('$','\$')) 
    plt.savefig(svg_name + '.svg') 

axes.xaxis.get_ticklabels()[2].get_text() дает '$10^{1}$'

axes.xaxis.get_label().get_text() дает '\\$ x \\$'. Он становится '\$ x \$' в файле svg и является именно тем форматом, который мне нужен.

Кому-то еще удалось решить эту проблему? Я думаю, что я должен начать с класса Formatter, чтобы получить обратную косую черту, которая отсутствует в тике.

Благодаря

Марк

ответ

0

Прежде всего, это происходит не только в случае loglog. Тики всегда экспортируются без \$ .. \$.

Мой обходной путь, чтобы создать свой собственный класс Formatter:

import matplotlib.pyplot as plt 

class MyLogFormatterMathtext(plt.LogFormatter): 
""" 
Format values for log axis; using ``exponent = log_base(value)`` 
mark_r: 
removed \mathdefault 
escaped $ with \ 
""" 

def __call__(self, x, pos=None): 
    'Return the format for tick val *x* at position *pos*' 
    b = self._base 
    usetex = rcParams['text.usetex'] 

    # only label the decades 
    if x == 0: 
     if usetex: 
      return '$0$' 
     else: 
      return '\$0\$' #'$\mathdefault{0}$' 

    fx = math.log(abs(x))/math.log(b) 
    is_decade = is_close_to_int(fx) 

    sign_string = '-' if x < 0 else '' 

    # use string formatting of the base if it is not an integer 
    if b % 1 == 0.0: 
     base = '%d' % b 
    else: 
     base = '%s' % b 

    if not is_decade and self.labelOnlyBase: 
     return '' 
    elif not is_decade: 
     if usetex: 
      return (r'\$%s%s^{%.2f}\$') % \ 
             (sign_string, base, fx) 
     else: 
      return (r'\$%s%s^{%.2f}\$') % \ 
             (sign_string, base, fx) 
    else: 
     if usetex: 
      return (r'\$%s%s^{%d}\$') % (sign_string, 
             base, 
             nearest_long(fx)) 
     else: 
      return (r'\$%s%s^{%d}\$') % (sign_string, 
                base, 
                nearest_long(fx)) 

отредактированные оба случая usetex==True и usetex==False, потому что вторая одна не дала желаемого результата. Мне кажется, что текст в ярлыках обрабатывается по-разному по сравнению с текстом в тиках. Поэтому я должен использовать стандарт LogFormatterMathtext, если usetex==True, чтобы создать «знакомый вид». Для экспорта в формат SVG я использую:

majorFormatter = MyLogFormatterMathtext() 
axes.xaxis.set_major_formatter(majorFormatter) 

Я предпочел бы более общее решение, но это один работает как импровизированные. Не стесняйтесь задавать вопросы или комментировать это решение.