Как изменить размер шрифта на графике matplotlib

542

Как изменить размер шрифта для всех элементов (галочки, метки, заголовок) на графике matplotlib?

Я знаю, как изменить размеры меток, это делается с помощью:

import matplotlib 
matplotlib.rc('xtick', labelsize=20) 
matplotlib.rc('ytick', labelsize=20) 

Но как изменить остальных?

Герман Шааф
источник

Ответы:

631

Из документации matplotlib ,

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 22}

matplotlib.rc('font', **font)

Это устанавливает шрифт всех элементов к шрифту указанного объекта kwargs, font.

В качестве альтернативы вы также можете использовать rcParams updateметод, предложенный в этом ответе :

matplotlib.rcParams.update({'font.size': 22})

или

import matplotlib.pyplot as plt
plt.rcParams.update({'font.size': 22})

Вы можете найти полный список доступных свойств на странице настройки matplotlib .

Герман Шааф
источник
2
хорошо, за исключением того, что переопределяет FONTSIZE свойства найденного на его пути e_e
YOTA
2
Где я могу найти больше вариантов для таких элементов, как 'family', 'weight'и т. Д.?
Хакс
2
@HermanSchaaf; Я посетил эту страницу раньше. Я хотел бы знать все варианты 'family'Like 'normal', 'sans-serif'и т.д.
haccks
77
Поскольку многие люди начинают с import matplotlib.pyplot as plt, вы могли бы отметить, что pyplotимеет rc. Вы можете обойтись plt.rc(...без изменения вашего импорта.
LondonRob
21
Для нетерпеливых: по умолчанию размер шрифта равен 10, как и во второй ссылке.
ФВД
304

Если вы такой же фанат управления, как я, вы можете явно указать все размеры шрифтов:

import matplotlib.pyplot as plt

SMALL_SIZE = 8
MEDIUM_SIZE = 10
BIGGER_SIZE = 12

plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

Обратите внимание, что вы также можете установить размеры вызова rcметода matplotlib:

import matplotlib

SMALL_SIZE = 8
matplotlib.rc('font', size=SMALL_SIZE)
matplotlib.rc('axes', titlesize=SMALL_SIZE)

# and so on ...
Педро М Дуарте
источник
9
Я перепробовал многие ответы. Этот выглядит лучше всего, по крайней мере, в ноутбуках Jupyter. Просто скопируйте вышеуказанный блок сверху и настройте три константы размера шрифта.
fviktor
3
Согласитесь с фвиткор, это лучший ответ!
Sef
9
Для меня размер заголовка не работал. Я использовал:plt.rc('axes', titlesize=BIGGER_SIZE)
Фернандо Ирарразаваль G
1
Я думаю, что вы можете объединить все настройки для одного и того же объекта в одну строку. Например,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen
198
matplotlib.rcParams.update({'font.size': 22})
Мариус Ретеган
источник
1
В любом случае это решение работает только в том случае, если я создаю первый график, а затем «обновляю», как предлагается, что приводит к обновлению размера шрифта для новых фигур. Может быть, первый сюжет необходим для инициализации rcParams ...
Songio
191

Если вы хотите изменить размер шрифта только для определенного графика, который уже был создан, попробуйте это:

import matplotlib.pyplot as plt

ax = plt.subplot(111, xlabel='x', ylabel='y', title='title')
for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
             ax.get_xticklabels() + ax.get_yticklabels()):
    item.set_fontsize(20)
ryggyr
источник
1
Моя цель состояла в том, чтобы иметь шрифт ярлыков, галочек и заголовков разных размеров. Модифицированная версия этого работала так хорошо для меня.
Ébe Исаак
6
Чтобы получить легенды, используйте ax.legend (). Get_texts (). Проверено на Matplotlib 1.4.
Джеймс С.
Это отвечает на вопрос наиболее прямо. Спасибо.
Джим
Может понадобиться, ax=plt.gca()если график был создан без определения оси.
Дилнан
@JamesS. Скорее используйте ax.get_legend().get_texts(), потому что ax.legend()перерисовывает всю легенду с параметрами по умолчанию поверх возвращаемого значения ax.get_legend().
Гимут
69

Обновление: см. Нижнюю часть ответа для немного лучшего способа сделать это.
Обновление № 2: я также понял, как изменить шрифты заголовков легенд.
Обновление № 3: в Matplotlib 2.0.0 есть ошибка , из-за которой метки галочек для логарифмических осей возвращаются к шрифту по умолчанию. Должно быть исправлено в 2.0.1, но я включил обходной путь во 2-й части ответа.

Этот ответ предназначен для всех, кто пытается изменить все шрифты, в том числе для легенды, и для всех, кто пытается использовать разные шрифты и размеры для каждой вещи. Это не использует rc (который, кажется, не работает для меня). Это довольно громоздко, но я не мог справиться с любым другим методом лично. Это в основном сочетает здесь ответ ryggyr с другими ответами на SO.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# Set the font dictionaries (for plot title and axis titles)
title_font = {'fontname':'Arial', 'size':'16', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'14'}

# Set the font properties (for use in legend)   
font_path = 'C:\Windows\Fonts\Arial.ttf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Set the tick labels font
for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontname('Arial')
    label.set_fontsize(13)

x = np.linspace(0, 10)
y = x + np.random.normal(x) # Just simulates some data

plt.plot(x, y, 'b+', label='Data points')
plt.xlabel("x axis", **axis_font)
plt.ylabel("y axis", **axis_font)
plt.title("Misc graph", **title_font)
plt.legend(loc='lower right', prop=font_prop, numpoints=1)
plt.text(0, 0, "Misc text", **title_font)
plt.show()

Преимущество этого метода заключается в том, что, имея несколько словарей шрифтов, вы можете выбирать разные шрифты / размеры / веса / цвета для различных заголовков, выбирать шрифт для меток галочек и выбирать шрифт для легенды, причем все независимо.


ОБНОВИТЬ:

Я разработал немного другой, менее загроможденный подход, который устраняет словари шрифтов и позволяет использовать любой шрифт в вашей системе, даже шрифты .otf. Чтобы иметь отдельные шрифты для каждой вещи, просто напишите больше font_pathи font_propкак переменные.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import matplotlib.ticker
# Workaround for Matplotlib 2.0.0 log axes bug https://github.com/matplotlib/matplotlib/issues/8017 :
matplotlib.ticker._mathdefault = lambda x: '\\mathdefault{%s}'%x 

# Set the font properties (can use more variables for more fonts)
font_path = 'C:\Windows\Fonts\AGaramondPro-Regular.otf'
font_prop = font_manager.FontProperties(fname=font_path, size=14)

ax = plt.subplot() # Defines ax variable by creating an empty plot

# Define the data to be plotted
x = np.linspace(0, 10)
y = x + np.random.normal(x)
plt.plot(x, y, 'b+', label='Data points')

for label in (ax.get_xticklabels() + ax.get_yticklabels()):
    label.set_fontproperties(font_prop)
    label.set_fontsize(13) # Size here overrides font_prop

plt.title("Exponentially decaying oscillations", fontproperties=font_prop,
          size=16, verticalalignment='bottom') # Size here overrides font_prop
plt.xlabel("Time", fontproperties=font_prop)
plt.ylabel("Amplitude", fontproperties=font_prop)
plt.text(0, 0, "Misc text", fontproperties=font_prop)

lgd = plt.legend(loc='lower right', prop=font_prop) # NB different 'prop' argument for legend
lgd.set_title("Legend", prop=font_prop)

plt.show()

Надеюсь, это исчерпывающий ответ

binaryfunt
источник
40

Вот совершенно другой подход, который удивительно хорошо работает для изменения размеров шрифта:

Измените размер фигуры !

Я обычно использую такой код:

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(4,3))
ax = fig.add_subplot(111)
x = np.linspace(0,6.28,21)
ax.plot(x, np.sin(x), '-^', label="1 Hz")
ax.set_title("Oscillator Output")
ax.set_xlabel("Time (s)")
ax.set_ylabel("Output (V)")
ax.grid(True)
ax.legend(loc=1)
fig.savefig('Basic.png', dpi=300)

Чем меньше размер рисунка, тем больше шрифт относительно графика . Это также повышает маркеры. Обратите внимание, я также установил dpiили точку на дюйм. Я узнал об этом из публикации на форуме AMTA (American Modeling Teacher of America). Пример из приведенного выше кода:введите описание изображения здесь

Проф Хустер
источник
7
Чтобы избежать обрезания метки оси, сохраните фигуру с bbox_inchesаргументом fig.savefig('Basic.png', bbox_inches="tight")
Paw
Что делать, если я НЕ сохраняю фигуру? Я строю графики в Juypter Notebook, и получающиеся метки оси обрезаются.
Zythyr
Спасибо! Указание настроек dpi было чрезвычайно полезно для меня при подготовке печатных версий моих графиков без необходимости настройки всех размеров линий, размеров шрифта и т. Д.
ybull
27

использование plt.tick_params(labelsize=14)

Андрей Никишаев
источник
4
Спасибо за фрагмент кода, который может оказать некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность , описав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
сентября
22

Вы можете использовать plt.rcParams["font.size"]для настройки font_sizeв, matplotlibа также вы можете использовать plt.rcParams["font.family"]для настройки font_familyв matplotlib. Попробуйте этот пример:

import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')

label = [1,2,3,4,5,6,7,8]
x = [0.001906,0.000571308,0.0020305,0.0037422,0.0047095,0.000846667,0.000819,0.000907]
y = [0.2943301,0.047778308,0.048003167,0.1770876,0.532489833,0.024611333,0.157498667,0.0272095]


plt.ylabel('eigen centrality')
plt.xlabel('betweenness centrality')
plt.text(0.001906, 0.2943301, '1 ', ha='right', va='center')
plt.text(0.000571308, 0.047778308, '2 ', ha='right', va='center')
plt.text(0.0020305, 0.048003167, '3 ', ha='right', va='center')
plt.text(0.0037422, 0.1770876, '4 ', ha='right', va='center')
plt.text(0.0047095, 0.532489833, '5 ', ha='right', va='center')
plt.text(0.000846667, 0.024611333, '6 ', ha='right', va='center')
plt.text(0.000819, 0.157498667, '7 ', ha='right', va='center')
plt.text(0.000907, 0.0272095, '8 ', ha='right', va='center')
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = "50"
plt.plot(x, y, 'o', color='blue')
Хамед Базияд
источник
10

Вот что я обычно использую в ноутбуке Jupyter:

# Jupyter Notebook settings

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:95% !important; }</style>"))
%autosave 0
%matplotlib inline
%load_ext autoreload
%autoreload 2

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"


# Imports for data analysis
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_rows', 2500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_colwidth', 2000)
pd.set_option('display.width', 2000)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

#size=25
size=15
params = {'legend.fontsize': 'large',
          'figure.figsize': (20,8),
          'axes.labelsize': size,
          'axes.titlesize': size,
          'xtick.labelsize': size*0.75,
          'ytick.labelsize': size*0.75,
          'axes.titlepad': 25}
plt.rcParams.update(params)
stackoverflowuser2010
источник
8

Исходя из вышеизложенного:

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

fontPath = "/usr/share/fonts/abc.ttf"
font = fm.FontProperties(fname=fontPath, size=10)
font2 = fm.FontProperties(fname=fontPath, size=24)

fig = plt.figure(figsize=(32, 24))
fig.text(0.5, 0.93, "This is my Title", horizontalalignment='center', fontproperties=font2)

plot = fig.add_subplot(1, 1, 1)

plot.xaxis.get_label().set_fontproperties(font)
plot.yaxis.get_label().set_fontproperties(font)
plot.legend(loc='upper right', prop=font)

for label in (plot.get_xticklabels() + plot.get_yticklabels()):
    label.set_fontproperties(font)
ПНВ
источник
5

Это продолжение ответа Мариуса Ретегана . Вы можете создать отдельный файл JSON со всеми вашими изменениями, а затем загрузить его с помощью rcParams.update. Изменения будут применяться только к текущему сценарию. Так

import json
from matplotlib import pyplot as plt, rcParams

s = json.load(open("example_file.json")
rcParams.update(s)

и сохраните этот «example_file.json» в той же папке.

{
  "lines.linewidth": 2.0,
  "axes.edgecolor": "#bcbcbc",
  "patch.linewidth": 0.5,
  "legend.fancybox": true,
  "axes.color_cycle": [
    "#348ABD",
    "#A60628",
    "#7A68A6",
    "#467821",
    "#CF4457",
    "#188487",
    "#E24A33"
  ],
  "axes.facecolor": "#eeeeee",
  "axes.labelsize": "large",
  "axes.grid": true,
  "patch.edgecolor": "#eeeeee",
  "axes.titlesize": "x-large",
  "svg.fonttype": "path",
  "examples.directory": ""
}
Майкл Х.
источник
4

Я полностью согласен с профессором Хастером, что самый простой способ - изменить размер рисунка, что позволяет сохранить шрифты по умолчанию. Мне просто нужно было дополнить это параметром bbox_inches при сохранении фигуры в формате PDF, потому что метки оси были вырезаны.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')

источник