Arquivos e gráficos em R

Esse texto é um complemento ao outro post, que apresenta o básico sobre a linguagem R, sendo que agora são explicadas formas de ler e gravar arquivos de dados, assim como os principais pontos de se fazer um gráfico e exportá-lo como uma figura. Segue um script como exemplo das funções que realizam essas tarefas, assim como das opções de argumentos utilizáveis.

Ler e gravar arquivos de dados

A função “read.table()” permite ler um arquivo de dados e guardá-los em uma matriz. A opção “header=TRUE” especifica que a primeira linha é um cabeçalho e que não deve ser incluído na tabela. Veja o exemplo:

> RainData <- read.table("rain.dat", header=TRUE)

Como arquivo de entrada, também pode ser fornecido um link de página na internet. Também é possível definir o separador através da opção “sep”. Já a opção “strip.white=TRUE” remove espaços em branco extras, comum em arquivos com colunas de largura fixas. Da mesma forma trabalha a função “read.csv()” e “read.xls()”.

Para gravar alguma variável em arquivo CSV, utiliza a sintaxe “write.csv(objeto, file = filename)” – caso queira simplesmente em ASCII, retire o “.csv”. São opcionais as opções que definem o separador e a inclusão (TRUE) ou não (FALSE) dos nomes das linhas e colunas (“row.names” e “col.names”, respectivamente). A função “write.table” grava de uma forma mais “organizada”:

filepath = paste('caminho/', filename, sep = '')
write.table(forec.obj, filepath, quote = FALSE, row.names = FALSE, col.names = TRUE, sep = ',')

Existe também uma forma de gravar toda a saída de texto gerado pela rotina em um arquivo. Para isso, o trecho a ser impresso deve iniciar com o comando sink(“nome_do_arquivo.txt”) e terminar com sink() (sem argumento). Para ir acrescentando o texto no arquivo, utilize também a opção “append = TRUE”.

Gráficos

Plotar gráficos de pontos e linhas é algo muito importante para apresentação dos dados. O comando “plot(x,y)” pode ser utilizado para um gráfico simples. Para sua visualização, também seguem outras linhas de comando, que permitem visualizar o gráfico via terminal Linux:

X11()
plot(valores_x,valores_y)
message("Press Return To Continue")
invisible(readLines("stdin", n=1))

Para ampliar os recursos do R na confecção de gráficos, são necessários os seguintes pacotes: plyr, ggplot2 e scales. A função “ggplot” permite construir gráficos com muitos recursos, alguns deles utilizados como argumentos de sua função e outros adicionados pelo sinal de “+”. Veja algumas dessas opções:

  • geom_point() – adiciona pontos
  • geom_line() – adiciona linha(s)
  • scale_colour_manual() – utiliza escala de cores definida pelo usuário através de vetor de cores hexadecimal como primeiro argumento (veja uma tabela com nomes e códigos das cores no R clicando no link); também é possível alterar aí o nome da legenda e seus “labels” (rótulos)
  • scale_y_continuous() – edita o eixo y, como inserção de rótulo e definição de valores mínimo, máximo e intervalo (a função “expand_limits()” permite aumentar a visualização do gráfico, por exemplo, até y=0); o nome pode mudar de “continuous” para “discrete” no caso de dados discretos
  • scale_x_date() – edita o eixo x, como inserção/exclusão de rótulo (name=””), indicação de intervalo (data_breaks) e formato do rótulo
  • theme() – define a parte “estética”, como cor, tamanho, ângulo e posição dos textos, inclusive do título (axis.text.x, axis.text.y, legend.title, legend.text, legend.position, plot.title, etc)

Para gravar o gráfico gerado, deve-se colocar a função “png()” (para gravá-lo nesse formato) antes das linhas que geram o gráfico – deve-se colocar como argumento o nome do arquivo, podendo incluir largura e altura. Por último, feche o arquivo usando a função “dev.off()”.

Exemplo

Gráfico gerado em R pelo script de exemplo.
Gráfico gerado em R pelo script de exemplo.

Esse script lê um arquivo com dados observados e outro com dados previstos, ambos no formato de colunas “estacao,data,valor”. São calculados os valores de assertividade (veja mais no post sobre Assertividade) para quatro estações e salvos em uma “data frame” junto com as datas, valores observados, previstos e identificações das estações. Esse objeto é gravado em arquivo CSV e depois é feito o gráfico, que é gravado em formato PNG. Esse gráfico é de assertividade em função do tempo (por isso a variável x recebe os valores como data, ou seja, “as.Date”), e cada sequência corresponde a uma estação. Segue comentado no final uma rotina para reorganizar os dados de saída em um outro formato indicado.

## Script para calcular assertividade e fazer gráfico
require(plyr,lib="~/Rpacks")
require(ggplot2,lib="~/Rpacks")
require(scales,lib="~/Rpacks")

# Pegar valores de pMLT observada
arq_obs = read.csv('obs.csv', header = TRUE)
obs=arq_obs$avg_obs
datas=as.Date(arq_obs$data_previsao,format="%Y-%m-%d")
ids=arq_obs$id_est

# Pegar valores previstos
arq_prev = read.csv('prev.csv', header = TRUE)
prev=arq_prev$avg_prev

# Calcular assertividade:
i=1
assertividade=numeric(length(obs))
prev2=numeric(length(obs))
while (i <= length(obs)){
	if (obs[i] < prev[i]){
		assertividade[i] = obs[i]/prev[i]*100
		prev2[i]=prev[i]
	} else {
		assertividade[i] = prev[i]/obs[i]*100
		prev2[i]=prev[i]
	}
	i=i+1
}
assert=data.frame(ids,datas,obs,prev2,assertividade)
write.csv(assert, file = 'assert.csv')
# Fazer gráfico assertividade x tempo (cada id é uma sequência)

# Imprimir gráfico em PNG
png(file="grafico_assert.png", width=640, height=480)
ggplot(assert, aes(x=as.Date(datas), y=assertividade, colour=factor(ids), group=ids)) +
geom_point() + geom_line() +
scale_colour_manual(values = c("1" = "#004586", "2" = "#ff420e", "3" = "#ffd320", "4" = "#579d1c"), name="Estações", labels=c("Est1", "Est2", "Est3", "Est4")) +
scale_y_continuous(breaks=seq(0, 100, 10), name="Assertividade (%)") +
expand_limits(y=0) +
scale_x_date(labels = date_format("%m/%Y"), breaks = date_breaks("months"), name="") +
theme(axis.text.x = element_text(angle=30, hjust=1, colour="black", size=rel(1.5)), axis.text.y = element_text(hjust=1, colour="black", size=rel(1.5)),
legend.title = element_text(colour="black", size=rel(1.3), face="bold"), legend.text = element_text(colour="black", size = rel(1.3)), legend.justification=c(1,0), legend.position=c(1,0)) +
ggtitle("Assertividade") + theme(plot.title = element_text(lineheight=.8, face="bold"))
#Fechar arquivo
dev.off()

# Organizar dados: assert_id1 | assert_id2 | assert_id3 | assert_id4 | data (em vetor a parte)
#i=1
#n=1
#nlinhas=length(obs)/4
#dados=matrix(nrow=nlinhas, ncol=4)
#tempo=seq(as.Date("2014-02-01"), by=1, len=nlinhas)
#while (i <= length(obs)){
#	dados[n,ids[i]]=assertividade[i]
#	tempo[n]=datas[i]
#	if (i%%4 == 0){
#		n=n+1;
#	}
#	i=i+1
#}

Para imprimir diferentes séries, é necessário que o objeto de entrada esteja no formato “data,variável,valor”, onde a variável é o que definirá o agrupamento (no caso do exemplo, ids). Para criar essa tabela, é possível usar a função “test_data_long = melt(dados, id=”data”)” – para utilizá-la, deve-se instalar o pacote “reshape2”.

Obs: caso o ggplot esteja dentro de um loop, ele todo deve estar dentro de um print(), por exemplo “print(ggplot(df,aes(x,y))+geom_point())”.

Fontes

2 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.