2017-02-15 5 views
6

Я обновил Анаконда Python до последней версии (4.3), где они модернизированной Matplotlib до версии 2.Matplotlib 2 несовместимым шрифт

Обновления сделали некоторые существенные изменения в стиль по умолчанию (see here). И, хотя мне действительно нравятся некоторые из этих изменений, я не согласен с некоторыми из них.

Поэтому я сделал некоторые изменения, как это было предложено в приведенной выше ссылке:

#%matplotlib inline 
#%config InlineBackend.figure_format = 'svg' 
import scipy as sc 
import matplotlib.pyplot as plt 
import matplotlib 

# http://matplotlib.org/users/dflt_style_changes.html 
params = {'legend.fontsize': 18, 
      'axes.labelsize': 18, 
      'axes.titlesize': 18, 
      'xtick.labelsize' :12, 
      'ytick.labelsize': 12, 
      'mathtext.fontset': 'cm', 
      'mathtext.rm': 'serif', 
      'grid.color': 'k', 
      'grid.linestyle': ':', 
      'grid.linewidth': 0.5, 
     } 
matplotlib.rcParams.update(params) 

x = sc.linspace(0,100) 
y = x**2 
fig = plt.figure('Fig') 
ax = fig.add_subplot(1, 1, 1) 
lines = ax.semilogy(x, y) 
ax.set_yticks([300], minor=True) 
ax.yaxis.grid(True, which='minor') 
ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter()) 
ax.tick_params(axis='y', pad=10) 
ax.set_xlabel(r'$\mathrm{R_L}$') 
ax.set_ylabel(r'$\sigma \int_l \; dx$') 
#fig.savefig('./PNG/test.png', dpi=300, bbox_inches='tight') 

Использование Латекс в качестве осей меток, как в приведенном выше коде, приводит цифру с несовместимым текстом по осям (см следующее образ).

enter image description here

Как вернуться к предыдущей модели поведения (см рисунок ниже) или последовательной схемы шрифта?

enter image description here

EDIT: Использование Latex фоновым Я могу получить хороший результат, но крайне медленно. Во всяком случае, я думаю, что внутренний back-end должен иметь возможность получения согласованного вывода, а переход на другой интерфейс не является реальным решением, но более обходным путем.

Чтобы использовать латекс фоновым:

#%matplotlib inline 
#%matplotlib notebook 
#%config InlineBackend.figure_format = 'svg' 
import scipy as sc 
import matplotlib.pyplot as plt 
import matplotlib 

# http://matplotlib.org/users/dflt_style_changes.html 
params = {'legend.fontsize': 18, 
      'axes.labelsize': 18, 
      'axes.titlesize': 18, 
      'xtick.labelsize' :12, 
      'ytick.labelsize': 12, 
      'mathtext.fontset': 'cm', 
      'mathtext.rm': 'serif', 
      'grid.color': 'k', 
      'grid.linestyle': ':', 
      'grid.linewidth': 0.5, 
     } 
matplotlib.rcParams.update(params) 
matplotlib.rcParams.update({'text.usetex':True, 'text.latex.preamble':[r'\usepackage{amsmath, newtxmath}']}) 

x = sc.linspace(0,100) 
y = x**2 
fig = plt.figure('Fig') 
ax = fig.add_subplot(1, 1, 1) 
lines = ax.semilogy(x, y) 
ax.set_yticks([300], minor=True) 
ax.yaxis.grid(True, which='minor') 
ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter()) 
ax.tick_params(axis='y', pad=10) 
ax.set_xlabel(r'$\mathrm{R_L}$') 
ax.set_ylabel(r'$\sigma \int_l \; dx$') 
#fig.savefig('./PNG/test.png', dpi=300, bbox_inches='tight') 

В результате с Matplotlib 2 является:

enter image description here

Полученный участок с более старой версии (все еще немного по-другому, может быть, из-за некоторых различий в латексе):

enter image description here

Но опять-таки, желаемый результат то, что получается из старой версии Matplotlib и отображаются на рисунке 2.

+0

В документации, на которую вы ссылаетесь, говорится: «По умолчанию математический шрифт при использовании встроенного механизма математического рендеринга (mathtext) изменился с« Современный компьютер »(то есть LaTeX-like) на« DejaVu Sans »». Другими словами, поведение _default_ должно быть шрифтом sans-serif, таким как ваш нижний граф. Похоже, что '' mathtext.rm ': «serif» - причина, поэтому удаление должно устранить проблему. – roganjosh

+0

Я пробовал это изменение, но результат тот же. – Alex

+0

Я не мог реплицировать, поэтому я попытался обновить matplotlib, и теперь он очень успешно удалил мою установку «numpy», поэтому я ничего не могу проверить. Но в разделе «Математический шрифт» также упоминается «mathtext.fontset»: «cm», поэтому, возможно, это тоже удалит. Я не могу понять, что делает эта линия. – roganjosh

ответ

0

При попытке найти решение на мой вопрос, я пытался сравнивать словари старых и новых rcParams и устанавливая элементы, которые были различны и связаны с mathtext шрифта: результат довольно хорошо.

Код:

#%matplotlib inline 
#%matplotlib notebook 
#%config InlineBackend.figure_format = 'svg' 
import scipy as sc 
import matplotlib.pyplot as plt 
import matplotlib 

# http://matplotlib.org/users/dflt_style_changes.html 
params = {'legend.fontsize': 18, 
      'axes.labelsize': 18, 
      'axes.titlesize': 18, 
      'xtick.labelsize' :12, 
      'ytick.labelsize': 12, 
      'mathtext.fontset': 'cm', 
      'mathtext.rm': 'serif', 
      'mathtext.bf': 'serif:bold', 
      'mathtext.it': 'serif:italic', 
      'mathtext.sf': 'sans\\-serif', 
      'grid.color': 'k', 
      'grid.linestyle': ':', 
      'grid.linewidth': 0.5, 
     } 
matplotlib.rcParams.update(params) 
#matplotlib.rcParams.update({'text.usetex':True, 'text.latex.preamble':[r'\usepackage{amsmath, newtxmath}']}) 
#matplotlib.rcParams.update({'text.usetex':True, 'text.latex.preamble':[r'\usepackage{amsmath, mathptmx}']}) 
#matplotlib.rcParams.update({'text.usetex':True, 'text.latex.preamble':[r'\usepackage{amsmath}']}) 

x = sc.linspace(0,100) 
y = x**2 
fig = plt.figure('Fig') 
ax = fig.add_subplot(1, 1, 1) 
lines = ax.semilogy(x, y) 
ax.set_yticks([300], minor=True) 
ax.yaxis.grid(True, which='minor') 
ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter()) 
ax.tick_params(axis='y', pad=10) 
ax.set_xlabel(r'$\mathrm{R_L}$') 
ax.set_ylabel(r'$\sigma \int_l \; dx$') 
fig.savefig('./PNG/test.png', dpi=300, bbox_inches='tight') 

, следовательно, добавив также:

  'mathtext.rm': 'serif', 
      'mathtext.bf': 'serif:bold', 
      'mathtext.it': 'serif:italic', 
      'mathtext.sf': 'sans\\-serif', 

что приводит:

enter image description here

, что я считаю очень хорошим и последовательным в Latex документе ,

Другое answer in this thread from @ImportanceOfBeingErnest также является аккуратным и красивым.

1

По этой ссылке вы же предоставить:

A ‘classic’ style sheet is provided so reverting to the 1.x default values is a single line of python

mpl.style.use('classic')

Добавление этой линии

matplotlib.style.use('classic') 

к вашему скрипту должен решить вашу проблему.

Я протестировал его на моем python2.7/matplotlib 2, и он отлично работал (т. Е. Вернул шрифты matplotlib 1.x).

+0

Да, но это действительно старый стиль. Вы не получаете тот же стиль, что и во втором сюжете. Я хотел бы сохранить новый стиль и исправить проблему с шрифтом. – Alex

+0

@Alex: Я думал, вы имели в виду только топоры. Дополнительную информацию о шрифтах можно найти в http://matplotlib.org/users/mathtext.html#fonts. Меняя ваш код на '' mathtext.fontset ':' stixsans ', 'и/или'' mathtext.rm ':' sansserif ', 'производят очень хорошие результаты для меня. – Eiffel

+0

Но латекс на этикетках имеет другой шрифт, который является уродливым. – Alex

4

Если консистенция является единственной проблемой, вы можете использовать «римский» стиль, используя шрифт «Times». Нет необходимости использовать латекс через usetex. Вместо этого просто используйте STIX fontset, шрифт Times и serif mathtext.

import scipy as sc 
import matplotlib.style 
import matplotlib.pyplot as plt 

params = {'legend.fontsize': 18, 
      'axes.labelsize': 18, 
      'axes.titlesize': 18, 
      'xtick.labelsize' :12, 
      'ytick.labelsize': 12, 
      'grid.color': 'k', 
      'grid.linestyle': ':', 
      'grid.linewidth': 0.5, 
      'mathtext.fontset' : 'stix', 
      'mathtext.rm'  : 'serif', 
      'font.family'  : 'serif', 
      'font.serif'  : "Times New Roman", # or "Times"   
     } 
matplotlib.rcParams.update(params) 

x = sc.linspace(0,100) 
y = x**2 
fig = plt.figure('Fig') 
ax = fig.add_subplot(1, 1, 1) 
lines = ax.semilogy(x, y) 

ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter()) 
ax.tick_params(axis='y', pad=10) 
ax.set_yticks([300], minor=True) 
ax.yaxis.grid(True, which='minor') 
ax.set_xlabel(r'$\mathrm{R_L}$') 
ax.set_ylabel(r'$\sigma \int_l \; dx$') 
plt.tight_layout() 
plt.show() 

enter image description here

+0

Уход, выход хороший и последовательный. Между тем я попытался сравнить словари rcParam, и я попытался установить разные элементы: результат неплохой.Я постараюсь сделать это возможным ответом на себя (без принятия моего ответа на себя, поскольку я не считаю его окончательным). – Alex