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
좋은, 그것의 방법 è_é에서 발견 된 글꼴 크기 속성 오버라이드 (override)를 제외하고
YOTA

2
어디에서와 같은 요소에 대한 더 많은 옵션을 찾을 수 있습니다 'family', 'weight'등?
hacks

2
@HermanSchaaf; 나는 전에 그 페이지를 방문했다. 나는 모든 옵션을 알고 싶습니다 'family'처럼를 'normal', 'sans-serif'
haccks

77
많은 사람들이 시작하기 때문에 import matplotlib.pyplot as plt, 그 점을 지적하는 것 같아서 pyplotrc아니라. plt.rc(...가져 오기를 변경 하지 않고도 할 수 있습니다 .
LondonRob

21
참을성이없는 사람의 경우 : 두 번째 링크에서와 같이 기본 글꼴 크기는 10입니다.
FvD

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
fvitkor에 동의하십시오. 이것이 최선의 대답입니다!
SeF

9
나를 위해 제목 크기가 작동하지 않았습니다. 내가 사용한 :plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval 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 레이블, 눈금 및 제목의 글꼴이 다른 크기가되도록하는 것이 었습니다. 이것의 수정 된 버전은 나를 위해 잘 작동했습니다.
Ébe Isaac

6
범례를 얻으려면 ax.legend (). get_texts ()를 사용하십시오. Matplotlib 1.4에서 테스트되었습니다.
James S.

이것은 가장 직접적인 질문에 대답합니다. 감사합니다.
jimh

ax=plt.gca()축을 정의하지 않고 플롯을 만든 경우에 필요할 수 있습니다.
dylnan

@ 제임스. 대신 에 값을 반환하는 것 외에도 기본 매개 변수를 사용 하여 전체 범례를 다시 그리 ax.get_legend().get_texts()므로 사용 ax.legend()하십시오 ax.get_legend().
Guimoute

69

업데이트 : 약간 더 나은 방법은 답변의 맨 아래를 참조하십시오.
업데이트 # 2 : 범례 제목 글꼴도 변경했습니다.
업데이트 # 3 : Matplotlib 2.0.0 에는 로그 축의 눈금 레이블이 기본 글꼴 로 돌아가는 버그 가 있습니다 . 2.0.1에서 수정해야하지만 답변의 두 번째 부분에 해결 방법이 포함되어 있습니다.

이 답변은 범례를 포함하여 모든 글꼴을 변경하려는 사람과 각 항목마다 다른 글꼴과 크기를 사용하려는 사람을위한 것입니다. 그것은 rc를 사용하지 않습니다 (저에게는 효과가없는 것 같습니다). 다소 번거롭지 만 개인적으로 다른 방법을 사용할 수 없었습니다. 그것은 기본적으로 ryggyr의 답변을 여기에 다른 답변과 결합합니다.

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_pathfont_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 (American Modeling Teacher of America) 포럼을 게시함으로써 이것을 배웠다. 위 코드의 예 :여기에 이미지 설명을 입력하십시오


7
축 레이블이 잘리지 않도록하려면 bbox_inches인수 와 함께 Figure를 저장하십시오.fig.savefig('Basic.png', bbox_inches="tight")
Paw

그림을 저장하지 않으면 어떻게됩니까? Juypter Notebook에서 플로팅하고 결과 축 레이블이 잘립니다.
Zythyr

감사! dpi 설정을 지적하면 모든 줄 크기, 글꼴 크기 등을 조정할 필요없이 플롯의 인쇄 가능한 버전을 준비하는 데 매우 도움이되었습니다.
ybull

27

사용하다 plt.tick_params(labelsize=14)


4
제한적이고 즉각적인 도움을 줄 수있는 코드 스 니펫에 감사드립니다. 적절한 설명은 왜 이것이 문제에 대한 좋은 해결책인지 설명함으로써 장기적인 가치 를 크게 향상시킬 것이며 , 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 가정을 포함하여 설명을 추가하려면 답변을 편집하십시오.
sepehr

22

당신이 사용할 수있는 plt.rcParams["font.size"]설정 font_sizematplotlib또한 당신이 사용할 수있는 plt.rcParams["font.family"]설정 font_familymatplotlib. 이 예를보십시오 :

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

Huster 교수에 동의하는 가장 간단한 방법은 그림의 크기를 변경하여 기본 글꼴을 유지할 수 있다는 것입니다. 축 레이블이 잘려서 그림을 pdf로 저장할 때 bbox_inches 옵션으로 이것을 보완해야했습니다.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.