Matplotlib'de şekil başlığını ve eksen etiketleri yazı tipi boyutunu nasıl ayarlarım?


531

Matplotlib'de şöyle bir figür oluşturuyorum:

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

Şekil başlığı ve eksen etiketleri için yazı tipi boyutları belirtmek istiyorum. Üç farklı yazı tipi boyutları olmak için her üçüne ihtiyacım var, bu yüzden genel yazı tipi boyutu ( mpl.rcParams['font.size']=x) ayarlamak istediğim şey değil. Şekil başlığı ve eksen etiketleri için yazı tipi boyutlarını tek tek nasıl ayarlarım?


1
Ben senin ekleyerek denedim yüzden meraklı mpl.rcParams['font.size'] = 2010 ve denenmiş değişen değerlere ve 14. İlk Değiştiğimi sürece hatalar var bulundu mpletmek plt. Bu değişiklik hatayı düzeltti, ancak kod satırının başlıklar veya etiketlerim üzerinde hiçbir etkisi olmadı. Bu sözdiziminin doğru olduğundan emin misiniz?
17'de TMWP

Şimdi kabul edilen cevabın yorumlarından, sorunun benim ithalat beyanım olabileceğini düşünüyorum, ancak komutu ithal etmediysem neden bir hata atmıyor olsa da benden öte. mplKomutu test ederken kullandığınız başka bir içe aktarma satırı var mı ?
TMWP

Yanıtlar:


774

Gibi metin ile ilgili fonksiyonlar label, titlevb aynı parametreleri kabul matplotlib.text.Text. Yazı tipi boyutu için şunları kullanabilirsiniz 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')

Global ayarı için titleve labelboyutları, mpl.rcParamsiçerdiği axes.titlesizeve axes.labelsize. (Sayfadan):

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

(Görebildiğim kadarıyla, boyutları ayrı ayrı ayarlamanın xve yetiketlemenin bir yolu yoktur .)

Ve axes.titlesizebunun etkilemediğini görüyorum suptitle. Sanırım bunu manuel olarak ayarlamanız gerekiyor.


Teşekkürler! bunu küresel olarak ama açıkça (suptitle, xlabel, ylabel) için ayarlamanın bir yolu var mı? Grafikler çok yapıyorum ve sadece bir kez belirtmek istiyorum ...
vasek1

@ vasek1: Global ortam istemediğini sanıyordum :). Bunun için ihtiyacınız var mpl.rcParams. Cevabımı düzenledim.
Avaris

16
Başlığımı değiştirmek için çözüm arayan kendim gibi herkese:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen

Gönderen rcParamsbağlantısını kullanmak figure.titlesizeilaveten axes.titlesize.
Mad Physicist

1
@AlexanderMcFarlane. Koştum python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Sonuç ise 1.5.1, True. 1) Hangi matplotlib sürümünü kullanıyorsunuz? Hangi Python sürümü? 2) Py2'de herhangi bir nedenle kabul ettiği strancak kabul etmediği bir hata unicodeolabilir mi?
Deli Fizikçi

90

Bunu global olarak bir rcParams sözlüğü ile de yapabilirsiniz:

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
Bunun dışında başka boyutlar da var 'x-large'mı?
Martin Thoma

15
'xx-small', 'x-small', 'küçük', 'orta', 'büyük', 'x-büyük', 'xx-büyük'. Bkz matplotlib.org/api/...
tsando

pylab.rcParams.keys()Parametrelerin tam listesini görmek için kullanın .
Nirmal

Teşekkürler. Genel olarak ayarlanabilir açık sayısal başlık için boyutları ve eksen-etiket yerine hep yapıyor için bir yol var mı ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Sadece rcParamsdizeleri kabul ediyor gibi görünüyor .
timgeb

4
Ayrıca sayıları kullanabilirsiniz ...'axes.labelsize': 32,
mimoralea

65

Çiziminizi axyapmak için nesneleri kullanmaya ax.xaxis.label.set_size()daha alışkınsanız, bir ipython terminalinde sekmeyi kullanarak hatırlamayı daha kolay veya en azından bulmak daha kolay olabilir. Etkiyi görmek için yeniden çizim işlemine ihtiyaç var gibi görünüyor. Örneğin:

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

Oluşturulduktan sonra altyazı boyutunu ayarlamak için benzer bir yol bilmiyorum.


fig.suptitle('test title', fontsize = 20)işe yarıyor gibi görünüyor. 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 Bu doğru ve bu formlar yukarıdaki Avaris'in cevabına benziyor. Bunları tamlık için ekleyeceğim. ax.xaxis.label.set_size()Bir ipython grafiği ile etkileşimli çalıştığımda hala bir kullanım alanı buluyorum ve çeşitli yazı tipi boyutlarının hızlı bir görsel değerlendirmesini yapmak istiyorum.
spinup

Balta nesneleri ve şekil nesneleri arasında herhangi bir (gizli) fark var mı, yoksa her ikisi de mükemmel şekilde eşdeğer mi? Neden bazı özellikler için farklı arayüzler var? (plt.xlabel () ile ax.set_xlabel ())
normanius

1
@normanius, yukarıdaki örnekte balta ve incir demek istiyorsanız, bunlar oldukça farklı nesnelerdir - incir, birkaç eksen içerebilen genel şekildir. Yani incir ve balta farklı özelliklere sahiptir. Pyplot tipi çağrılar ve nesne çağrıları arasındaki fark açısından (örneğin , dediğiniz gibi plt.xlabel()vs. ax.set_xlabel()), plt.*işlevlerin geçerli eksen / şekil üzerinde çalıştığı uyarısı ile eşdeğerdirler . Böylece, birden fazla eksenli bir figür ayarladınız, muhtemelen ax1.set_xlabel()karışıklığı önlemek için açık çağrılar kullanmak isteyeceksiniz .
spinup

20

Sadece başlığın yazı tipini değiştirmek için (ve eksen yazı tipini değil) Bunu kullandım:

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

Yazı tipi matplotlib.text.Text kaynağındaki tüm kwargları kabul eder .


8

Başına resmi kılavuz , kullanımı pylabartık tavsiye edilir. matplotlib.pyplotbunun yerine doğrudan kullanılmalıdır.

Küresel yazı tipi boyutları aracılığıyla ayarı rcParamsile yapılmalıdır

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)

Varsayılanlar kullanılarak geri yüklenebilir

plt.rcParams.update(plt.rcParamsDefault)

Ayrıca oluşturarak yapabilirsiniz stil sayfasını de stylelibaltında dizine matplotlib yapılandırma dizinden (eğer adresinin yapılandırma dizini alabilirsiniz matplotlib.get_configdir()). Stil sayfası biçimi

axes.labelsize: 16
axes.titlesize: 16

Adresinde bir stil sayfanız /path/to/mpl_configdir/stylelib/mystyle.mplstylevarsa

plt.style.use('mystyle')

# or, for a single section

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

Ayrıca formatı paylaşan bir matplotlibrc dosyası oluşturabilir (veya değiştirebilirsiniz)

axes.labelsize = 16
axes.titlesize = 16

Hangi bağlı bu değişikliklerin do tüm çalışma dizinleri için, yalnızca geçerli çalışma dizini için kullanılacaktır değiştirmek dosya matplotlibrc değil bir matplotlibrc dosyası varsa, ya yok tüm çalışma dizinleri için değil başka matplotlibrc dosyası sahip olduğu bir matplotlibrc dosyası var ve belirtildi. Daha fazla ayrıntı için matplotlib özelleştirme sayfasının bu bölümüne bakın .

rcParamsAnahtarların tam bir listesi aracılığıyla alınabilir plt.rcParams.keys(), ancak sahip olduğunuz yazı tipi boyutlarını ayarlamak için (italik olarak burada alıntı yapılır )

  • axes.labelsize- x ve y etiketlerinin yazı tipi boyutu
  • axes.titlesize- Eksen başlığının yazı tipi
  • figure.titlesize- Şekil başlığının boyutu ( Figure.suptitle())
  • xtick.labelsize- Kene etiketlerinin yazı tipi boyutu
  • ytick.labelsize- Kene etiketlerinin yazı tipi boyutu
  • legend.fontsize- Efsaneler için yazı tipi boyutu ( plt.legend(), fig.legend())
  • legend.title_fontsize- Gösterge başlıkları için yazı tipi boyutu None, varsayılan eksenlerle aynı şekilde ayarlanır. Kullanım örneği için bu cevaba bakınız .

bunların hepsi dize boyutlarını kabul {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}veya floatin pt. Dize boyutları, tarafından belirtilen varsayılan yazı tipi boyutuna göre tanımlanır

  • font.size- pts cinsinden verilen metin için varsayılan yazı tipi boyutu. 10 pt standart değerdir

Ayrıca, ağırlık (yalnızca göründüğü varsayılan değer için de olsa) belirtilebilir.

  • font.weight- tarafından kullanılan yazı tipinin varsayılan ağırlığı text.Text. Kabul eder {100, 200, 300, 400, 500, 600, 700, 800, 900}veya'normal' (400), 'bold'(700), 'lighter've 'bolder'( mevcut ağırlığına göre göreli ).

2

Yazı tipi boyutunu değiştirmek için alternatif bir çözüm, dolguyu değiştirmektir. Python PNG'nizi kaydettiğinde, açılan iletişim kutusunu kullanarak düzeni değiştirebilirsiniz. Eksenler arasındaki boşluk, isterseniz dolgu bu aşamada değiştirilebilir.



-3

7 (en iyi çözüm)

 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 (biraz daha kötü bir çözüm)

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
Bu kod OP sorununa bir çözüm sağlayabilir, ancak bu kodun soruyu neden ve / veya nasıl yanıtladığı konusunda ek bağlam sağlamanız önemle tavsiye edilir. Kod yanıtları genellikle uzun vadede işe yaramaz hale gelir, çünkü benzer sorunlarla karşılaşan gelecekteki izleyiciler çözümün ardındaki mantığı anlayamazlar.
E. Zeytinci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.