Bagaimana cara mengatur judul gambar dan sumbu ukuran font label di Matplotlib?

531

Saya membuat gambar di Matplotlib seperti ini:

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

Saya ingin menentukan ukuran font untuk judul gambar dan label sumbu. Saya membutuhkan ketiganya menjadi ukuran font yang berbeda, jadi mengatur ukuran font global ( mpl.rcParams['font.size']=x) bukan yang saya inginkan. Bagaimana cara mengatur ukuran font untuk judul gambar dan label sumbu secara terpisah?

vasek1
sumber
1
Saya ingin tahu jadi saya mencoba menambahkan Anda mpl.rcParams['font.size'] = 20dan mencoba mengubah nilai menjadi 10 dan 14. Pertama saya menemukan bahwa saya mendapat kesalahan kecuali saya berubah mplmenjadi plt. Perubahan itu menghapus kesalahan tetapi kemudian baris kode tidak berpengaruh pada judul atau label saya. Yakin sintaks ini benar?
TMWP
sekarang saya berpikir dari komentar pada jawaban yang diterima bahwa masalahnya mungkin adalah pernyataan impor saya meskipun mengapa itu tidak menimbulkan kesalahan jika saya tidak mengimpor perintah itu di luar saya. Apakah ada jalur impor lain yang Anda gunakan saat menguji mplperintah?
TMWP

Jawaban:

774

Fungsi berurusan dengan teks seperti label, title, dll menerima parameter yang sama seperti matplotlib.text.Text. Untuk ukuran font Anda dapat menggunakan 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')

Untuk pengaturan titledan labelukuran global , mpl.rcParamsberisi axes.titlesizedan axes.labelsize. (Dari halaman):

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

(Sejauh yang saya bisa lihat, tidak ada cara untuk mengatur xdan ymemberi label ukuran secara terpisah.)

Dan saya melihat itu axes.titlesizetidak mempengaruhi suptitle. Saya kira, Anda perlu mengaturnya secara manual.

Avaris
sumber
Terima kasih! apakah ada cara untuk mengaturnya secara global tetapi secara eksplisit untuk (suptitle, xlabel, ylabel)? Saya membuat banyak grafik dan hanya ingin menentukan sekali ...
vasek1
@ vasek1: Saya pikir Anda tidak ingin pengaturan global :). Untuk itu kamu perlu mpl.rcParams. Saya sudah mengedit jawaban saya.
Avaris
16
Untuk orang lain seperti saya mencari solusi untuk mengubah judul:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
Dari rcParamstautan, gunakan figure.titlesizeselain axes.titlesize.
Fisikawan Gila
1
@AlexanderMcFarlane. Saya berlari python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Hasilnya adalah 1.5.1, True. 1) Apa versi matplotlib yang Anda gunakan? Apa versi Python? 2) Mungkinkah itu bug di mana karena alasan tertentu ia menerima strtetapi tidak unicodedi Py2?
Fisikawan Gila
90

Anda juga dapat melakukan ini secara global melalui kamus 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)
tsando
sumber
5
Apa ukuran lain selain itu 'x-large'?
Martin Thoma
15
'xx-kecil', 'x-kecil', 'kecil', 'sedang', 'besar', 'x-besar', 'xx-besar'. Lihat matplotlib.org/api/…
tsando
Gunakan pylab.rcParams.keys()untuk melihat daftar parameter lengkap.
Nirmal
Terima kasih. Apakah ada cara untuk ukuran mengatur secara global eksplisit numerik untuk judul dan sumbu-label bukan selalu melakukan ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Sepertinya rcParamshanya menerima string.
timgeb
4
Anda juga dapat menggunakan angka ...'axes.labelsize': 32,
mimoralea
65

Jika Anda lebih terbiasa menggunakan axobjek untuk melakukan ploting, Anda mungkin menemukan ax.xaxis.label.set_size()lebih mudah diingat, atau setidaknya lebih mudah untuk menemukan menggunakan tab di terminal ipython. Tampaknya perlu operasi ulang setelah melihat efeknya. Sebagai contoh:

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

Saya tidak tahu cara yang mirip untuk mengatur ukuran suptitle setelah itu dibuat.

putar
sumber
fig.suptitle('test title', fontsize = 20)sepertinya berhasil. 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 Itu benar, dan formulir ini mirip dengan jawaban Avaris di atas. Saya akan menambahkannya untuk kelengkapan. Saya masih menemukan kegunaan ax.xaxis.label.set_size()ketika saya bekerja secara interaktif dengan plot ipython dan saya ingin melakukan penilaian visual cepat dari berbagai ukuran font.
spinup
Apakah Anda tahu jika ada perbedaan (tersembunyi) antara menggunakan objek kapak dan objek gambar, atau keduanya sama-sama setara? Mengapa ada antarmuka yang berbeda untuk beberapa fitur? (plt.xlabel () vs. ax.set_xlabel ())
normanius
1
@normanius, jika yang Anda maksud kapak dan ara dalam contoh di atas, mereka adalah benda yang sangat berbeda - ara adalah angka keseluruhan, yang mungkin mengandung beberapa sumbu. Jadi ara dan kapak memiliki sifat yang berbeda. Dalam hal perbedaan antara jenis pyplot panggilan dan panggilan objek (misalnya plt.xlabel()vs ax.set_xlabel()seperti yang Anda katakan), mereka setara, dengan peringatan bahwa plt.*fungsi bekerja pada saat sumbu / angka. Jadi, jika Anda mengatur angka dengan banyak sumbu, Anda mungkin ingin menggunakan panggilan eksplisit ax1.set_xlabel()untuk menghindari kebingungan.
spinup
20

Untuk hanya memodifikasi font judul (dan bukan font sumbu) saya menggunakan ini:

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

Fontdict menerima semua kwarg dari matplotlib.text.Text .

tammoj
sumber
8

Per panduan resmi , penggunaan pylabtidak lagi direkomendasikan. matplotlib.pyplotharus digunakan secara langsung sebagai gantinya.

Pengaturan ukuran font secara global rcParamsharus dilakukan dengan

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)

Default dapat dipulihkan menggunakan

plt.rcParams.update(plt.rcParamsDefault)

Anda juga dapat melakukan ini dengan membuat style sheet di stylelibdirektori di bawah direktori konfigurasi matplotlib (Anda bisa mendapatkan direktori konfigurasi dari matplotlib.get_configdir()). Format style sheet adalah

axes.labelsize: 16
axes.titlesize: 16

Jika Anda memiliki style sheet /path/to/mpl_configdir/stylelib/mystyle.mplstylemaka Anda dapat menggunakannya via

plt.style.use('mystyle')

# or, for a single section

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

Anda juga dapat membuat (atau memodifikasi) file matplotlibrc yang berbagi format

axes.labelsize = 16
axes.titlesize = 16

Bergantung pada file matplotlibrc mana yang Anda ubah, perubahan ini hanya akan digunakan untuk direktori kerja saat ini, untuk semua direktori kerja yang tidak memiliki file matplotlibrc, atau untuk semua direktori kerja yang tidak memiliki file matplotlibrc dan di mana tidak ada file matplotlibrc lainnya telah ditentukan. Lihat bagian ini dari halaman matplotlib khusus untuk lebih jelasnya.

Daftar lengkap rcParamstombol dapat diambil melalui plt.rcParams.keys(), tetapi untuk menyesuaikan ukuran font yang Anda miliki (cetak miring dikutip dari sini )

  • axes.labelsize- Font ukuran label x dan y
  • axes.titlesize- Font ukuran judul sumbu
  • figure.titlesize- Ukuran judul gambar ( Figure.suptitle())
  • xtick.labelsize- Font ukuran label centang
  • ytick.labelsize- Font ukuran label centang
  • legend.fontsize- Ukuran huruf untuk legenda ( plt.legend(), fig.legend())
  • legend.title_fontsize- Fontsize untuk judul legenda, disetel Nonesama dengan sumbu default. Lihat jawaban ini untuk contoh penggunaan.

yang semuanya menerima ukuran string {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}atau floatin pt. Ukuran string didefinisikan relatif terhadap ukuran font default yang ditentukan oleh

  • font.size- ukuran font default untuk teks, diberikan dalam poin. 10 pt adalah nilai standar

Selain itu, berat dapat ditentukan (meskipun hanya untuk default yang muncul) oleh

  • font.weight- Bobot default font yang digunakan oleh text.Text. Menerima {100, 200, 300, 400, 500, 600, 700, 800, 900}atau 'normal'(400), 'bold'(700) 'lighter',, dan 'bolder'( relatif sehubungan dengan berat saat ini ).
William Miller
sumber
2

Solusi alternatif untuk mengubah ukuran font adalah mengganti padding. Saat Python menyimpan PNG Anda, Anda bisa mengubah tata letak menggunakan kotak dialog yang terbuka. Jarak antar sumbu, padding jika Anda suka dapat diubah pada tahap ini.

Naz
sumber
2

Tempatkan right_axsebelumnyaset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
sumber
-3

7 (solusi terbaik)

 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 (solusi yang sedikit lebih buruk)

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()
shapeshifter123
sumber
2
Meskipun kode ini dapat memberikan solusi untuk masalah OP, sangat disarankan agar Anda memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan. Jawaban hanya kode biasanya menjadi tidak berguna dalam jangka panjang karena pemirsa masa depan yang mengalami masalah serupa tidak dapat memahami alasan di balik solusi.
E. Zeytinci