Як встановити розмір шрифту для заголовка фігури та осей у Matplotlib?


530

Я створюю фігуру в Matplotlib так:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

Я хочу вказати розміри шрифту для назви фігури та міток осі. Мені потрібно, щоб усі три були різними розмірами шрифту, тому встановлення глобального розміру шрифту ( mpl.rcParams['font.size']=x) - це не те, що я хочу. Як встановити розміри шрифту для заголовка фігури та міток осі окремо?


1
Мені було цікаво , тому я спробував додати свої mpl.rcParams['font.size'] = 20і спробував змінити значення 10 і 14. По перше , я виявив , що я отримав помилки , якщо я не змінив mplдо plt. Ця зміна очистила помилку, але тоді рядок коду не вплинув на мої заголовки чи мітки. Впевнений, що цей синтаксис правильний?
— TMWP

Тепер я зауважую з коментарів до прийнятої відповіді, що проблема може бути моєю заявою про імпорт, хоча чому вона не видає помилку, якщо я не імпортував команду, це поза моїми помилками. Чи є інший рядок імпорту, який ви використовували при тестуванні mplкоманди?
— TMWP

Відповіді:


772

Функції працюють з текстом , як label, titleі т.д. приймають параметри такі ж , як matplotlib.text.Text. Для розміру шрифту ви можете використовувати size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

Для глобальних налаштувань titleі labelрозмірів mpl.rcParamsмістить axes.titlesizeі axes.labelsize. (Зі сторінки):

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(Наскільки я бачу, немає способів встановлювати xта yрозміщувати розміри міток окремо.)

І я бачу, що axes.titlesizeце не впливає suptitle. Я думаю, вам потрібно встановити це вручну.


Дякую! чи є спосіб встановити це глобально, але явно для (suptitle, xlabel, ylabel)? Я роблю багато діаграм і просто хочу його вказати один раз ...
— vasek1

@ vasek1: Я думав, ти не хочеш глобальних налаштувань :). Для цього вам потрібно mpl.rcParams. Я відредагував свою відповідь.
— Аваріс

16
Для когось іншого, як я, що шукає рішення змінити титул:plt.rcParams.update({'axes.titlesize': 'small'})
— tommy.carstensen

За rcParamsпосиланням використовуйте figure.titlesizeдодатково до axes.titlesize.
— Божевільний фізик

1
@AlexanderMcFarlane. Я побіг python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Результат 1.5.1, True. 1) Яку версію matplotlib ви використовуєте? Яка версія Python? 2) Чи може це бути помилка, де вона чомусь приймає, strале не unicodeв Py2?
— Божевільний фізик

90

Ви також можете це зробити у всьому світі за допомогою словника rcParams:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)

5
Які ще розміри є 'x-large'?
— Мартін Тома

15
'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'. Дивіться matplotlib.org/api/…
— tsando

Використовуйте pylab.rcParams.keys()для перегляду повного списку параметрів.
— Nirmal

Дякую. Чи є спосіб глобально встановлених чітких числових розмірів за назвою і осі лейблів замість того , щоб завжди робити ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Схоже, rcParamsприймає лише рядки.
— timgeb

4
Можна також скористатися номерами ...'axes.labelsize': 32,
— mimoralea

65

Якщо ви більше звикли використовувати axоб’єкти для побудови графіку, вам може бути ax.xaxis.label.set_size()легше запам’ятати або, принаймні, простіше знайти за допомогою вкладки в ipython-терміналі. Здається, потрібна операція перемальовування після того, щоб побачити ефект. Наприклад:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

Я не знаю подібного способу встановити розмір суппіту після його створення.


fig.suptitle('test title', fontsize = 20)здається, працює. ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size (20) `.
— T_T

1
@T_T Це правда, і ці форми схожі на відповідь Аваріса вище. Я додам їх для повноти. Я все ще знаходжу собі користь, ax.xaxis.label.set_size()коли інтерактивно працюю з сюжетом ipython і хочу зробити швидку візуальну оцінку різних розмірів шрифту.
— спінуп

Чи знаєте ви, чи є якась (прихована) різниця між використанням сокирних предметів та об’єктів фігури, чи обидва цілком рівноцінні? Чому для деяких функцій існують різні інтерфейси? (plt.xlabel () vs. ax.set_xlabel ())
— Норманій

1
@normanius, якщо ви маєте на увазі сокиру та інжир у наведеному вище прикладі, вони є зовсім різними об'єктами - фіг - це загальна фігура, яка може містити кілька осей. Так інжир і сокира мають різні властивості. З точки зору різниці між викликами типу pyplot і об'єктних викликів (наприклад , plt.xlabel()проти , ax.set_xlabel()як ви говорите), вони еквівалентні, з одним застереженням , що plt.*функції працюють на поточній осі / фігури. Отже, якщо ви встановите фігуру з декількома осями, ви, ймовірно, захочете використовувати явні дзвінки, як, ax1.set_xlabel()щоб уникнути плутанини.
— спінуп

19

Для зміни лише шрифту заголовка (а не шрифту осі) я використав це:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

Шрифтове рішення приймає всі kwargs від matplotlib.text.Text .


8

Згідно з офіційним посібником , використання pylabбільше не рекомендується. matplotlib.pyplotслід використовувати безпосередньо замість цього.

Глобальне встановлення розмірів шрифту через rcParamsслід робити з

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

Значення за замовчуванням можна відновити за допомогою

plt.rcParams.update(plt.rcParamsDefault)

Ви можете також зробити це, створивши таблицю стилів у stylelibкаталозі під каталогом конфігурації matplotlib (ви можете отримати каталог конфігурації з нього matplotlib.get_configdir()). Формат аркуша стилів такий

axes.labelsize: 16
axes.titlesize: 16

Якщо у вас є таблиця стилів, /path/to/mpl_configdir/stylelib/mystyle.mplstyleви можете використовувати його через

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

Ви також можете створити (або змінити) файл matplotlibrc, який розділяє формат

axes.labelsize = 16
axes.titlesize = 16

В залежності від matplotlibrc файл, змінити ці зміни будуть використовуватися тільки для поточного робочого каталогу, для всіх робочих каталогів , які дійсно НЕ мають файлу matplotlibrc, або для всіх робочих каталогів , які дійсно НЕ мають файл matplotlibrc і де ніякий інший файл matplotlibrc не має були вказані. Докладніші відомості див. У цьому розділі налаштування сторінки matplotlib.

Повний список rcParamsключів можна отримати за допомогою plt.rcParams.keys(), але для коригування розмірів шрифту у вас є (курсив наведено тут )

  • axes.labelsize- Розмір шрифтів міток x і y
  • axes.titlesize- Розмір шрифту заголовка осей
  • figure.titlesize- Розмір назви фігури ( Figure.suptitle())
  • xtick.labelsize- Розмір шрифту міток
  • ytick.labelsize- Розмір шрифту міток
  • legend.fontsize- Розмір шрифту для легенд ( plt.legend(), fig.legend())
  • legend.title_fontsize- Розмір шрифтів для заголовків легенд, Noneвстановлюється таким же, як і осі за замовчуванням. Дивіться цю відповідь на прикладі використання.

всі вони приймають розміри рядків {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}або floatв pt. Розміри рядків визначаються щодо розміру шрифту за замовчуванням, який задається

  • font.size- розмір шрифту за замовчуванням для тексту, поданий у балах. 10 pt - стандартне значення

Додатково, вагу можна вказати (хоча лише для стандартного показника)

  • font.weight- Вага шрифту, що використовується, за замовчуванням text.Text. Приймає {100, 200, 300, 400, 500, 600, 700, 800, 900}або 'normal'(400), 'bold'(700) 'lighter', і 'bolder'( відносно поточної ваги ).

2

Альтернативним рішенням для зміни розміру шрифту є зміна прокладки. Коли Python зберігає ваш PNG, ви можете змінити макет за допомогою діалогового вікна, яке відкриється. На цьому етапі можна змінити відстань між осями, якщо ви хочете, накладки.



-3

7 (найкраще рішення)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (трохи гірше рішення)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m

def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()

2
Хоча цей код може вирішити проблему ОП, настійно рекомендується надати додатковий контекст щодо того, чому та / або як цей код відповідає на питання. Відповіді з коду, як правило, стають марними в довгостроковій перспективі, оскільки майбутні глядачі, які відчувають подібні проблеми, не можуть зрозуміти міркування, що стоять за рішенням.
— Е. Зейтинці
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.