Làm cách nào để đặt tiêu đề hình và kích thước phông chữ nhãn trong Matplotlib?


531

Tôi đang tạo một hình trong Matplotlib như thế này:

from matplotlib import pyplot as plt

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title')
plt.xlabel('xlabel')
plt.ylabel('ylabel')
fig.savefig('test.jpg')

Tôi muốn chỉ định kích thước phông chữ cho tiêu đề hình và nhãn trục. Tôi cần cả ba kích cỡ phông chữ khác nhau, vì vậy việc đặt kích thước phông chữ chung ( mpl.rcParams['font.size']=x) không phải là điều tôi muốn. Làm cách nào để đặt kích thước phông chữ cho tiêu đề hình và nhãn trục riêng lẻ?


1
Tôi tò mò vì vậy tôi đã thử thêm mpl.rcParams['font.size'] = 20giá trị của bạn và thử thay đổi giá trị thành 10 và 14. Đầu tiên tôi thấy rằng tôi đã gặp lỗi trừ khi tôi đổi mplthành plt. Sự thay đổi đó đã xóa lỗi nhưng sau đó dòng mã không ảnh hưởng đến tiêu đề hoặc nhãn của tôi. Chắc chắn cú pháp này là đúng?
TMWP

Bây giờ tôi đang suy nghĩ từ các ý kiến ​​về câu trả lời được chấp nhận rằng vấn đề có thể là câu lệnh nhập của tôi mặc dù tại sao nó không gây ra lỗi nếu tôi không nhập lệnh nằm ngoài tôi. Có dòng nhập nào khác mà bạn đã sử dụng khi kiểm tra mpllệnh không?
TMWP

Câu trả lời:


774

Chức năng đối phó với văn bản như label, titlevv chấp nhận các thông số tương tự như matplotlib.text.Text. Đối với kích thước phông chữ bạn có thể sử dụng size/fontsize:

from matplotlib import pyplot as plt    

fig = plt.figure()
plt.plot(data)
fig.suptitle('test title', fontsize=20)
plt.xlabel('xlabel', fontsize=18)
plt.ylabel('ylabel', fontsize=16)
fig.savefig('test.jpg')

Đối với cài đặt titlelabelkích thước toàn cầu , mpl.rcParamscó chứa axes.titlesizeaxes.labelsize. (Từ trang):

axes.titlesize      : large   # fontsize of the axes title
axes.labelsize      : medium  # fontsize of the x any y labels

(Theo như tôi có thể thấy, không có cách nào để đặt xykích thước nhãn riêng biệt.)

Và tôi thấy điều axes.titlesizeđó không ảnh hưởng suptitle. Tôi đoán, bạn cần phải thiết lập bằng tay.


cảm ơn! Có cách nào để thiết lập điều đó trên toàn cầu nhưng rõ ràng cho (suptitle, xlabel, ylabel) không? Tôi đang tạo ra rất nhiều biểu đồ và chỉ muốn xác định nó một lần ...
Vasek1

@ Vasek1: Tôi nghĩ bạn không muốn thiết lập toàn cầu :). Cho rằng bạn cần mpl.rcParams. Tôi đã chỉnh sửa câu trả lời của mình.
Avaris

16
Cho bất cứ ai khác như tôi đang tìm giải pháp để thay đổi tiêu đề:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen

Từ rcParamsliên kết, sử dụng figure.titlesizengoài axes.titlesize.
Nhà vật lý điên

1
@AlexanderMcFarlane. Tôi chạy python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Kết quả là 1.5.1, True. 1) Phiên bản nào của matplotlib bạn đang sử dụng? Phiên bản nào của Python? 2) Nó có thể là một lỗi trong một số lý do mà nó chấp nhận strnhưng không phải unicodetrong Py2?
Nhà vật lý điên

90

Bạn cũng có thể thực hiện việc này trên toàn cầu thông qua từ điển RCParams:

import matplotlib.pylab as pylab
params = {'legend.fontsize': 'x-large',
          'figure.figsize': (15, 5),
         'axes.labelsize': 'x-large',
         'axes.titlesize':'x-large',
         'xtick.labelsize':'x-large',
         'ytick.labelsize':'x-large'}
pylab.rcParams.update(params)

5
Các kích thước khác bên cạnh là 'x-large'gì?
Martin Thoma

15
'xx-small', 'x-small', 'small', 'vừa', 'lớn', 'x-Large', 'xx-Large'. Xem matplotlib.org/api/ Từ
tsando

Sử dụng pylab.rcParams.keys() để xem danh sách đầy đủ các tham số.
Nertal

Cảm ơn. Có cách nào để thiết lập toàn cầu kích thước rõ ràng số cho tiêu đề và trục-nhãn thay vì lúc nào cũng làm ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Có vẻ như rcParamschỉ chấp nhận chuỗi.
hồ bấm giờ

4
Bạn cũng có thể sử dụng số ...'axes.labelsize': 32,
mimoralea

65

Nếu bạn đã quen với việc sử dụng axcác đối tượng để thực hiện âm mưu của mình, bạn có thể thấy ax.xaxis.label.set_size()dễ nhớ hơn hoặc ít nhất là dễ tìm thấy hơn bằng cách sử dụng tab trong thiết bị đầu cuối ipython. Nó dường như cần một hoạt động vẽ lại sau để thấy hiệu quả. Ví dụ:

import matplotlib.pyplot as plt

# set up a plot with dummy data
fig, ax = plt.subplots()
x = [0, 1, 2]
y = [0, 3, 9]
ax.plot(x,y)

# title and labels, setting initial sizes
fig.suptitle('test title', fontsize=12)
ax.set_xlabel('xlabel', fontsize=10)
ax.set_ylabel('ylabel', fontsize='medium')   # relative to plt.rcParams['font.size']

# setting label sizes after creation
ax.xaxis.label.set_size(20)
plt.draw()

Tôi không biết một cách tương tự để đặt kích thước suptitle sau khi nó được tạo.


fig.suptitle('test title', fontsize = 20)dường như làm việc ax.set_xlabel('xlabel', fontsize = 20)' also works, in which case we can do away with ax.xaxis.label.set_size (20) `.
T_T

1
@T_T Điều đó đúng và các hình thức này tương tự như câu trả lời của Avaris ở trên. Tôi sẽ thêm chúng cho đầy đủ. Tôi vẫn tìm thấy cách sử dụng ax.xaxis.label.set_size()khi tôi làm việc tương tác với một âm mưu ipython và tôi muốn đánh giá trực quan nhanh về nhiều kích cỡ phông chữ.
spinup

Bạn có biết liệu có sự khác biệt (ẩn) nào giữa việc sử dụng các đối tượng rìu và các đối tượng hình hay cả hai đều tương đương hoàn hảo không? Tại sao có các giao diện khác nhau cho một số tính năng? (plt.xlabel () so với ax.set_xlabel ())
Normanius

1
@normanius, nếu bạn có nghĩa là ax và fig trong ví dụ trên, chúng là những đối tượng khá khác nhau - fig là hình tổng thể, có thể chứa một số trục. Vì vậy, fig và ax có tính chất khác nhau. Xét về sự khác biệt giữa các cuộc gọi loại pyplot và các cuộc gọi đối tượng (ví dụ như plt.xlabel()so với ax.set_xlabel()như bạn nói), chúng tương đương nhau, với sự cảnh báo rằng các plt.*chức năng hoạt động trên trục / hình hiện tại . Vì vậy, khi bạn thiết lập một hình có nhiều trục, có thể bạn sẽ muốn sử dụng các cuộc gọi rõ ràng như ax1.set_xlabel()để tránh nhầm lẫn.
spinup

20

Để chỉ sửa đổi phông chữ của tiêu đề (chứ không phải phông chữ của trục) tôi đã sử dụng cách này:

import matplotlib.pyplot as plt
fig = plt.Figure()
ax = fig.add_subplot(111)
ax.set_title('My Title', fontdict={'fontsize': 8, 'fontweight': 'medium'})

Fontdict chấp nhận tất cả các kwarg từ matplotlib.text.Text .


8

Theo hướng dẫn chính thức , sử dụng pylabkhông còn được khuyến khích. matplotlib.pyplotnên được sử dụng trực tiếp thay thế.

Cài đặt toàn cầu kích thước phông chữ thông qua rcParamsnên được thực hiện với

import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 16
plt.rcParams['axes.titlesize'] = 16

# or

params = {'axes.labelsize': 16,
          'axes.titlesize': 16}
plt.rcParams.update(params)

# or

import matplotlib as mpl
mpl.rc('axes', labelsize=16, titlesize=16)

# or 

axes = {'labelsize': 16,
        'titlesize': 16}
mpl.rc('axes', **axes)

Mặc định có thể được khôi phục bằng cách sử dụng

plt.rcParams.update(plt.rcParamsDefault)

Bạn cũng có thể làm điều này bằng cách tạo một biểu định kiểu trong stylelibthư mục trong thư mục cấu hình matplotlib (bạn có thể lấy thư mục cấu hình của mình từ đó matplotlib.get_configdir()). Định dạng biểu định kiểu là

axes.labelsize: 16
axes.titlesize: 16

Nếu bạn có một biểu định kiểu tại /path/to/mpl_configdir/stylelib/mystyle.mplstylethì bạn có thể sử dụng nó qua

plt.style.use('mystyle')

# or, for a single section

with plt.style.context('mystyle'):
    # ...

Bạn cũng có thể tạo (hoặc sửa đổi) tệp matplotlibrc chia sẻ định dạng

axes.labelsize = 16
axes.titlesize = 16

Tùy thuộc vào tệp matplotlibrc nào bạn sửa đổi những thay đổi này sẽ chỉ được sử dụng cho thư mục làm việc hiện tại, cho tất cả các thư mục làm việc không có tệp matplotlibrc hoặc cho tất cả các thư mục làm việc không có tệp matplotlibrc và không có tệp matplotlibrc nào khác đã được chỉ định. Xem phần này của trang matplotlib tùy chỉnh để biết thêm chi tiết.

Một danh sách đầy đủ các rcParamsphím có thể được truy xuất thông qua plt.rcParams.keys(), nhưng để điều chỉnh kích thước phông chữ bạn có (chữ nghiêng được trích dẫn từ đây )

  • axes.labelsize- Cỡ chữ của nhãn x và y
  • axes.titlesize- Cỡ chữ của tiêu đề trục
  • figure.titlesize- Kích thước của tiêu đề hình ( Figure.suptitle())
  • xtick.labelsize- Phông chữ của nhãn tick
  • ytick.labelsize- Phông chữ của nhãn tick
  • legend.fontsize- Cỡ chữ cho truyền thuyết ( plt.legend(), fig.legend())
  • legend.title_fontsize- Fontsize cho các tiêu đề huyền thoại, được Noneđặt giống như các trục mặc định. Xem câu trả lời này cho ví dụ sử dụng.

tất cả đều chấp nhận kích thước chuỗi {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}hoặc floattrong pt. Kích thước chuỗi được xác định tương ứng với kích thước phông chữ mặc định được chỉ định bởi

  • font.size- kích thước phông chữ mặc định cho văn bản, được đưa ra trong pts. 10 pt là giá trị tiêu chuẩn

Ngoài ra, trọng lượng có thể được chỉ định (mặc dù chỉ cho mặc định nó xuất hiện) bởi

  • font.weight- Trọng lượng mặc định của phông chữ được sử dụng bởi text.Text. Chấp nhận {100, 200, 300, 400, 500, 600, 700, 800, 900}hoặc 'normal'(400), 'bold'(700) 'lighter''bolder'( tương đối với trọng lượng hiện tại ).

2

Một giải pháp thay thế để thay đổi kích thước phông chữ là thay đổi phần đệm. Khi Python lưu PNG của bạn, bạn có thể thay đổi bố cục bằng hộp thoại mở ra. Khoảng cách giữa các trục, phần đệm nếu bạn thích có thể được thay đổi ở giai đoạn này.



-3

7 (giải pháp tốt nhất)

 from numpy import*
 import matplotlib.pyplot as plt
 X = linspace(-pi, pi, 1000)

class Crtaj:

    def nacrtaj(self,x,y):
         self.x=x
         self.y=y
         return plt.plot (x,y,"om")

def oznaci(self):
    return plt.xlabel("x-os"), plt.ylabel("y-os"), plt.grid(b=True)

6 (giải pháp hơi tệ hơn)

from numpy import*
M = array([[3,2,3],[1,2,6]])
class AriSred(object):
    def __init__(self,m):
    self.m=m

def srednja(self):
    redovi = len(M)
    stupci = len (M[0])
    lista=[]
    a=0
    suma=0
    while a<stupci:
        for i in range (0,redovi):
            suma=suma+ M[i,a]
        lista.append(suma)
        a=a+1
        suma=0
    b=array(lista) 
    b=b/redovi
    return b



OBJ = AriSred(M)
sr = OBJ.srednja()

2
Mặc dù mã này có thể cung cấp giải pháp cho vấn đề của OP, nhưng chúng tôi khuyên bạn nên cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi. Mã chỉ trả lời thường trở nên vô dụng trong thời gian dài bởi vì những người xem trong tương lai gặp vấn đề tương tự không thể hiểu được lý do đằng sau giải pháp.
E. Zeytinci
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.