Cách thay đổi kích thước phông chữ trên lô matplotlib


542

Làm thế nào để một người thay đổi kích thước phông chữ cho tất cả các yếu tố (đánh dấu, nhãn, tiêu đề) trên một âm mưu matplotlib?

Tôi biết cách thay đổi kích thước nhãn tick, điều này được thực hiện với:

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

Nhưng làm thế nào để thay đổi phần còn lại?

Câu trả lời:


629

Từ tài liệu matplotlib ,

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

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

Cái này đặt phông chữ của tất cả các mục thành phông chữ được chỉ định bởi đối tượng kwargs, font .

Ngoài ra, bạn cũng có thể sử dụng rcParams updatephương pháp như được đề xuất trong câu trả lời này :

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

hoặc là

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

Bạn có thể tìm thấy một danh sách đầy đủ các thuộc tính có sẵn trên trang Tùy chỉnh matplotlib .


2
tốt đẹp, ngoại trừ nó ghi đè lên bất cứ tài sản fontsize tìm thấy trên đó là cách è_é
Yota

2
Tôi có thể tìm thêm nhiều lựa chọn cho các yếu tố như nơi 'family', 'weight'vv?
haccks

2
@HermanSchaaf; Tôi đã truy cập trang đó trước đây. Tôi muốn biết tất cả các tùy chọn cho 'family'Như 'normal', 'sans-serif'vv
haccks

77
Kể từ khi nhiều người bắt đầu với import matplotlib.pyplot as plt, bạn có thể muốn chỉ ra rằng pyplotrclà tốt. Bạn có thể làm plt.rc(...mà không phải thay đổi nhập khẩu của bạn.
LondonRob

21
Đối với người thiếu kiên nhẫn: Kích thước phông chữ mặc định là 10, như trong liên kết thứ hai.
FvD

304

Nếu bạn là người thích kiểm soát như tôi, bạn có thể muốn đặt rõ ràng tất cả các kích thước phông chữ của mình:

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

Lưu ý rằng bạn cũng có thể đặt kích thước gọi rcphương thức trên matplotlib:

import matplotlib

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

# and so on ...

9
Tôi đã thử nhiều câu trả lời. Cái này có vẻ tốt nhất, ít nhất là trong máy tính xách tay Jupyter. Chỉ cần sao chép khối trên ở trên và tùy chỉnh ba hằng số cỡ chữ.
fviktor

3
Đồng ý với fvitkor, đó là câu trả lời tốt nhất!
SeF

9
Đối với tôi kích thước tiêu đề không hoạt động. Tôi đã sử dụng:plt.rc('axes', titlesize=BIGGER_SIZE)
Fernando Irarrázaval G

1
Tôi nghĩ bạn có thể kết hợp tất cả các cài đặt cho cùng một đối tượng thành một dòng. Ví dụ:plt.rc('axes', titlesize=SMALL_SIZE, labelsize=MEDIUM_SIZE)
BallpointBen

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

1
Trong trường hợp có thể, giải pháp này chỉ hoạt động nếu tôi tạo một âm mưu đầu tiên, sau đó "cập nhật" như được đề xuất, dẫn đến kích thước phông chữ được cập nhật cho các số liệu mới. Có lẽ cốt truyện đầu tiên là cần thiết để khởi tạo RCParams ...
Songio

191

Nếu bạn muốn thay đổi kích thước phông chữ cho một cốt truyện cụ thể đã được tạo, hãy thử điều này:

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
Mục đích của tôi là có phông chữ của nhãn xy, dấu tick và tiêu đề có kích cỡ khác nhau. Một phiên bản sửa đổi của điều này làm việc rất tốt cho tôi.
Ébe Isaac

6
Để có được các huyền thoại cũng sử dụng ax.legend (). Get_texts (). Đã thử nghiệm trên Matplotlib 1.4.
James S.

Điều này trả lời câu hỏi trực tiếp nhất. Cảm ơn bạn.
21 giờ 49 phút

Có thể cần một ax=plt.gca()nếu cốt truyện được tạo mà không xác định một trục.
dyl Nam

@JamesS. Thay vì sử dụng ax.get_legend().get_texts(), bởi vì ax.legend()vẽ lại toàn bộ chú giải với các tham số mặc định ở trên cùng trả về giá trị của ax.get_legend().
Guimoute

69

Cập nhật: Xem phần dưới của câu trả lời để biết cách làm tốt hơn một chút.
Cập nhật # 2: Tôi cũng đã tìm ra việc thay đổi phông chữ tiêu đề huyền thoại.
Cập nhật # 3:lỗi trong Matplotlib 2.0.0 gây ra các nhãn đánh dấu cho các trục logarit trở lại phông chữ mặc định. Cần được sửa trong 2.0.1 nhưng tôi đã bao gồm cách giải quyết trong phần 2 của câu trả lời.

Câu trả lời này dành cho bất kỳ ai đang cố gắng thay đổi tất cả các phông chữ, bao gồm cả chú giải và cho bất kỳ ai đang cố gắng sử dụng các phông chữ và kích cỡ khác nhau cho mỗi thứ. Nó không sử dụng RC (dường như không hoạt động đối với tôi). Nó khá cồng kềnh nhưng tôi không thể nắm bắt được bất kỳ phương pháp nào khác. Về cơ bản, nó kết hợp câu trả lời của ryggyr ở đây với các câu trả lời khác về 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()

Lợi ích của phương pháp này là, bằng cách có một số từ điển phông chữ, bạn có thể chọn các phông chữ / kích cỡ / trọng lượng / màu sắc khác nhau cho các tiêu đề khác nhau, chọn phông chữ cho nhãn tick và chọn phông chữ cho chú giải, tất cả đều độc lập.


CẬP NHẬT:

Tôi đã tìm ra một cách tiếp cận hơi khác, ít lộn xộn hơn với các từ điển phông chữ và cho phép bất kỳ phông chữ nào trên hệ thống của bạn, ngay cả các phông chữ .otf. Để có phông chữ riêng cho từng thứ, chỉ cần viết nhiều hơn font_pathfont_propthích các biến.

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

Hy vọng rằng đây là một câu trả lời toàn diện


40

Đây là một cách tiếp cận hoàn toàn khác nhau có hiệu quả đáng ngạc nhiên để thay đổi kích thước phông chữ:

Thay đổi kích thước con số !

Tôi thường sử dụng mã như thế này:

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)

Bạn càng làm cho kích thước hình càng nhỏ, phông chữ càng lớn so với cốt truyện . Điều này cũng nâng cao các điểm đánh dấu. Lưu ý tôi cũng đặt dpihoặc chấm trên mỗi inch. Tôi đã học được điều này từ một bài đăng trên diễn đàn AMTA (American Model teacher of America). Ví dụ từ mã trên:nhập mô tả hình ảnh ở đây


7
Để tránh nhãn trục bị cắt, hãy lưu hình với bbox_inchesđối số fig.savefig('Basic.png', bbox_inches="tight")
Chân

Nếu tôi KHÔNG lưu hình thì sao? Tôi đang vẽ trong Juypter Notebook và các nhãn trục kết quả bị cắt.
Zythyr

Cảm ơn! Chỉ ra các cài đặt dpi cực kỳ hữu ích với tôi trong việc chuẩn bị các phiên bản có thể in của các lô của tôi mà không phải điều chỉnh tất cả các kích cỡ dòng, kích thước phông chữ, v.v.
ybull

27

Sử dụng plt.tick_params(labelsize=14)


4
Cảm ơn bạn về đoạn mã, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách mô tả lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
sepehr

22

Bạn có thể sử dụng plt.rcParams["font.size"]để thiết lập font_sizetrong matplotlibvà bạn cũng có thể sử dụng plt.rcParams["font.family"]để thiết lập font_familytrong matplotlib. Hãy thử ví dụ này:

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

Đây là những gì tôi thường sử dụng trong 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

Dựa trên những thứ trên:

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

Đây là một phần mở rộng cho câu trả lời của Marius Retegan . Bạn có thể tạo một tệp JSON riêng với tất cả các sửa đổi của mình và tải nó bằng RCParams.update. Những thay đổi sẽ chỉ áp dụng cho kịch bản hiện tại. Vì thế

import json
from matplotlib import pyplot as plt, rcParams

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

và lưu 'example_file.json' này trong cùng một thư mục.

{
  "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

Tôi hoàn toàn đồng ý với Giáo sư Huster rằng cách đơn giản nhất để tiến hành là thay đổi kích thước của hình, cho phép giữ các phông chữ mặc định. Tôi chỉ phải bổ sung điều này với tùy chọn bbox_inches khi lưu hình dưới dạng pdf vì các nhãn trục đã bị cắt.

import matplotlib.pyplot as plt
plt.figure(figsize=(4,3))
plt.savefig('Basic.pdf', bbox_inches='tight')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.