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

531

Я создаю фигуру в 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) - это не то, что мне нужно. Как индивидуально настроить размеры шрифта для заголовка рисунка и меток оси?

vasek1
источник
1
Мне было любопытно, поэтому я попытался добавить ваши mpl.rcParams['font.size'] = 20и попытался изменить значения на 10 и 14. Сначала я обнаружил, что я получаю ошибки, если я не изменился mplна plt. Это изменение устранило ошибку, но затем строка кода не повлияла на мои заголовки или ярлыки. Уверен, что этот синтаксис правильный?
TMWP
теперь я думаю из комментариев к принятому ответу, что проблема может заключаться в моем утверждении import, хотя почему оно не выдает ошибку, если я не импортировал команду, мне не хватает. Есть ли другая строка импорта, которую вы использовали при тестировании mplкоманды?
TMWP

Ответы:

774

Функции, работающие с текстом, например 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)
tsando
источник
5
Какие другие размеры кроме 'x-large'?
Мартин Тома,
15
«xx-small», «x-small», «small», «medium», «large», «x-large», «xx-large». См. Matplotlib.org/api/…
tsando
Используйте, pylab.rcParams.keys()чтобы увидеть полный список параметров.
Нирмал
Спасибо. Есть ли способ глобально установленных четких числовых размеров по названию и оси лейблов вместо того , чтобы всегда делать ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Кажется, что rcParamsпринимает только строки.
тимгеб
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 Это правда, и эти формы похожи на ответ Avaris выше. Я добавлю их для полноты. Я все еще нахожу применение, ax.xaxis.label.set_size()когда я работаю в интерактивном режиме с графиком ipython, и я хочу сделать быструю визуальную оценку различных размеров шрифта.
раскрутка
Знаете ли вы, есть ли какая-либо (скрытая) разница между использованием объектов топора и объектов фигуры, или оба они абсолютно эквивалентны? Почему существуют разные интерфейсы для некоторых функций? (plt.xlabel () против ax.set_xlabel ())
норманиус
1
@normanius, если в вышеприведенном примере вы имеете в виду ax и fig, это совершенно разные объекты - fig - это общая фигура, которая может содержать несколько осей. Так что у инжира и топора разные свойства. С точки зрения разницы между вызовами типа pyplot и вызовами объектов (например, plt.xlabel()против, ax.set_xlabel()как вы говорите), они эквивалентны с оговоркой, что plt.*функции работают на текущей оси / фигуре. Поэтому, если вы настроите фигуру с несколькими осями, вы, вероятно, захотите использовать явные вызовы, например, ax1.set_xlabel()чтобы избежать путаницы.
раскрутка
20

Чтобы изменить только шрифт заголовка (а не шрифт оси), я использовал это:

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 .

tammoj
источник
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, вы можете изменить макет, используя открывшееся диалоговое окно. Интервал между осями, отступы, если хотите, можно изменить на этом этапе.

Naz
источник
2

Место right_axдоset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Чейн Бадр Эддин
источник
-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()
shapeshifter123
источник
2
Хотя этот код может обеспечить решение проблемы OP, настоятельно рекомендуется предоставить дополнительный контекст относительно того, почему и / или как этот код отвечает на вопрос. Ответы только на код, как правило, становятся бесполезными в долгосрочной перспективе, потому что будущие зрители, сталкивающиеся с подобными проблемами, не могут понять причины решения.
Э. Зейтинчи