2016-10-04 4 views
1

Я хочу изменить шрифт по умолчанию, используемый в графиках matplotlib, чтобы быть пользовательским интерфейсом Segoe под Windows. Я могу сделать это путем изменения rcParams как такmatplotlib выбор неправильного стиля шрифта/вес

import matplotlib 
matplotlib.rcParams['font.family'] = 'sans-serif' 
matplotlib.rcParams['font.sans-serif'] = ['Segoe UI'] + matplotlib.rcParams['font.sans-serif'] 
matplotlib.rcParams['font.weight'] = 'normal' 

Это работает, однако вес шрифта, как представляется, не так. Используя следующий код, я могу подтвердить, что matplotlib набирает версию «Semibold» шрифта, а не вариант «Обычный», который я ожидаю от установки matplotlib.rcParams['font.weight'] = 'normal'.

from matplotlib.font_manager import findfont, FontProperties 
font = findfont(FontProperties(family=['sans-serif'])) 
print font 

>>> c:\windows\fonts\seguisb.ttf 

Как я могу заставить matplotlib использовать вариант «Обычный»? Возможно ли это с rcParams?

ответ

0

Кажется, что matplotlib выбирает из всех шрифтов «Segoe UI» жирный шрифт без причины. Я боюсь, что вы не сможете этого сделать на уровне rcParams.

Если кто-то найдет решение этой проблемы, я бы тоже ее оценил.

До тех пор, вот обходное решение с использованием fontproperties kwarg.

import matplotlib.pyplot as plt 
import matplotlib.font_manager as font_manager 

fig, ax = plt.subplots() 
path = r'C:\Windows\Fonts\segoeui.ttf' 
path1 = r'C:\Windows\Fonts\seguisb.ttf' 
path2 = r'C:\Windows\Fonts\arial.ttf' 
for i, p in enumerate([path,path1,path2]): 
    prop = font_manager.FontProperties(fname=p) 
    tx = 'Text in {font},\n{path}\nweight {weight}\nvariant {var}' 
    tx = tx.format(font=prop.get_name(), weight=prop.get_weight(), var=prop.get_variant(), path=p) 
    ax.text(0.1,0.1+i*0.3,tx, fontproperties=prop, size=18) 
plt.show() 

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

1

я понял, хак, который исправляет проблему с Segoe UI без необходимости устанавливать kwargs каждый раз, когда ...

По какой-то причине, модуль tf2font (который является .pyd) приписывает вес шрифта 400 к шрифтам Segoe UI Black, Ultralight, Light и Semi-bold, которые действительно должны иметь размер шрифта 1000, 100, 200 и 500 соответственно.

Сначала удалите файл fontList.json. (Для меня это было в .matplotlib \ fontList.json).

Затем, прямо перед этой линией в font_manager.py:

return FontEntry(font.fname, name, style, variant, weight, stretch, size) 

Вставьте следующий код:

switch = lambda x: { 
    #Correct the font-weight for these fonts 
    'seguibl.ttf': 1000, 
    'segouisl.ttf': 100, 
    'seguisb.ttf':500, 
    'segoeuil.ttf':200 
}[x] 

f = os.path.split(font.fname)[1] 
if f in ['seguibl.ttf', 'segouisl.ttf', 'seguisb.ttf', 'segoeuil.ttf']: 
    weight = switch(f) 

Конечный результат будет выглядеть следующим образом:

switch = lambda x: { 
    #Correct the font-weight for these fonts 
    'seguibl.ttf': 1000, 
    'segouisl.ttf': 100, 
    'seguisb.ttf':500, 
    'segoeuil.ttf':200 
}[x] 

f = os.path.split(font.fname)[1] 
if f in ['seguibl.ttf', 'segouisl.ttf', 'seguisb.ttf', 'segoeuil.ttf']: 
    weight = switch(f) 
return FontEntry(font.fname, name, style, variant, weight, stretch, size) 
Смежные вопросы