Làm thế nào để thay đổi phông chữ trong matplotlib (python)?


84

Nghe có vẻ là một vấn đề dễ dàng nhưng tôi không tìm thấy bất kỳ giải pháp hiệu quả nào để thay đổi phông chữ (không phải kích thước phông chữ) trong một âm mưu được thực hiện bằng matplotlib trong python.

Tôi đã tìm thấy một số hướng dẫn để thay đổi phông chữ mặc định của matplotlib bằng cách sửa đổi một số tệp trong các thư mục nơi matplotlib lưu trữ phông chữ mặc định của nó - hãy xem bài đăng trên blog này - nhưng tôi đang tìm kiếm một giải pháp ít triệt để hơn vì tôi muốn sử dụng nhiều hơn một phông chữ trong biểu đồ của tôi (văn bản, nhãn, nhãn trục, v.v.).


Rất vui vì nó đã giúp :) Bạn có thể đăng mã gây ra lỗi này không? Bản thân tôi chưa gặp lỗi này nhưng đây là một số liên kết có thể giúp bạn. matplotlib.1069221.n5.nabble.com/… matplotlib.1069221.n5.nabble.com/Fonts-not-found-td12936.html
aidnani8

Mã tạo ra sự cố là: hfont = {'fontname':'Helvetica'} plt.annotate('Country ', (0.17,0.95), xytext=None, xycoords='figure fraction',size=28, color='red', horizontalalignment = 'left', **hfont)và lỗi xảy ra /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/m‌​atplotlib/font_manager.py:1236: UserWarning: findfont: Font family ['Helvetica'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext]))nếu tôi sử dụng tên phông chữ là Comic Sans MS như trong ví dụ của bạn, mã hoạt động.
SirC

Câu trả lời:


98

Giả sử bạn muốn Comic Sans cho tiêu đề và Helvetica cho nhãn x.

csfont = {'fontname':'Comic Sans MS'}
hfont = {'fontname':'Helvetica'}

plt.title('title',**csfont)
plt.xlabel('xlabel', **hfont)
plt.show()

1
Tôi đã thử và nó hoạt động! Nó chính xác là những gì tôi đang tìm kiếm. Tuy nhiên, đối với một số phông chữ tôi có được thông báo lỗi sau đây (không phải cho tất cả): /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/font_manager.py:1236: UserWarning: findfont: Font family ['Helvetica'] not found. Falling back to Bitstream Vera Sans (prop.get_family(), self.defaultFamily[fontext])). Làm cách nào để cài đặt Helvetica trong bộ phông chữ mà matplotlib biết?
SirC

4
tìm tệp fontList.cache, bạn chỉ có thể sử dụng những tệp được liệt kê ở đó. Ngoài ra, hãy xem tại đây stackoverflow.com/questions/20206906/…
B.Kocis

3
theo dõi nhận xét trên. Để tìm tệp fontList.cache của bạn, hãy sử dụng matplotlib.get_cachedir ()
CS

48

Bạn cũng có thể sử dụng rcParamsđể thay đổi họ phông chữ trên toàn cầu.

 import matplotlib.pyplot as plt
 plt.rcParams["font.family"] = "cursive"
 # This will change to your computer's default cursive font

Danh sách các đối số họ phông chữ của matplotlib có ở đây .


19

Tôi thích tuyển dụng:

from matplotlib import rc
#rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
rc('font',**{'family':'serif','serif':['Times']})
rc('text', usetex=True)

8
import pylab as plb
plb.rcParams['font.size'] = 12

hoặc là

import matplotlib.pyplot as mpl
mpl.rcParams['font.size'] = 12

9
cực kỳ đủ, đây chính xác là lệnh mà tôi đang tìm kiếm. chắc chắn không phải những gì OP đang yêu cầu
màu xanh lam

2

Phông chữ Helvetica không có trong Windows, vì vậy để sử dụng phông chữ này, bạn phải tải xuống dưới dạng tệp .ttf. Sau đó, bạn có thể giới thiệu matplotlib với nó như thế này (thay thế "crm10.ttf" bằng tệp của bạn):

import os
from matplotlib import font_manager as fm, rcParams
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

fpath = os.path.join(rcParams["datapath"], "fonts/ttf/cmr10.ttf")
prop = fm.FontProperties(fname=fpath)
fname = os.path.split(fpath)[1]
ax.set_title('This is a special font: {}'.format(fname), fontproperties=prop)
ax.set_xlabel('This is the default font')

plt.show()

print(fpath) sẽ chỉ cho bạn nơi bạn nên đặt .ttf.

Bạn có thể xem kết quả tại đây: https://matplotlib.org/gallery/api/font_file.html


Có cách nào để thiết lập fontpropertiestrên toàn cầu, do đó bạn không cần phải xác định nó với tất cả các cuộc gọi đến ví dụ set_title(), set_xlabel()vv?
Kyle Mills

1
^ Để trả lời câu hỏi của riêng tôi: stackoverflow.com/questions/35668219
Kyle Mills
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.