HOWTO · R

Como alterar os rótulos dos eixos no ggplot2 com R

Altere os rótulos das marcas em eixos discretos e contínuos no ggplot2, aplique formatos e gire textos sobrepostos.

Use scale_x_discrete(labels = ...) para renomear os rótulos das marcas associados a fatores ou caracteres. Em um eixo numérico, scale_x_continuous(breaks = ..., labels = ...) define as posições e a formatação. A rotação e outros ajustes visuais pertencem a theme(axis.text.x = element_text(...)). Para alterar o título do eixo, use labs(x = ...): o título não é um rótulo de marca. Substitua x por y para aplicar as mesmas ideias ao eixo vertical.

Os exemplos exigem R e ggplot2. O exemplo contínuo também usa o pacote scales para formatar os rótulos. Eles foram verificados com R 4.1.2, ggplot2 3.3.5 e scales 1.1.1. Os argumentos empregados também estão na API atual do ggplot2, embora o tema possa apresentar pequenas diferenças entre versões.

Tarefa Controle do ggplot2
Alterar o título do eixo labs(x = "Title") ou labs(y = "Title")
Renomear rótulos de fatores ou valores de caracteres scale_x_discrete(labels = ...)
Definir posições e textos numéricos scale_x_continuous(breaks = ..., labels = ...)
Girar ou estilizar o texto exibido theme(axis.text.x = element_text(...))
Formatar um eixo Date scale_x_date(breaks = ..., labels = ...)

Criar um gráfico base no ggplot2

Um único data frame pequeno deixa evidente o efeito de cada alteração. A coluna plan é um fator e, por isso, usa uma escala x discreta. A coluna orders é numérica e usa uma escala y contínua.

library(ggplot2)

plan_sales <- data.frame(
  plan = factor(
    c("starter", "standard", "premium", "enterprise"),
    levels = c("starter", "standard", "premium", "enterprise")
  ),
  orders = c(180, 250, 210, 140)
)

base_plot <- ggplot(plan_sales, aes(x = plan, y = orders)) +
  geom_col(fill = "#2c7fb8", width = 0.7) +
  labs(x = "Plan", y = "Orders") +
  theme_minimal(base_size = 16)

base_plot
ggsave(
  "ggplot-default-axis-tick-labels.png",
  plot = base_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Gráfico padrão do ggplot2 com os rótulos originais das marcas nos eixos x e y.

O gráfico base mostra os quatro valores armazenados do fator no eixo x e marcas numéricas escolhidas automaticamente no eixo y. labs(x = "Plan") fornece o título visível “Plan”, mas não renomeia starter, standard, premium nem enterprise.

Antes de escolher a escala, verifique o tipo da variável mapeada. str(plan_sales$plan) informa um fator, enquanto str(plan_sales$orders) informa um vetor numérico. Um fator contendo "1", "2" e "3" continua discreto. Da mesma forma, uma coluna numérica permanece contínua mesmo quando tem poucos valores distintos. Converta o tipo somente se a nova representação corresponder ao significado real dos dados.

Renomear e ordenar rótulos discretos

Em uma escala discreta, combine breaks com labels. breaks identifica os valores dos dados que terão marcas, e labels fornece o texto impresso para cada um. A associação explícita evita que um rótulo seja ligado ao valor errado caso a ordem da escala mude.

O exemplo a seguir também reorganiza as categorias com segurança. Ele altera os níveis do fator em uma cópia dos dados e passa a mesma sequência a breaks. O vetor nomeado torna o mapeamento compreensível antes mesmo da execução.

plan_order <- c("premium", "standard", "starter", "enterprise")
plan_names <- c(
  premium = "Premium",
  standard = "Standard",
  starter = "Starter",
  enterprise = "Enterprise"
)

ordered_sales <- plan_sales
ordered_sales$plan <- factor(ordered_sales$plan, levels = plan_order)

discrete_plot <- ggplot(ordered_sales, aes(x = plan, y = orders)) +
  geom_col(fill = "#2c7fb8", width = 0.7) +
  scale_x_discrete(
    breaks = plan_order,
    labels = plan_names[plan_order]
  ) +
  labs(x = "Plan", y = "Orders") +
  theme_minimal(base_size = 16)

discrete_plot
ggsave(
  "ggplot-discrete-axis-tick-labels.png",
  plot = discrete_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Gráfico do ggplot2 com as categorias discretas do eixo x renomeadas e reordenadas.

A sequência exibida é Premium, Standard, Starter, Enterprise. Os valores armazenados continuam em minúsculas; somente a apresentação muda. labels também pode receber uma função quando uma regra se aplica a todas as marcas. Por exemplo, scale_x_discrete(labels = abbreviate) envia os valores à função abbreviate() do R base. Uma function(x) personalizada precisa retornar um vetor de caracteres do mesmo tamanho.

Se você precisa apenas de novos nomes e quer manter a ordem atual, omita breaks e passe um vetor nomeado que cubra todos os valores exibidos, como c(starter = "Starter", standard = "Standard", premium = "Premium", enterprise = "Enterprise"). A forma pareada acima é melhor quando tanto o conjunto quanto a ordem são requisitos. Depois de filtrar os dados, leia o eixo da esquerda para a direita e compare-o com a sequência esperada descrita ao lado da imagem.

Não trate breaks e limits como equivalentes. Em uma escala discreta, breaks seleciona as marcas exibidas sem mudar as categorias aceitas. limits define os valores permitidos e sua ordem. Valores excluídos se tornam ausentes, e uma camada como geom_col() pode remover as linhas correspondentes com um aviso. Reordene os níveis do fator quando a ordem fizer parte dos dados; use limits apenas quando a exclusão for intencional.

Definir e formatar as marcas de um eixo contínuo

Um eixo numérico precisa de uma escala contínua. Informe as posições exatas em breaks e forneça a labels um vetor de caracteres correspondente ou uma função de formatação. A função é mais segura quando os valores podem mudar, pois o ggplot2 a chama com as marcas finais.

Este gráfico de dispersão coloca as marcas de potência em 100, 200 e 300 e adiciona a unidade com scales::label_number(). A chamada direta ao formatador permite conferir o texto antes de desenhar.

hp_breaks <- c(100, 200, 300)
hp_formatter <- scales::label_number(suffix = " hp", accuracy = 1)
hp_formatter(hp_breaks)

continuous_plot <- ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point(size = 3, color = "#d95f0e") +
  scale_x_continuous(
    breaks = hp_breaks,
    labels = hp_formatter
  ) +
  labs(x = "Engine power", y = "Fuel economy (mpg)") +
  theme_minimal(base_size = 16)

continuous_plot
ggsave(
  "ggplot-continuous-axis-tick-labels.png",
  plot = continuous_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
[1] "100 hp" "200 hp" "300 hp"

Gráfico do ggplot2 com posições personalizadas e rótulos formatados das marcas em um eixo contínuo.

O eixo x deve mostrar exatamente esses três rótulos. Para um eixo y numérico, use a chamada equivalente scale_y_continuous(). Outras funções do scales tratam separadores de milhares, porcentagens, moedas e formatos semelhantes. Os dados permanecem numéricos: apenas o texto mostrado é alterado.

breaks exatos são apropriados quando as posições têm significado. Se apenas a formatação importa, omita breaks, deixe o ggplot2 escolher posições pelo intervalo e passe somente o formatador a labels. Não converta a coluna numérica em strings para acrescentar um sufixo: isso mudaria o tipo de escala e poderia gerar ordem lexicográfica em vez de espaçamento numérico.

Datas pertencem a um tipo de escala separado. Quando a coluna herda de Date, use scale_x_date() ou o equivalente para y, em vez de forçá-la em uma escala numérica ou discreta. O princípio de separar posições e rótulos continua válido, agora com intervalos e formatadores próprios para datas.

Girar rótulos sobrepostos

Alterar o conteúdo e alterar o estilo resolvem problemas diferentes. Se o texto está correto, mas se sobrepõe, mantenha a escala e ajuste axis.text.x no tema. angle = 35 gira cada rótulo, enquanto hjust = 1 alinha sua borda direita à marca. O tamanho base maior preserva a legibilidade quando o gráfico fica estreito.

channel_sales <- data.frame(
  channel = c(
    "North America Online",
    "Europe Retail Stores",
    "Asia Pacific Partners",
    "Latin America Direct"
  ),
  orders = c(260, 220, 195, 150)
)

rotated_plot <- ggplot(channel_sales, aes(x = channel, y = orders)) +
  geom_col(fill = "#31a354", width = 0.65) +
  labs(x = "Sales channel", y = "Orders") +
  theme_minimal(base_size = 18) +
  theme(
    axis.text.x = element_text(angle = 35, hjust = 1, vjust = 1)
  )

rotated_plot
ggsave(
  "ggplot-rotated-axis-tick-labels.png",
  plot = rotated_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)

Rótulos longos do eixo x no ggplot2 girados e alinhados para evitar sobreposição.

A rotação preserva os quatro nomes completos. Se ainda houver sobreposição, encurtar o texto ou ampliar o gráfico costuma comunicar melhor do que aumentar o ângulo. No ambiente verificado com ggplot2 3.3.5, scale_x_discrete(guide = guide_axis(n.dodge = 2)) distribui rótulos discretos em duas linhas; a função também aparece na API atual. Essa alternativa consome mais espaço vertical.

Ocultar rótulos, marcas ou posições de escala de propósito

Escolha o elemento que realmente deve desaparecer, em vez de tratar estes controles como sinônimos. Os três objetos a seguir mostram efeitos diferentes:

control_plot <- base_plot +
  theme_classic(base_size = 16)

labels_hidden <- control_plot +
  theme(axis.text.x = element_blank())

ticks_hidden <- control_plot +
  theme(axis.ticks.x = element_blank())

breaks_hidden <- control_plot +
  scale_x_discrete(breaks = NULL)

control_plot usa theme_classic(), que desenha marcas curtas e oferece uma base visível para comparação. labels_hidden remove apenas o texto impresso. ticks_hidden remove somente as marcas, mantendo os nomes das categorias. breaks_hidden impede a escala de gerar posições principais; desaparecem os rótulos e as marcas associados. Nenhuma expressão filtra linhas de plan_sales.

Outra opção no nível da escala é labels = NULL, que oculta o texto e preserva as posições. Use-a quando a própria escala não deve fornecer rótulos. Prefira element_blank() quando a escala continua significativa, mas um tema específico não deve desenhar o texto. Sem nomes visíveis, as categorias podem ficar impossíveis de identificar; nesse caso, acrescente anotações diretas ou outra chave.

Não são salvas imagens extras para essas variantes, porque o código selecionável e a descrição permitem a comparação precisa. Imprima, por exemplo, ticks_hidden no console R e compare-o com control_plot. As barras e suas alturas devem permanecer idênticas; apenas as guias do eixo mudam. Se a geometria mudar ou surgir um aviso sobre linhas removidas, procure uma chamada a limits em outra parte do gráfico.

Corrigir rótulos incorretos ou ausentes

Se o ggplot2 informar que um valor contínuo foi fornecido a uma escala discreta, ou o contrário, examine a coluna com str() antes de alterar o gráfico. Fatores e caracteres usam escalas discretas; números usam escalas contínuas; objetos Date e de data e hora usam as escalas correspondentes. Converta os dados apenas quando o novo tipo representar seu significado real.

Ao usar um vetor de caracteres em labels, combine-o com breaks explícitos e mantenha os dois vetores com o mesmo tamanho. Caso contrário, os rótulos podem se deslocar depois de filtros, reordenação ou inclusão de categorias. Um mapeamento nomeado como plan_names documenta cada correspondência. Uma função evita o problema de tamanho quando uma transformação vale para todas as marcas.

Barras ausentes ou avisos sobre linhas removidas geralmente apontam para limits, não para labels. Verifique se os limites omitem algum valor existente nos dados. Use breaks quando o objetivo for apenas reduzir os rótulos visíveis. Para zoom ou controle do intervalo, veja como definir limites dos eixos no ggplot2 sem confundi-los com as marcas.

Por fim, confirme se o texto pretendido é realmente um rótulo de marca. labs(x = "Plan") e o argumento name de uma escala x definem o título do eixo. O argumento labels controla o texto das marcas. Separar essas funções evita alterar o título corretamente enquanto categorias ou números permanecem iguais.

Na maioria dos gráficos, escolha a escala pelo tipo de dados, combine breaks e labels quando o texto exato for importante e reserve theme() para a aparência. Assim, as mudanças no eixo são previsíveis e as observações originais permanecem intactas.