วิธีการเปลี่ยนขนาดตัวอักษรบนพล็อต 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
ดียกเว้นมันจะแทนที่คุณสมบัติแบบอักษรใด ๆ ที่พบในวิธีการè_é
yota

2
ที่ฉันสามารถหาตัวเลือกเพิ่มเติมสำหรับองค์ประกอบเช่น'family', 'weight'ฯลฯ ?
haccks

2
@HermanSchaaf; ฉันเคยไปที่หน้านั้นมาก่อน ผมอยากจะรู้ว่าตัวเลือกทั้งหมดที่'family'ชอบ'normal', 'sans-serif'ฯลฯ
haccks

77
เนื่องจากหลายคนเริ่มต้นด้วยimport matplotlib.pyplot as pltคุณอาจต้องการชี้ให้เห็นว่าpyplotมีrcเช่นกัน คุณสามารถทำได้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)
เฟอร์นันโด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

@JamesS ใช้ แต่ax.get_legend().get_texts()เพราะax.legend()Redraws ax.get_legend()ตำนานทั้งที่มีค่าเริ่มต้นที่ด้านบนของกลับค่าของ
Guimoute

69

อัปเดต:ดูที่ด้านล่างของคำตอบเพื่อหาวิธีการที่ดีขึ้นเล็กน้อย
อัปเดต # 2:ฉันก็คิดว่าจะเปลี่ยนแบบอักษรชื่อตำนานด้วย
อัปเดต # 3:มีข้อบกพร่องใน Matplotlib 2.0.0ที่ทำให้เกิดป้ายกำกับขีดสำหรับแกนลอการิทึมเพื่อเปลี่ยนกลับเป็นฟอนต์เริ่มต้น ควรได้รับการแก้ไขใน 2.0.1 แต่ฉันได้รวมวิธีแก้ไขปัญหาไว้ในส่วนที่ 2 ของคำตอบ

คำตอบนี้สำหรับทุกคนที่พยายามเปลี่ยนแบบอักษรทั้งหมดรวมถึงตำนานและสำหรับทุกคนที่พยายามใช้แบบอักษรและขนาดที่แตกต่างกันสำหรับแต่ละสิ่ง มันไม่ได้ใช้ rc (ซึ่งดูเหมือนจะไม่เหมาะกับฉัน) มันค่อนข้างยุ่งยาก แต่ฉันไม่สามารถไปจับด้วยวิธีอื่นใดเป็นการส่วนตัว มันรวมคำตอบของ ryggyr ที่นี่กับคำตอบอื่น ๆ ของ 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()

ประโยชน์ของวิธีนี้คือการมีพจนานุกรมฟอนต์หลายตัวคุณสามารถเลือกฟอนต์ / ขนาด / น้ำหนัก / สีที่แตกต่างกันสำหรับชื่อเรื่องต่าง ๆ เลือกฟอนต์สำหรับเลเบลเห็บและเลือกฟอนต์สำหรับคำอธิบายทั้งหมด


UPDATE:

ฉันได้ทำงานแตกต่างกันเล็กน้อยและมีความยุ่งเหยิงน้อยกว่าซึ่งทำกับพจนานุกรมแบบอักษรและอนุญาตให้ใช้แบบอักษรใด ๆ ในระบบของคุณแม้แต่แบบอักษร. otf มีอักษรที่แยกต่างหากสำหรับแต่ละสิ่งเพียงเขียนมากขึ้นfont_pathและfont_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อาร์กิวเมนต์ fig.savefig('Basic.png', bbox_inches="tight")
Paw

ถ้าฉันไม่บันทึกตัวเลขล่ะ ฉันกำลังวางแผนในสมุดบันทึก Juypter และฉลากแกนที่เกิดขึ้นจะถูกตัดออก
Zythyr

ขอบคุณ! การชี้ให้เห็นการตั้งค่า dpi นั้นมีประโยชน์อย่างมากกับฉันในการเตรียมแปลงเวอร์ชันของฉันสำหรับพิมพ์โดยไม่ต้องปรับขนาดเส้นขนาดตัวอักษรและอื่น ๆ ทั้งหมด
ybull

27

ใช้ plt.tick_params(labelsize=14)


4
ขอบคุณสำหรับข้อมูลโค้ดซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันที คำอธิบายที่เหมาะสมจะช่วยปรับปรุงมูลค่าในระยะยาวได้อย่างมากโดยการอธิบายว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตด้วยคำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อสมมติฐานที่คุณทำ
sepehr

22

คุณสามารถใช้plt.rcParams["font.size"]สำหรับการตั้งค่าfont_sizeในmatplotlibและยังให้คุณสามารถใช้plt.rcParams["font.family"]สำหรับการตั้งค่าในfont_family matplotlibลองตัวอย่างนี้:

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:

# 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

ฉันเห็นด้วยทั้งหมดกับ Prof Huster ว่าวิธีที่ง่ายที่สุดในการดำเนินการต่อคือการเปลี่ยนขนาดของรูปซึ่งช่วยให้สามารถรักษาแบบอักษรเริ่มต้นได้ ฉันแค่ต้องเสริมสิ่งนี้ด้วยตัวเลือก bbox_inches เมื่อบันทึกรูปเป็น pdf เพราะป้ายแกนถูกตัด

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.