Як змінити розмір шрифту на графіку matplotlib


542

Як змінюється розмір шрифту для всіх елементів (галочки, мітки, назва) на графіку matplotlib?

Я знаю, як змінити розміри галочок, це робиться за допомогою:

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

Але як один змінює решту?

Відповіді:


629

З документації 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
приємно, за винятком того, що він замінить будь-яку властивість шрифтів, знайдених на цьому шляху è_é
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, як у другому посиланні.
FvD

303

Якщо ви такий контролер, як я, ви можете чітко встановити всі розміри шрифту:

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
Я перепробував багато відповідей. Цей виглядає найкраще, принаймні, у ноутбуках Юпітера. Просто скопіюйте наведений вище блок і налаштуйте три константи розміру шрифту.
fviktor

3
Погодьтеся з fvitkor, це найкраща відповідь!
СеФ

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)

1
Моя мета полягала в тому, щоб шрифт ярликів Xy, галочок та заголовків був різного розміру. Змінена версія цього працювала для мене так добре.
Ебе Ісаак

6
Для отримання легенд також використовуйте ax.legend (). Get_texts (). Випробуваний на Matplotlib 1.4.
Джеймс С.

Це відповідає на питання найбільш безпосередньо. Дякую.
jimh

Може знадобитися, ax=plt.gca()якщо сюжет створений без визначення осі.
dylnan

@JamesS. Скоріше використовувати ax.get_legend().get_texts(), тому що ax.legend()перемальовується вся легенда з параметрами за замовчуванням поверх повернення значення ax.get_legend().
Гімуте

69

Оновлення: див. Нижню частину відповіді щодо дещо кращого способу зробити це.
Оновлення №2: Я також зрозумів, що змінюються шрифти заголовка легенди.
Оновлення №3: У Matplotlib 2.0.0 є помилка, через яку мітки галочок для логарифмічних осей повертаються до шрифту за замовчуванням. Потрібно виправити 2.0.1, але я включив рішення у другій частині відповіді.

Ця відповідь призначена для тих, хто намагається змінити всі шрифти, включаючи легенду, і для тих, хто намагається використовувати різні шрифти та розміри для кожної речі. Він не використовує rc (який, здається, не працює для мене). Він досить громіздкий, але я не міг особисто впоратися з будь-яким іншим методом. Це в основному поєднує тут відповідь риггіра з іншими відповідями на ТА.

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()

Сподіваємось, це всебічна відповідь


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 (американський вчитель моделювання Америки). Приклад з наведеного вище коду:введіть тут опис зображення


7
Щоб уникнути обрізання мітки осі, збережіть фігуру з bbox_inchesаргументом fig.savefig('Basic.png', bbox_inches="tight")
Paw

Що робити, якщо Я НЕ зберігаю фігуру? Я будую схему в зошиті Juypter, і отримані мітки осі відрізаються.
Zythyr

Дякую! Вказівка ​​параметрів dpi була дуже корисною для мене при підготовці версій для друку моїх сюжетів без необхідності коригування всіх розмірів рядків, розмірів шрифту тощо
ybull

27

Використовуйте plt.tick_params(labelsize=14)


4
Дякуємо за фрагмент коду, який може надати деяку обмежену, негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення , описавши, чому це хороше рішення проблеми, та зробило б її кориснішою для майбутніх читачів з іншими подібними питаннями. Відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
sepehr

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 Notebook:

# 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)

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

Це розширення Marius Retegan відповідь . Ви можете створити окремий файл 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.