Como definir o tamanho da fonte do título da figura e dos rótulos dos eixos no Matplotlib?

531

Estou criando uma figura no Matplotlib assim:

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

Quero especificar tamanhos de fonte para o título da figura e os rótulos dos eixos. Eu preciso que todos os três tenham tamanhos de fonte diferentes, portanto, mpl.rcParams['font.size']=xnão é o que desejo definir um tamanho de fonte global ( ). Como definir tamanhos de fonte para o título da figura e os rótulos dos eixos individualmente?

vasek1
fonte
1
Fiquei curioso, tentei adicionar o seu mpl.rcParams['font.size'] = 20e alterei os valores para 10 e 14. Primeiro, descobri que havia erros, a menos que mudasse mplpara plt. Essa alteração resolveu o erro, mas a linha de código não teve efeito nos meus títulos ou etiquetas. Claro que esta sintaxe está certa?
TMWP 30/03
agora estou pensando nos comentários sobre a resposta aceita que o problema pode ser minha declaração de importação, mas o motivo pelo qual não gera um erro se eu não importou o comando está além de mim. Existe outra linha de importação usada ao testar o mplcomando?
TMWP 30/03

Respostas:

774

Funções que lidam com texto como label, title, etc. aceitar parâmetros mesmos como matplotlib.text.Text. Para o tamanho da fonte, você pode usar 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')

Para configurações titlee labeltamanhos globalmente , mpl.rcParamscontém axes.titlesizee axes.labelsize. (A partir da página):

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

(Pelo que pude ver, não há como definir xe yrotular tamanhos separadamente.)

E eu vejo que axes.titlesizeisso não afeta suptitle. Eu acho que você precisa definir isso manualmente.

Avaris
fonte
obrigado! existe uma maneira de definir isso globalmente, mas explicitamente para (suptitle, xlabel, ylabel)? Eu estou fazendo um monte de cartas e só quero especificá-lo uma vez ...
vasek1
@ vasek1: Eu pensei que você não queria configuração global :). Para isso você precisa mpl.rcParams. Eu editei minha resposta.
Avaris
16
Para qualquer outra pessoa, como eu, procurando a solução para mudar o titlesize:plt.rcParams.update({'axes.titlesize': 'small'})
tommy.carstensen
No rcParamslink, use figure.titlesizealém de axes.titlesize.
Mad Physicist
1
@AlexanderMcFarlane. Corri python -c 'import matplotlib as mpl; print(mpl.__version__); print("figure.titlesize" in mpl.rcParams.keys())'. Resultado é 1.5.1, True. 1) Qual versão do matplotlib você está usando? Qual versão do Python? 2) Poderia ser um bug onde, por algum motivo, ele aceita, strmas não unicodeno Py2?
Mad Physicist
90

Você também pode fazer isso globalmente através de um dicionário 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
fonte
5
Quais são os outros tamanhos além disso 'x-large'?
Martin Thoma
15
'xx-pequeno', 'x-pequeno', 'pequeno', 'médio', 'grande', 'x-grande', 'xx-grande'. Veja matplotlib.org/api/…
tsando
Use pylab.rcParams.keys()para ver a lista completa de parâmetros.
Nirmal
Obrigado. Existe uma maneira para definir globalmente tamanhos explícitas numéricas para o título e o eixo etiquetas em vez de fazer sempre ax.set_title('some title', fontsize=15), ax.set_xlabel('some xlabel', fontsize=12)? Parece que rcParamssó aceita strings.
timgeb
4
Você também pode usar números ...'axes.labelsize': 32,
mimoralea 12/06/19
65

Se você está mais acostumado a usar axobjetos para fazer sua plotagem, pode achar o ax.xaxis.label.set_size()mais fácil de lembrar, ou pelo menos mais fácil de encontrar usando a guia em um terminal ipython. Parece precisar de uma operação de redesenho depois para ver o efeito. Por exemplo:

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

Não conheço uma maneira semelhante de definir o tamanho da legenda depois de criada.

spinup
fonte
fig.suptitle('test title', fontsize = 20)parece funcionar. 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 Isso é verdade, e esses formulários são semelhantes à resposta da Avaris acima. Vou adicioná-los para completar. Ainda acho útil ax.xaxis.label.set_size()quando estou trabalhando interativamente com um gráfico ipython e quero fazer uma avaliação visual rápida de vários tamanhos de fonte.
spinup
Você sabe se existe alguma diferença (oculta) entre o uso de objetos de machado e objetos de figura, ou ambos são perfeitamente equivalentes? Por que existem interfaces diferentes para alguns dos recursos? (plt.xlabel () vs. ax.set_xlabel ())
normanius
1
@ normanius, se você quer dizer ax e fig no exemplo acima, eles são objetos bem diferentes - fig é a figura geral, que pode conter vários eixos. Portanto, fig e machado têm propriedades diferentes. Em termos da diferença entre as chamadas do tipo pyplot e chamadas de objetos (por exemplo, plt.xlabel()vs. ax.set_xlabel()como você diz), elas são equivalentes, com a ressalva de que as plt.*funções funcionam no eixo / figura atual . Então, se você configurar uma figura com vários eixos, provavelmente desejará usar chamadas explícitas, como ax1.set_xlabel()para evitar confusão.
spinup
20

Para modificar apenas a fonte do título (e não a fonte do eixo), usei o seguinte:

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

O fontdict aceita todos os kwargs de matplotlib.text.Text .

tammoj
fonte
8

De acordo com o guia oficial , o uso de pylabnão é mais recomendado. matplotlib.pyplotdeve ser usado diretamente.

A definição global dos tamanhos das fontes rcParamsdeve ser feita com

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)

Os padrões podem ser restaurados usando

plt.rcParams.update(plt.rcParamsDefault)

Você também pode fazer isso criando uma folha de estilos no stylelibdiretório sob o diretório de configuração matplotlib (você pode obter seu diretório de configuração matplotlib.get_configdir()). O formato da folha de estilos é

axes.labelsize: 16
axes.titlesize: 16

Se você possui uma folha de estilos /path/to/mpl_configdir/stylelib/mystyle.mplstyle, pode usá-la através de

plt.style.use('mystyle')

# or, for a single section

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

Você também pode criar (ou modificar) um arquivo matplotlibrc que compartilhe o formato

axes.labelsize = 16
axes.titlesize = 16

Dependendo de qual arquivo matplotlibrc você modificar, essas alterações serão usadas apenas para o diretório de trabalho atual, para todos os diretórios de trabalho que não possuem um arquivo matplotlibrc ou para todos os diretórios de trabalho que não possuem um arquivo matplotlibrc e onde nenhum outro arquivo matplotlibrc possui foi especificado. Consulte esta seção da página de customização do matplotlib para obter mais detalhes.

Uma lista completa das rcParamschaves pode ser recuperada via plt.rcParams.keys(), mas para ajustar o tamanho da fonte que você possui (itálico aqui )

  • axes.labelsize- Tamanho das fontes dos rótulos x e y
  • axes.titlesize- Tamanho da fonte do título dos eixos
  • figure.titlesize- Tamanho do título da figura ( Figure.suptitle())
  • xtick.labelsize- Tamanho das fontes dos rótulos dos ticks
  • ytick.labelsize- Tamanho das fontes dos rótulos dos ticks
  • legend.fontsize- Tamanho da fonte para legendas ( plt.legend(), fig.legend())
  • legend.title_fontsize- Tamanho da fonte para títulos de legenda, Nonedefine o mesmo que os eixos padrão. Veja esta resposta para exemplo de uso.

todos aceitam tamanhos de string {'xx-small', 'x-small', 'smaller', 'small', 'medium', 'large', 'larger', 'x-large', 'xxlarge'}ou um floatin pt. Os tamanhos das cadeias são definidos em relação ao tamanho da fonte padrão especificado por

  • font.size- o tamanho da fonte padrão para o texto, fornecido em pts. 10 pt é o valor padrão

Além disso, o peso pode ser especificado (embora apenas para o padrão seja exibido)

  • font.weight- O peso padrão da fonte usada por text.Text. Aceita {100, 200, 300, 400, 500, 600, 700, 800, 900}ou 'normal'(400), 'bold'(700) 'lighter'e 'bolder'( em relação ao peso atual ).
William Miller
fonte
2

Uma solução alternativa para alterar o tamanho da fonte é alterar o preenchimento. Quando o Python salva seu PNG, você pode alterar o layout usando a caixa de diálogo exibida. O espaçamento entre os eixos, preenchendo se você quiser, pode ser alterado nesta fase.

Naz
fonte
2

Coloque right_axantesset_ylabel()

ax.right_ax.set_ylabel('AB scale')

Chane Badr Eddine
fonte
-3

7 (melhor solução)

 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 (solução ligeiramente pior)

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
fonte
2
Embora esse código possa fornecer uma solução para o problema do OP, é altamente recomendável que você forneça um contexto adicional sobre por que e / ou como esse código responde à pergunta. As respostas apenas ao código geralmente se tornam inúteis a longo prazo, porque os futuros espectadores com problemas semelhantes não conseguem entender o raciocínio por trás da solução.
E. Zeytinci 14/01