ฉันจะตั้งชื่อแบบอักษรและแกนป้ายขนาดตัวอักษรใน Matplotlib ได้อย่างไร


530

ฉันกำลังสร้างร่างใน Matplotlib เช่นนี้:

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

ฉันต้องการระบุขนาดตัวอักษรสำหรับชื่อรูปและป้ายกำกับแกน ฉันต้องการทั้งสามแบบให้มีขนาดแบบอักษรที่แตกต่างกันดังนั้นการตั้งค่าขนาดแบบอักษรทั่วโลก ( mpl.rcParams['font.size']=x) ไม่ใช่สิ่งที่ฉันต้องการ ฉันจะตั้งค่าขนาดตัวอักษรสำหรับชื่อรูปและป้ายชื่อแกนได้อย่างไร?


1
ผมอยากรู้ดังนั้นฉันพยายามเพิ่มของคุณmpl.rcParams['font.size'] = 20และพยายามเปลี่ยนแปลงค่าถึง 10 และ 14 ครั้งแรกที่ฉันพบว่าฉันมีข้อผิดพลาดถ้าฉันเปลี่ยนไปmpl pltการเปลี่ยนแปลงนั้นได้แก้ไขข้อผิดพลาด แต่แล้วบรรทัดของรหัสไม่มีผลต่อชื่อเรื่องหรือป้ายกำกับของฉัน แน่ใจว่าไวยากรณ์นี้ถูกต้องหรือไม่
TMWP

ตอนนี้ฉันกำลังคิดจากความคิดเห็นเกี่ยวกับคำตอบที่ยอมรับว่าปัญหาอาจเป็นคำสั่งการนำเข้าของฉันแม้ว่าเหตุใดจึงไม่โยนข้อผิดพลาดหากฉันไม่ได้นำเข้าคำสั่งนั้นอยู่นอกเหนือฉัน มีสายการนำเข้าอื่นที่คุณใช้เมื่อทดสอบmplคำสั่งหรือไม่
TMWP

คำตอบ:


773

ฟังก์ชั่นการจัดการกับข้อความเช่นlabel, titleฯลฯ matplotlib.text.Textยอมรับพารามิเตอร์เดียวกับ สำหรับขนาดตัวอักษรคุณสามารถใช้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')

สำหรับการตั้งค่าในระดับโลกtitleและlabelขนาดmpl.rcParamsมีและaxes.titlesize axes.labelsize(จากหน้า):

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

(เท่าที่ฉันเห็นไม่มีวิธีตั้งค่าxและyแยกขนาดป้าย)

และผมเห็นว่าไม่ส่งผลกระทบaxes.titlesize suptitleฉันเดาว่าคุณต้องตั้งค่าด้วยตนเอง


ขอบคุณ! มีวิธีการตั้งค่าที่ทั่วโลก แต่อย่างชัดเจนสำหรับ (suptitle, xlabel, ylabel) ฉันกำลังทำมากของแผนภูมิและเพียงแค่ต้องการที่จะระบุว่าครั้ง ...
vasek1

@ vasek1: ฉันคิดว่าคุณไม่ต้องการการตั้งค่าระดับโลก :) mpl.rcParamsสำหรับสิ่งที่คุณต้องการ ฉันแก้ไขคำตอบของฉันแล้ว
Avaris

16
สำหรับคนอื่น ๆ เช่นฉันกำลังมองหาวิธีแก้ปัญหาเพื่อเปลี่ยนชื่อเรื่อง:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen

จากrcParamsการเชื่อมโยงการใช้งานนอกเหนือไปจากfigure.titlesize axes.titlesize
นักฟิสิกส์บ้า

1
@AlexanderMcFarlane python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'ฉันวิ่ง ผลที่ได้คือ1.5.1 , True. 1) คุณใช้ matplotlib รุ่นใดอยู่ Python เวอร์ชันใด 2) มันอาจจะเป็นข้อผิดพลาดที่มีเหตุผลบางอย่างที่จะยอมรับstrแต่ไม่ได้unicodeอยู่ใน Py2?
นักฟิสิกส์บ้า

90

คุณสามารถทำสิ่งนี้ได้ทั่วโลกผ่านพจนานุกรม 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
ขนาดอื่นนอกเหนือจากนี้'x-large'คืออะไร?
Martin Thoma

15
'xx-small', 'x-small', 'small', 'Medium', 'large', 'x-large', 'xx-large' ดูmatplotlib.org/api/…
tsando

ใช้pylab.rcParams.keys()เพื่อดูรายการพารามิเตอร์ทั้งหมด
Nirmal

ขอบคุณ มีวิธีในการตั้งค่าขนาดตัวเลขที่ชัดเจนสำหรับชื่อเรื่องและป้ายกำกับแกนแทนที่จะทำทุกax.set_title('some title', fontsize=15)ครั้งax.set_xlabel('some xlabel', fontsize=12)หรือไม่? ดูเหมือนว่าrcParamsยอมรับเฉพาะสตริง
timgeb

4
คุณสามารถใช้ตัวเลข ...'axes.labelsize': 32,
mimoralea

65

หากคุณคุ้นเคยกับการใช้axวัตถุในการวางแผนมากขึ้นคุณอาจพบว่าax.xaxis.label.set_size()จดจำได้ง่ายขึ้นหรืออย่างน้อยก็หาแท็บได้ง่ายขึ้นในเทอร์มินัล ipython ดูเหมือนว่าจะต้องมีการวาดใหม่หลังจากที่เห็นผล ตัวอย่างเช่น:

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

ฉันไม่รู้วิธีคล้ายกันในการตั้งขนาด suptitle หลังจากสร้างขึ้น


fig.suptitle('test title', fontsize = 20)ดูเหมือนว่าจะทำงาน 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 จริงและแบบฟอร์มเหล่านี้คล้ายกับคำตอบของ Avaris ด้านบน ฉันจะเพิ่มพวกเขาเพื่อความสมบูรณ์ ฉันยังพบการใช้งานax.xaxis.label.set_size()เมื่อฉันทำงานแบบโต้ตอบกับพล็อตipythonและฉันต้องการทำการประเมินภาพแบบรวดเร็วเกี่ยวกับขนาดตัวอักษรที่หลากหลาย
spinup

คุณรู้หรือไม่ว่ามีความแตกต่าง (ซ่อนเร้น) ระหว่างการใช้วัตถุขวานและวัตถุรูปหรือมีความเท่าเทียมกันอย่างสมบูรณ์หรือไม่? เหตุใดจึงมีส่วนต่อประสานที่แตกต่างกันสำหรับคุณสมบัติบางอย่าง (plt.xlabel () กับ ax.set_xlabel ())
normanius

1
@normanius ถ้าคุณหมายถึงขวานและมะเดื่อในตัวอย่างด้านบนพวกมันเป็นวัตถุที่แตกต่างกันมาก - มะเดื่อเป็นตัวเลขโดยรวมซึ่งอาจมีหลายแกน ดังนั้นมะเดื่อและขวานจึงมีคุณสมบัติที่แตกต่างกัน ในแง่ของความแตกต่างระหว่างสายประเภท pyplot และบริการโทรวัตถุ (เช่น plt.xlabel()กับax.set_xlabel()ที่คุณพูดว่า) พวกเขาจะเทียบเท่ากับข้อแม้ที่ว่าplt.*ฟังก์ชั่นการทำงานในปัจจุบันแกน / ตัวเลข ดังนั้นคุณจึงตั้งค่าตัวเลขที่มีหลายแกนคุณอาจต้องการใช้การโทรที่ชัดเจนax1.set_xlabel()เพื่อหลีกเลี่ยงความสับสน
spinup

20

หากต้องการปรับเปลี่ยนแบบอักษรของชื่อเรื่อง (และไม่ใช่แบบอักษรของแกน) ฉันใช้สิ่งนี้:

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

fontdict ยอมรับ kwargs ทั้งหมดจากmatplotlib.text.Text


8

ตามคู่มืออย่างเป็นทางการไม่แนะนำให้ใช้งานpylabอีกต่อไป matplotlib.pyplotควรใช้โดยตรงแทน

ควรตั้งค่าขนาดแบบอักษรทั่วโลกrcParamsด้วย

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)

ค่าเริ่มต้นสามารถเรียกคืนได้โดยใช้

plt.rcParams.update(plt.rcParamsDefault)

คุณยังสามารถทำได้โดยการสร้างสไตล์ชีตในstylelibไดเรกทอรีภายใต้ไดเรกทอรีการกำหนดค่า matplotlib (คุณสามารถรับไดเรกทอรีการกำหนดค่าของคุณได้จากmatplotlib.get_configdir()) รูปแบบของสไตล์ชีทคือ

axes.labelsize: 16
axes.titlesize: 16

หากคุณมีสไตล์ชีท/path/to/mpl_configdir/stylelib/mystyle.mplstyleคุณสามารถใช้สไตล์นี้ได้ผ่านทาง

plt.style.use('mystyle')

# or, for a single section

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

คุณยังสามารถสร้าง (หรือแก้ไข) ไฟล์ matplotlibrcซึ่งแชร์รูปแบบ

axes.labelsize = 16
axes.titlesize = 16

ขึ้นอยู่กับไฟล์ matplotlibrc ที่คุณแก้ไขการเปลี่ยนแปลงเหล่านี้จะใช้เฉพาะกับไดเรกทอรีการทำงานปัจจุบันสำหรับไดเรกทอรีการทำงานทั้งหมดที่ไม่มีไฟล์ matplotlibrc หรือสำหรับไดเรกทอรีการทำงานทั้งหมดที่ไม่มีไฟล์ matplotlibrc และไม่มีไฟล์ matplotlibrc อื่น ๆ ได้รับการระบุ ดูส่วนนี้ของหน้าการปรับแต่ง matplotlib สำหรับรายละเอียดเพิ่มเติม

คุณrcParamsสามารถดึงรายการทั้งหมดของคีย์ได้plt.rcParams.keys()แต่สำหรับการปรับขนาดแบบอักษรที่คุณมี (ตัวเอียงที่ยกมาจากที่นี่ )

  • axes.labelsize- แบบอักษรของป้ายกำกับ x และ y
  • axes.titlesize- แบบอักษรของชื่อแกน
  • figure.titlesize- ขนาดของชื่อรูป ( Figure.suptitle())
  • xtick.labelsize- แบบอักษรของป้ายเห็บ
  • ytick.labelsize- แบบอักษรของป้ายเห็บ
  • legend.fontsize- แบบอักษรสำหรับตำนาน ( plt.legend(), fig.legend())
  • legend.title_fontsize- แบบอักษรสำหรับหัวเรื่องตำนานNoneตั้งค่าเหมือนกับแกนเริ่มต้น ดูคำตอบนี้สำหรับตัวอย่างการใช้งาน

ซึ่งทั้งหมดยอมรับขนาดสตริง{'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}หรือในfloat ptขนาดสตริงจะถูกกำหนดสัมพันธ์กับขนาดตัวอักษรเริ่มต้นซึ่งระบุโดย

  • font.size- ขนาดตัวอักษรเริ่มต้นสำหรับข้อความที่กำหนดใน pts 10 pt คือค่ามาตรฐาน

นอกจากนี้ยังสามารถระบุน้ำหนักได้ (เฉพาะค่าเริ่มต้นที่ปรากฏ) โดย

  • font.weight- text.Textน้ำหนักเริ่มต้นของตัวอักษรที่ใช้โดย ยอมรับ{100, 200, 300, 400, 500, 600, 700, 800, 900}หรือ'normal'(400), 'bold'(700) 'lighter', และ'bolder'( เทียบกับน้ำหนักปัจจุบัน )

2

ทางเลือกอื่นในการเปลี่ยนขนาดตัวอักษรคือการเปลี่ยนช่องว่างภายใน เมื่อ Python บันทึก PNG ของคุณคุณสามารถเปลี่ยนเค้าโครงโดยใช้กล่องโต้ตอบที่เปิดขึ้น ระยะห่างระหว่างแกน, ช่องว่างภายในหากคุณต้องการสามารถเปลี่ยนแปลงได้ในขั้นตอนนี้



-3

7 (ทางออกที่ดีที่สุด)

 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 (ทางออกที่แย่กว่าเล็กน้อย)

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
ในขณะที่รหัสนี้อาจให้วิธีการแก้ปัญหาของ OP ขอแนะนำให้คุณให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถาม โดยทั่วไปคำตอบของรหัสจะไม่มีประโยชน์ในระยะยาวเนื่องจากผู้ชมในอนาคตที่ประสบปัญหาคล้ายกันไม่สามารถเข้าใจเหตุผลที่อยู่เบื้องหลังการแก้ปัญหาได้
E. Zeytinci
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.