HOWTO · Matplotlib
Como girar o texto do rótulo das marcações do eixo X no Matplotlib
Aprenda cinco maneiras de girar os rótulos das marcações do eixo x do Matplotlib e de alinhá-los quando rótulos longos se sobrepõem.
Nesta página
Para girar os rótulos das marcações do eixo x no Matplotlib, passe um ângulo, como rotation=45, para plt.xticks, fig.autofmt_xdate, ax.set_xticklabels, plt.setp ou ax.tick_params. Um ângulo de 45 graus é um bom ponto de partida quando rótulos longos na horizontal se sobrepõem; alinhe os rótulos girados com ha="right" para manter suas extremidades próximas às marcações. Os exemplos a seguir mostram quando cada API é útil.
Sem rotação, os nomes de categoria, como os meses, ficam na horizontal e ocupam toda a largura do eixo, de modo que nomes mais longos ou uma figura mais estreita fazem os rótulos vizinhos se juntarem:
Girar os rótulos das marcações do eixo x com plt.xticks
plt.xticks é uma opção concisa para trabalhar com pyplot. O argumento rotation define o ângulo em graus; por padrão, os rótulos ficam na horizontal. Este exemplo plota categorias e gira seus rótulos em 45 graus.
import matplotlib.pyplot as plt
months = ["January", "February", "March", "April"]
values = [12, 18, 15, 22]
fig, ax = plt.subplots()
ax.plot(months, values, marker="o")
plt.xticks(rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Use plt.xticks para fazer uma alteração rápida nos eixos atuais. Se o seu código já usa um objeto Axes, os métodos correspondentes abaixo permitem indicar explicitamente quais eixos serão alterados.
Girar os rótulos do eixo de datas com fig.autofmt_xdate
Em gráficos com datas, fig.autofmt_xdate formata os rótulos de data da figura e os gira para facilitar a leitura. As opções padrão também ajustam o alinhamento e a margem inferior; você pode definir rotation explicitamente para escolher um ângulo específico. O comportamento depende dos eixos da figura e do formato das datas, então use esse método em eixos de datas, em vez de tratá-lo como substituto geral de qualquer configuração de rótulos.
import matplotlib.pyplot as plt
from datetime import date, timedelta
start = date(2024, 1, 1)
dates = [start + timedelta(days=7 * i) for i in range(6)]
values = [3, 5, 4, 7, 6, 9]
fig, ax = plt.subplots()
ax.plot(dates, values, marker="o")
fig.autofmt_xdate(rotation=45)
ax.grid(True)
Esse método é conveniente quando o eixo x usa datas e os rótulos formatados precisam ser girados e espaçados. Para categorias comuns, escolha um dos métodos de rótulos de marcação apresentados nas outras seções.
Definir os rótulos e a rotação com ax.set_xticklabels
Use ax.set_xticklabels quando precisar fornecer um texto personalizado para os rótulos e também definir sua rotação. Primeiro, defina explicitamente as posições das marcações e forneça um rótulo para cada posição, para que cada texto permaneça associado à marcação correspondente. Girar os rótulos não exige substituí-los; use tick_params ou plt.setp para manter o texto existente.
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["North region", "South region", "East region", "West region"]
values = [8, 5, 9, 6]
fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Mantenha as posições e os rótulos na mesma ordem. Se as marcações do gráfico mudarem depois, atualize os rótulos personalizados para que correspondam a elas.
Definir as propriedades dos rótulos com plt.setp
plt.setp atualiza propriedades de artistas existentes do Matplotlib, incluindo os objetos dos rótulos atuais do eixo x retornados por ax.get_xticklabels(). É útil quando os rótulos já estão definidos e você quer apenas alterar sua aparência.
import matplotlib.pyplot as plt
categories = ["First quarter", "Second quarter", "Third quarter", "Fourth quarter"]
values = [14, 17, 13, 21]
fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()
Neste exemplo, rotation altera o ângulo e ha define o alinhamento horizontal. Isso atualiza os objetos dos rótulos de marcação atuais sem substituir o texto.
Definir a rotação dos rótulos do eixo x com ax.tick_params
ax.tick_params define as propriedades das marcações, dos rótulos e das linhas de grade para um eixo escolhido. Passe axis="x" e o argumento labelrotation, escrito em letras minúsculas, para girar os rótulos do eixo x sem alterar seu texto ou suas posições.
import matplotlib.pyplot as plt
categories = ["Planning", "Development", "Review", "Delivery"]
values = [2, 5, 3, 6]
fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
ax.tick_params(axis="x", labelrotation=45)
ax.grid(True)
fig.tight_layout()
Use essa forma no nível do eixo quando já tiver uma referência a Axes. O argumento se escreve labelrotation, todo em letras minúsculas.
Alinhar os rótulos de marcação girados
A rotação altera o ângulo, enquanto o alinhamento horizontal determina qual parte de cada rótulo fica sobre sua marcação. Com ha="right", a extremidade direita do rótulo coincide com a marcação; com ha="left", coincide a extremidade esquerda; e com ha="center", o ponto central fica sobre ela. Para rótulos inclinados em 45 graus que se estendem à esquerda das marcações, o alinhamento à direita é uma escolha comum. Experimente as opções considerando o comprimento dos rótulos e o layout do gráfico.
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["January", "February", "March", "April"]
values = [4, 7, 5, 8]
alignments = ["right", "left", "center"]
fig, axes = plt.subplots(1, 3, figsize=(10, 3))
for ax, alignment in zip(axes, alignments):
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha=alignment)
ax.set_title(f'ha="{alignment}"')
ax.grid(True)
fig.tight_layout()
Escolha o alinhamento conforme o ponto em que deseja ancorar cada rótulo. Se eles ainda ficarem muito próximos, ajuste também a largura da figura ou o texto dos rótulos.
Tratar rótulos cortados e erros de quantidade de rótulos
Dois problemas continuam possíveis mesmo quando a rotação funciona. Primeiro, ax.set_xticklabels substitui o texto dos rótulos, portanto a quantidade de rótulos deve ser igual à quantidade de posições de marca. Passar três rótulos para quatro posições faz a chamada falhar antes de qualquer desenho:
import matplotlib.pyplot as plt
positions = [0, 1, 2, 3]
labels = ["North", "South", "East"]
values = [8, 5, 9, 6]
fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")
A chamada termina com este erro:
ValueError: The number of FixedLocator locations (4), usually from a call to set_ticks, does not match the number of labels (3).
Adicione o rótulo que falta para que as duas sequências tenham o mesmo comprimento, na mesma ordem. Se você só precisa girar o texto existente, prefira plt.setp ou ax.tick_params: eles mantêm os rótulos atuais, portanto essa incompatibilidade não pode ocorrer.
Segundo, a rotação muda o ângulo, mas não cria espaço abaixo do eixo. Renderize o exemplo de set_xticklabels acima sem a chamada a fig.tight_layout() e os rótulos girados ultrapassarão a borda inferior da figura: em uma renderização de tamanho padrão, eles se estendem cerca de 31 pixels além da borda e são cortados no meio do texto:
fig.tight_layout() recalcula a caixa da figura para que cada rótulo caiba; medidos da mesma maneira, os rótulos terminam então exatamente na borda da figura, sem nada fora dela. fig.autofmt_xdate faz o mesmo tipo de ajuste de margem para eixos de data. Se os rótulos ainda colidirem após o ajuste de layout, encurte o texto dos rótulos ou alargue a figura em vez de aumentar o ângulo.