Cara mengubah ukuran font pada plot matplotlib

542

Bagaimana cara mengubah ukuran font untuk semua elemen (kutu, label, judul) pada plot matplotlib?

Saya tahu cara mengubah ukuran label centang, ini dilakukan dengan:

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

Tetapi bagaimana seseorang mengubah sisanya?

Herman Schaaf
sumber

Jawaban:

630

Dari dokumentasi matplotlib ,

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

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

Ini mengatur font semua item ke font yang ditentukan oleh objek kwargs font,.

Atau, Anda juga bisa menggunakan rcParams updatemetode seperti yang disarankan dalam jawaban ini :

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

atau

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

Anda dapat menemukan daftar lengkap properti yang tersedia di halaman Customizing matplotlib .

Herman Schaaf
sumber
2
bagus, kecuali itu menimpa semua properti fontsize yang ditemukan di jalan è_é
yota
2
Mana saya dapat menemukan lebih banyak pilihan untuk unsur-unsur seperti 'family', 'weight', dll?
pukul
2
@HermanSchaaf; Saya mengunjungi halaman itu sebelumnya. Saya ingin tahu semua pilihan untuk 'family'Seperti 'normal', 'sans-serif', dll
haccks
77
Karena banyak orang mulai dengan import matplotlib.pyplot as plt, Anda mungkin ingin menunjukkan bahwa pyplotmemiliki rcjuga. Anda dapat melakukannya plt.rc(...tanpa harus mengubah impor Anda.
LondonRob
21
Untuk yang tidak sabar: Ukuran font default adalah 10, seperti pada tautan kedua.
FvD
304

Jika Anda adalah orang gila kontrol seperti saya, Anda mungkin ingin mengatur secara eksplisit semua ukuran font Anda:

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

Perhatikan bahwa Anda juga dapat mengatur ukuran yang memanggil rcmetode matplotlib:

import matplotlib

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

# and so on ...
Pedro M Duarte
sumber
9
Saya mencoba banyak jawaban. Yang ini terlihat yang terbaik, setidaknya di notebook Jupyter. Cukup salin blok di atas di bagian atas dan sesuaikan konstanta ukuran font tiga.
fviktor
3
Setuju dengan fvitkor, itu jawaban terbaik!
SeF
9
Bagi saya ukuran judul tidak berfungsi. Saya menggunakan:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G
1
Saya pikir Anda dapat menggabungkan semua pengaturan untuk objek yang sama menjadi satu baris. Misalnya,plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen
198
matplotlib.rcParams.update({'font.size': 22})
Marius Mulai lagi
sumber
1
Seandainya solusi ini bekerja hanya jika saya membuat plot pertama, kemudian "perbarui" seperti yang disarankan, yang mengarah ke ukuran font yang diperbarui untuk angka-angka baru. Mungkin plot pertama diperlukan untuk menginisialisasi rcParams ...
Songio
191

Jika Anda ingin mengubah ukuran font hanya untuk plot tertentu yang telah dibuat, coba ini:

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
sumber
1
Tujuan saya adalah agar font label, kutu, dan judul memiliki ukuran yang berbeda. Versi modifikasi ini bekerja sangat baik untuk saya.
Ébe Isaac
6
Untuk mendapatkan legenda juga gunakan ax.legend (). Get_texts (). Diuji pada Matplotlib 1.4.
James S.
Ini menjawab pertanyaan paling langsung. Terima kasih.
jimh
Mungkin perlu ax=plt.gca()jika plot dibuat tanpa mendefinisikan sumbu.
dylnan
@ James. Sebaliknya digunakan ax.get_legend().get_texts(), karena ax.legend()menggambar ulang seluruh legenda dengan parameter default di atas mengembalikan nilai ax.get_legend().
Guimoute
69

Pembaruan: Lihat bagian bawah jawaban untuk cara yang sedikit lebih baik melakukannya.
Pembaruan # 2: Saya telah menemukan perubahan font judul legenda juga.
Pembaruan # 3: Ada bug di Matplotlib 2.0.0 yang menyebabkan label centang untuk sumbu logaritmik kembali ke font default. Harus diperbaiki di 2.0.1 tapi saya sudah memasukkan solusinya di bagian 2 dari jawabannya.

Jawaban ini untuk siapa saja yang mencoba mengubah semua font, termasuk untuk legenda, dan bagi siapa saja yang mencoba menggunakan font dan ukuran yang berbeda untuk setiap hal. Itu tidak menggunakan rc (yang sepertinya tidak bekerja untuk saya). Ini agak rumit tetapi saya tidak bisa memahami metode lain secara pribadi. Ini pada dasarnya menggabungkan jawaban ryggyr di sini dengan jawaban lain pada 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()

Manfaat dari metode ini adalah bahwa, dengan memiliki beberapa kamus font, Anda dapat memilih font / ukuran / berat / warna yang berbeda untuk berbagai judul, memilih font untuk label centang, dan memilih font untuk legenda, semuanya secara independen.


MEMPERBARUI:

Saya telah mengerjakan pendekatan yang sedikit berbeda, kurang berantakan yang menghilangkan kamus font, dan memungkinkan font apa pun pada sistem Anda, bahkan font .otf. Untuk memiliki font yang terpisah untuk setiap hal, cukup tulis variabel yang lebih banyak font_pathdan font_propsukai.

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

Semoga ini jawaban yang komprehensif

binaryfunt
sumber
40

Berikut ini adalah pendekatan yang sangat berbeda yang bekerja sangat baik untuk mengubah ukuran font:

Ubah ukuran gambar !

Saya biasanya menggunakan kode seperti ini:

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)

Semakin kecil Anda membuat ukuran gambar, semakin besar font relatif terhadap plot . Ini juga meningkatkan penanda. Catatan saya juga mengatur dpiatau dot per inci. Saya belajar ini dari sebuah postingan di forum AMTA (American Modeling Teacher of America). Contoh dari kode di atas:masukkan deskripsi gambar di sini

Prof Huster
sumber
7
Untuk menghindari pemotongan label sumbu, simpan gambar dengan bbox_inchesargumen fig.savefig('Basic.png', bbox_inches="tight")
Paw
Bagaimana jika saya TIDAK menyimpan angka tersebut? Saya merencanakan di Juypter Notebook dan label sumbu yang dihasilkan mendapatkan cut-off.
Zythyr
Terima kasih! Menunjukkan pengaturan dpi sangat membantu saya dalam mempersiapkan versi plot saya yang dapat dicetak tanpa harus menyesuaikan semua ukuran garis, ukuran font, dll.
ybull
27

Menggunakan plt.tick_params(labelsize=14)

Andrey Nikishaev
sumber
4
Terima kasih atas cuplikan kode, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menjelaskan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
sepehr
22

Anda dapat menggunakan plt.rcParams["font.size"]untuk menetapkan font_sizedi matplotlibdan juga Anda dapat menggunakan plt.rcParams["font.family"]untuk menetapkan font_familydi matplotlib. Coba contoh ini:

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')
baziyad hamed
sumber
10

Inilah yang biasanya saya gunakan di 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)
stackoverflowuser2010
sumber
8

Berdasarkan hal-hal di atas:

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)
nvd
sumber
5

Ini adalah ekstensi untuk jawaban Marius Retegan . Anda dapat membuat file JSON terpisah dengan semua modifikasi Anda dan memuatnya dengan rcParams.update. Perubahan hanya akan berlaku untuk skrip saat ini. Begitu

import json
from matplotlib import pyplot as plt, rcParams

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

dan simpan 'example_file.json' ini di folder yang sama.

{
  "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": ""
}
Michael H.
sumber
4

Saya sepenuhnya setuju dengan Prof Huster bahwa cara paling sederhana untuk melanjutkan adalah mengubah ukuran gambar, yang memungkinkan menjaga font default. Saya hanya perlu melengkapi ini dengan opsi bbox_inches ketika menyimpan gambar sebagai pdf karena label sumbu dipotong.

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

sumber