2017-02-15 24 views
6

zaktualizowałem Anakonda Pythona do najnowszej wersji (4.3), gdzie przenieśli matplotlib do wersji 2.matplotlib 2 niespójne czcionki

Aktualizacja poczyniła pewne istotne zmiany w domyślnym stylu (see here). I chociaż naprawdę podobają mi się niektóre z tych zmian, nie zgadzam się z niektórymi z nich.

Stąd zrobiłem pewne modyfikacje, jak zasugerowano w linku powyżej:

#%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') 

użycia lateksu jako etykiet osi, tak jak w powyższym kodzie, powoduje rysunku z tekstem niespójnym na osiach (patrz poniższy obraz).

enter image description here

Jak wrócić do poprzedniego zachowania (patrz zdjęcie poniżej) lub do spójnego systemu czcionki?

enter image description here

EDIT: Korzystanie z lateksu back-end Jestem w stanie uzyskać dobry wynik, ale to jest bardzo powolny. W każdym razie, myślę, że wewnętrzny back-end powinien być w stanie uzyskać spójne dane wyjściowe, a przejście na inny back-end nie jest prawdziwym rozwiązaniem, ale bardziej obejściem problemu.

Aby korzystać z lateksu 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') 

Wynik z matplotlib 2 jest:

enter image description here

Powstały działka w starszej wersji (jeszcze trochę inaczej, może ze względu na pewne różnice lateksowe):

enter image description here

Ale znowu, pożądany rezultat jest co uzyskano ze starszej wersji matplotlib i wyświetlane na rysunku 2.

+0

Dokumentacja, do której prowadzi łącze, mówi: "Domyślna czcionka matematyczna podczas korzystania z wbudowanego mechanizmu renderującego matematykę (mathtext) zmieniła się z" Nowoczesny komputer "(np. LaTeX-like) na" DejaVu Sans "." Innymi słowy, zachowanie _default_ powinno być czcionką bezszeryfową, taką jak twój dolny wykres. Wygląda na '' mathtext.rm ': "serif" jest przyczyną, usunięcie go powinno naprawić problem. – roganjosh

+0

Próbowałem tej zmiany, ale wynik jest taki sam. – Alex

+0

Nie mogłem replikować, więc próbowałem uaktualnić matplotlib i teraz bardzo pomocnie usunięto moją instalację 'numpy', więc nie mogę niczego przetestować. Ale sekcja z czcionką matematyczną wspomina także o ''mathtext.fontset': 'cm'', więc może to również usunąć. Nie mogę zrozumieć, co robi ta linia. – roganjosh

Odpowiedz

0

Starając się znaleźć rozwiązanie na moje pytanie, próbowałem porównując słowniki starych i nowych rcParams i ustawienie elementów, które były różne i związane mathtext czcionki: wynik jest całkiem dobry.

Kod jest:

#%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') 

stąd dodając również:

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

co skutkuje:

enter image description here

że uważam całkiem dobre i spójne w dokumencie Latex .

Drugi answer in this thread from @ImportanceOfBeingErnest jest również czysty i miły.

1

Z linku podała:

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

mpl.style.use('classic')

Dodanie tej linii

matplotlib.style.use('classic') 

do skryptu powinien rozwiązać swój problem.

Przetestowałem to na moim python2.7/matplotlib 2, i działało dobrze (tj. Wróciłem z matplotlib 1.x).

+0

Tak, ale to jest naprawdę stary styl. Nie uzyskujesz tego samego stylu, co na drugim wykresie. Chciałbym zachować nowy styl i naprawić problem z czcionką. – Alex

+0

@Alex: Myślałem, że masz na myśli tylko kleszcze osi. Więcej informacji na temat czcionek można znaleźć na stronie http://matplotlib.org/users/mathtext.html#fonts. Zmiana kodu na '' mathtext.fontset ':' stixsans ', 'i/lub'' mathtext.rm ':' sansserif ', "dają mi całkiem dobre wyniki. – Eiffel

+0

Ale lateks na etykietach ma inną czcionkę, która jest brzydka. – Alex

4

Jeśli jedynym problemem jest konsystencja, możesz użyć stylu "rzymskiego", używając czcionki "Times". Nie jest konieczne używanie Latex przez usetex. Zamiast tego wystarczy użyć zestawu czcionek STIX, czcionki Times i serif.

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

Schludne, wyjście jest ładne i spójne. W międzyczasie próbowałem porównywać słowniki rcParam i próbowałem ustawić różne elementy: wynik jest całkiem dobry.Postaram się umieścić tę odpowiedź jako możliwą dla siebie (nie akceptując własnej odpowiedzi, ponieważ nie uważam jej za definitywną). – Alex

Powiązane problemy