Matplotlib diminui o tamanho da fonte dos marcadores


299

Em uma figura do matplotlib, como posso reduzir o tamanho da fonte dos rótulos dos marcadores ax1.set_xticklabels()?

Além disso, como girá-lo da horizontal para a vertical?


Obrigado por fazer esta pergunta, estou tentando resolver este problema agora. Não sou muito opinativo aqui, mas parece que os eleitores acham que a melhor resposta não é a aceita. O que você acha?
Aaron Hall

li corretamente que existem pelo menos 5 maneiras diferentes de alterar o tamanho da fonte no matplotlib? : D
famargar 26/02

Respostas:


127

Observe que as versões mais recentes do MPL possuem um atalho para esta tarefa. Um exemplo é mostrado na outra resposta a esta pergunta: https://stackoverflow.com/a/11386056/42346

O código abaixo é para fins ilustrativos e pode não ser necessariamente otimizado.

import matplotlib.pyplot as plt
import numpy as np

def xticklabels_example():
    fig = plt.figure() 

    x = np.arange(20)
    y1 = np.cos(x)
    y2 = (x**2)
    y3 = (x**3)
    yn = (y1,y2,y3)
    COLORS = ('b','g','k')

    for i,y in enumerate(yn):
        ax = fig.add_subplot(len(yn),1,i+1)

        ax.plot(x, y, ls='solid', color=COLORS[i]) 

        if i != len(yn) - 1:
            # all but last 
            ax.set_xticklabels( () )
        else:
            for tick in ax.xaxis.get_major_ticks():
                tick.label.set_fontsize(14) 
                # specify integer or one of preset strings, e.g.
                #tick.label.set_fontsize('x-small') 
                tick.label.set_rotation('vertical')

    fig.suptitle('Matplotlib xticklabels Example')
    plt.show()

if __name__ == '__main__':
    xticklabels_example()

insira a descrição da imagem aqui


84
Apenas como um aparte: Em vez de percorrer os objetos do rótulo de marca, você pode usar plt.setp. (Além disso, dê uma olhada ax.tick_params) Por exemplo, você pode fazer plt.setp(ax.get_xticklabels(), rotation='vertical', fontsize=14). Além disso, os objetos axes possuem um ax.is_last_row()método que pode ser útil em casos como o seu exemplo. Em vez de if i != len..., você pode fazer if not ax.is_last_row(). (Porque é um método, eu não tenho idéia ... Matplotlib odeia propriedades, aparentemente!)
Joe Kington

@ Joe: esta é a minha primeira vez que ouvi falar is_last_row(), obrigado! Eu usei plt.setpno passado e não tinha necessariamente certeza de que isso representava uma maneira mais canônica de personalizar rótulos de carrapatos. Você removeu essa dúvida, obrigado. De maneira mais ampla: suas respostas, especialmente na matplotlibetiqueta, freqüentemente me deixam admirado. Continue com o ótimo trabalho.
mechanical_meat

1
Obrigado!! Agradeço as amáveis ​​palavras, especialmente de você! Canonical é muito relativo, neste caso. plt.setpé um "matlab-ism" e um loop explícito é provavelmente muito mais pitônico. Ser um convertido do matlab setpparece natural, mas cada um é seu. Qualquer um dos dois é bastante legível, imo
Joe Kington

50
Nas novas versões, descobri que você tinha que usar o parâmetro labelsize : por exemploax.tick_params(axis='x', labelsize=8)
Vladtn 16/02/2012

Deve ser get_ticklabelsnãoget_major_ticks
Jez

506

Existe uma maneira mais simples, na verdade. Acabei de encontrar:

import matplotlib.pyplot as plt
# We prepare the plot  
fig, ax = plt.subplots()

# We change the fontsize of minor ticks label 
ax.tick_params(axis='both', which='major', labelsize=10)
ax.tick_params(axis='both', which='minor', labelsize=8)

Isso apenas responde ao tamanho de labelparte da sua pergunta.


2
Use axis = 'x'ou axis = 'y'para modificar apenas um dos eixos
loved.by.Jesus

221

Para especificar o tamanho da fonte e a rotação ao mesmo tempo, tente o seguinte:

plt.xticks(fontsize=14, rotation=90)

4
Observe que isso é usado ao trabalhar com a interface pyplot do tipo MATLAB. No caso da interface orientada a objetos, o método tick_params () do objeto eixos ou o método set_tick_params () do objeto eixo deve ser usado (consulte outras respostas).
Wombatonfire

54

Como alternativa, você pode apenas fazer:

import matplotlib as mpl
label_size = 8
mpl.rcParams['xtick.labelsize'] = label_size 

36
plt.tick_params(axis='both', which='minor', labelsize=12)

Esta é a única resposta que funciona se você deseja alterar o tamanho da fonte sem definir novos rótulos.
David Stansby

@DavidStansby Não acredito que isso seja verdade. Eu tive esse problema exato (mencionado acima) e foi capaz de usar um método alternativo diferente desta solução. usandoax.xaxis.set_tick_params(labelsize=20)
Kyle Swanson

1
resposta mais simples, não requer referência a objeto machado
jeremy_rutman

26

Outra alternativa

Tenho duas parcelas lado a lado e gostaria de ajustar os rótulos das marcas separadamente.

As soluções acima estavam próximas, mas não estavam funcionando para mim. Encontrei minha solução nesta página do matplotlib .

ax.xaxis.set_tick_params(labelsize=20)

Isso fez o truque e foi direto ao ponto. Para o meu caso de uso, era o gráfico à direita que precisava ser ajustado. Para a plotagem à esquerda desde que eu estava criando novos rótulos de marca, pude ajustar a fonte no mesmo processo que defini -la.

ie

ax1.set_xticklabels(ax1_x, fontsize=15)
ax1.set_yticklabels(ax1_y, fontsize=15)

então eu usei para o enredo certo,

ax2.xaxis.set_tick_params(labelsize=24)
ax2.yaxis.set_tick_params(labelsize=24)

Uma pequena sutileza ... eu sei ... mas espero que isso ajude alguém :)

Pontos de bônus, se alguém souber como ajustar o tamanho da fonte na ordem da magnitude.

insira a descrição da imagem aqui


22

Nas versões atuais do Matplotlib, você pode fazer axis.set_xticklabels(labels, fontsize='small').


1
Isso força você a especificar o labelstambém. É melhor mudarmos apenas o tamanho da fonte.
Guimoute

16

Você também pode alterar os parâmetros de exibição do rótulo, como tamanho da fonte, com uma linha como esta:

zed = [tick.label.set_fontsize(14) for tick in ax.yaxis.get_major_ticks()]

1
Eu acho que o uso de compreensões de lista que tenham efeitos colaterais não é a melhor prática. Eu sugiro usar um padrão para loop.
jjmontes


10

O seguinte funcionou para mim:

ax2.xaxis.set_tick_params(labelsize=7)
ax2.yaxis.set_tick_params(labelsize=7)

A vantagem do exposto acima é que você não precisa fornecer os dados arrayde labelse trabalha com eles axes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.