Cantinho do R

Mexendo com nomes de eixos e chatices do tipo

Marcos V. C. Vital

Para mais material, acesse http://cantinhodor.wordpress.com/
 

Este documento faz parte do material que disponibilizo no meu blog, o “Cantinho do R”, e foi foi criado utilizando o software R, o programa RStudio e a linguagem Markdown. Para saber mais sobre eles, acesse:

http://www.r-project.org/

http://www.rstudio.com

http://rmarkdown.rstudio.com/


Se Você está olhando este documento e não consegue entender nada, é sinal de que tem que começar do básico com o R. Uma boa pedida é dar uma olhada na minha apostila, para só depois voltar aqui. Confira ela aqui: https://cantinhodor.wordpress.com/2015/03/28/a-boa-e-velha-apostila-basica-do-r/
 


Uma das coisas fantásticas no R são os gráficos. Eles podem ser editados de um monte de maneiras, e você consegue mexer em cada pequeno detalhe deles. Mas isso vem com um custo: pode dar trabalho pra c#$%&*!

Neste documento curtinho vou mostrar alguns dos detalhes de edição de gráficos simples, me concentrando em como ajeitar os nomes dos eixos, o tamanho da fonte, evitar textos sobrepostos e outras pequenas chatices do tipo - que, apesar de chatas, são muito importantes na prática!

Vamos começar gerando um conjunto de dados bem simples. Basta executar, e os dados serão criados direto no seu R, ok?

dados<-structure(list(varx = 5:14, vary = c(12L, 22L, 18L, 25L, 24L, 
32L, 30L, 38L, 39L, 41L)), .Names = c("varx", "vary"), class = "data.frame", row.names = c(NA, 
-10L))

attach(dados)

Se quiser saber como criei os dados com este comando: eu já estava com os dados salvos em uma sessão do R, e usei o comando deput(dados). Esta é uma função super útil para se mandar pequenos conjuntos de dados “embutidos” dentro de um script.


Um gráficão basicão (incluindo uma regressão, só pra ter mais um “ão”), seria assim:

m1<-lm(vary~varx)
plot(vary~varx, pch=16, las=1)
abline(m1, col="red", lty=2)

Beleza, nada demais, são comandos que se você ainda não conhece, precisa começar do básico (aí veja a minha apostila, citada lá no início).


Agora vamos fuçar em algumas coisas, pra ir aprendendo a como mexer nelas no R, ok? Uma coisa importante é usar o comando par(). Ele serve paara definir parâmetros gráficos, e pode ser usado antes de um gráfico ser feito para definir como serão os parâmetros básicos a serem usados (tipo fonte, tamanho dos números, etc e tal). Perceba que quando você usa um par, os parâmetros dele valem para todos os gráficos seguintes, a não ser quando você fecha a janela do gráfico (isto “reseta” os parâmetros).

Bora mudar a fonte? Veja só:

par(family="serif")

#De novo o gráfico:
plot(vary~varx, pch=16, las=1)
abline(m1, col="red", lty=2)

Viu a mudança? Pois é, ficou “igualzin que nem” o Times New Roman que usamos tanto por aí.

Mas aí você pode achar que a fonte tá pequena. Vamos mexer nisso também:

par(family="serif", cex.lab=2, cex.axis=2)

#De novo o gráfico:
plot(vary~varx, pch=16, las=1)
abline(m1, col="red", lty=2)

O argumento cex.axis mexe no tamanho dos números dos eixos;

O argumento cex.lab mexe no tamanho dos nomes dos eixos.

Nos dois casos, os números funcionam como multiplicadores, onde 1 é o valor normal. Vale usar casas decimais, ok? Se quiser, brinque com os valores, pois o melhor é ir “sentindo” mesmo, pra depois decidir como fica melhor.


Legal, mas note que tem um probleminha visual: o nome do eixo y ficou ali bem colado com os números, não foi? E podia ser pior: às vezes, quando mexemos nos tamanhos das fontes, podemos ter sobreposição desses elementos.

Uma boa maneira de escapar disso, é mexer nas margens, usando o argumento mar do comando par.

O mar usa quatro valores, e funciona assim:

Para cada margem, você pode atribuir um valor desejado. Quanto maior a margem, maior o espaço para os elementos que aparecem nela.

Vamos mudar de banco de dados, e usar outro exemplo pra brincar melhor com isso, ok? Vamos lá:

detach(dados)

dados<-structure(list(var.nomes = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("nome_1", 
"nome_2", "nome_grande", "nome_grande.2", "nome_muito_grande"
), class = "factor")), .Names = "var.nomes", class = "data.frame", row.names = c(NA, 
-19L))

dados.tabela<-table(dados)

dados.tabela
## dados
##            nome_1            nome_2       nome_grande     nome_grande.2 
##                 4                 3                 6                 3 
## nome_muito_grande 
##                 3

Um gráfico de barras simples com estes dados ficaria assim:

barplot(dados.tabela)

Beleza! Beleza?! Coisa nenhuma, ficou uma bela porcaria! Nem sei por onde começar… :P

Vamos começar alterando a disposição dos nomes no eixo x, ok? Isso é simples de resolver, olha:

barplot(dados.tabela, las=3)

É, eu sei, continua horrível. O las=3 até deixou vermos todos os nomes, mas eles ficam cortados… Ei, peraí, isso é um trabalho para o mar! Ó só que legal:

par(mar=c(9,4,1,1))

barplot(dados.tabela, las=3)

Viu que bacana? Cada valor equivale à uma margem (1, 2, 3 e 4, na ordem da figura la em cima). Basta definir os valores e pronto! Normalmente coloco 1 nas margens 3 e 4, que dificilmente são relevantes. Já na 1 e 2, basta ir testando os valores e ver como fica melhor.

Maneiro. Agora vamos mexer mais. Nomes dos eixos é bom, né? Então vamos lá:

par(mar=c(9,4,1,1))

barplot(dados.tabela, las=3, ylab="Frequência de algo?", xlab="Nomes esquisitos que inventei")

Ahhhhhhhhhh!!!!!!

Você não achou que já ia dar certo, né? hehehehe

O que acontece é que os argumentos xlab e ylab usam posições padronizadas, o que pode ser um problema. Então vamos usar um comando extra, que serve para colocar um nome de eixo onde quisermos. Pra dar certinho, vou aumentar ainda mais a margem, ok? Vamos:

par(mar=c(11,4,1,1))

barplot(dados.tabela, las=3, ylab="Frequência de algo?", xlab="")

mtext("Nomes esquisitos que inventei", side=1, line=10)

Agora preste atenção, ok? Tem detalhes.

Aumentei a margem 1 pra 11. Aí, no comando mtext, que escreve texto na margem, eu disse duas coisas: side=1, indica que é a margem 1; line=10, significa a distância do eixo, na mesma numeração do tamanho da margem. E notem que coloquei o xlab="", pra ter certeza de que o comando gráfico não ia colocar um nome automático lá.

Brinque um pouco com os valores de line pra ver o efeito da distância, e mude o valor de side para escrever nome em qualquer uma das quatro margens.


Bônus: números nas barras e tirando os underlines dos nomes!

Eu meio que terminei aqui, mas aí olhei pro gráfico, ele olhou pra mim, e pensei em duas coisas que são úteis em gráficos de barras como este. Dependendo da escala do gráfico, colocar um número com os valores em cima das barras é super bacana. E aqueles underlines nos nomes das barras é um saco, mas são comuns no R (o R implica com espaços nos nomes e valores de variáveis, então quase sempre dados assim entram no R com underlines ou pontos no lugar dos espaços).

Podemos aprender a resolver estas duas coisas, então vamos lá!

par(mar=c(11,4,1,1))

gráfico<-barplot(dados.tabela, las=3, ylab="Frequência de algo?", xlab="", ylim=c(0,8))

mtext("Nomes esquisitos que inventei", side=1, line=10)

text(x=gráfico, y=dados.tabela+0.5, dados.tabela)

Notem que alterei o ylim, senão não daria para ver os valores em cima da barra que é maior.

Usei o comando text pra colocar os valores. Para ele funcionar, salvei o gráfico dentro de um objeto (que chamei com o criativo nome de “gráfico”!), pois usamos este objeto como referência das posições das barras. Usei um valor de 0.5 na posição, o que é fruto de tentativa e erro mesmo. Se a escala do gráfico for com valores muito maiores do que deste exemplo, é provável que você precise usar valores maiores, ok? Tentativa e erro, é só mexer que você descobre. E o último argumento são os valores em si, que serão colocados em cima das barrinhas.

Beleza, falta resolver o negócio dos underlines:

names(dados.tabela)<-gsub('_', ' ', names(dados.tabela))

Pronto, tá resolvido. A função gsub substitui coisas, e, neste caso, trocou os underlines por espaços em branco (de quebra, usei a função names pra mudar isso direto nos nomes da nossa tabela).

Vamos ver como ficou? Aqui está:

par(mar=c(11,4,1,1))

gráfico<-barplot(dados.tabela, las=3, ylab="Frequência de algo?", xlab="", ylim=c(0,8))

mtext("Nomes esquisitos que inventei", side=1, line=10)

text(x=gráfico, y=dados.tabela+0.5, dados.tabela)


Ufa, acho que já está de bom tamanho por hora. Espero que tenha sido proveitoso! Até a próxima!

Prof. Marcos