Як встановити розмір шрифту для заголовка фігури та осей у 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.