Gráficos no Valeska Andreozzi [email protected] Centro de Estatı́stica e Aplicações da Universidade de Lisboa Faculdade de Ciências da Universidade de Lisboa Lisboa, 2012 Sumário 1 Referências 2 2 Demonstrações de gráficos 2 3 Exemplo 3 4 Gráfico de dispersão 3 5 Incluindo uma linha ou pontos num gráfico 4 6 Gráfico de barras 5 7 Cores 7 8 Incluindo um texto no gráfico 8 9 Vários gráficos numa janela 10 9.1 Áreas de tamanhos iguais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 9.2 Exercı́cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 9.3 Áreas de tamanhos diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1 Valeska Andreozzi Gráficos no R 10 Alteração de parâmetros gráficos 12 10.1 Tipo de pontos: pch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.2 Tipo de gráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 10.3 Largura da linha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 10.4 Tipo da linha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 10.5 Eixos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 11 Ajuda 16 12 Exercı́cio 16 13 Gráficos condicionais 16 14 Mais um gráfico interessante 18 14.1 Gráfico para série temporal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 14.2 Exercı́cio 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Gráficos multivariados 15.1 Exercı́cio 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 16 Gravando um gráfico em arquivo 21 17 Gráficos mais especializados 21 1 Referências • Visualização de dados em http://neacm.fe.up.pt/CRAN/doc/contrib/Torgo-ProgrammingIntro.pdf • http://addictedtor.free.fr/graphiques/ • http://bm2.genes.nig.ac.jp/RGM2/pkg.php?p=graphics O R permite elaborar gráficos com grande qualidade. A seguir serão ilustrados alguns exemplos. 2 Demonstrações de gráficos demo() demo(graphics) demo(image) demo(persp) demo(plotmath) Os gráficos serão abordados de forma prática através de exemplos. 2 Valeska Andreozzi 3 Gráficos no R Exemplo Primeiro Vamos trabalhar com o seguinte banco de dados: milsa <- read.table("http://www.leg.ufpr.br/~paulojus/aulasR/dados/milsa.dat", head = T) names(milsa) str(milsa) head(milsa) Transformando os dados do banco de dados milsa dados <- transform(milsa, civil = factor(civil, label = c("solteiro", "casado"), levels = 1:2), instrucao = factor(instrucao, label = c("1oGrau", "2oGrau", "Superior"), lev = 1:3, ord = T), regiao = factor(regiao, label = c("capital", "interior", "outro"), lev = c(2, 1, 3))) dados <- transform(dados , idade = ano + mes/12) names(dados) head(dados) 4 Gráfico de dispersão A função plot é utilizada para fazer um gráfico de dispersão (de pontos). 35 30 25 20 dados$idade 40 45 50 plot(dados$idade) 0 5 10 15 20 25 30 35 Index plot(dados$idade,dados$salario) 3 Gráficos no R 5 10 15 dados$salario 20 Valeska Andreozzi 20 25 30 35 40 45 50 dados$idade plot(dados) 1.8 0 2 4 20 40 1.0 2.5 20 1.0 1.8 0 funcionario 2.5 1.0 civil 0 2 4 1.0 instrucao 5 15 filhos 40 salario 6 20 ano 2.5 0 mes 40 1.0 regiao 20 idade 0 20 1.0 2.5 5 15 0 6 20 40 plot(dados[,c("filhos", "salario","idade")]) 10 15 20 3 4 5 5 15 20 0 1 2 filhos 40 45 50 5 10 salario 20 25 30 35 idade 0 5 1 2 3 4 5 20 25 30 35 40 45 50 Incluindo uma linha ou pontos num gráfico Para incluir uma linha num gráfico podemos utilizar a função abline() ou lines(). Para incluir pontos num gráfico existente podemos utilizar a função points(). Vejamos um exemplo com a função abline() : plot(dados$idade,dados$salario) abline(h=15) abline(v=35) abline(a=0,b=1) 4 Gráficos no R 5 10 15 dados$salario 20 Valeska Andreozzi 20 25 30 35 40 45 50 dados$idade 6 Gráfico de barras O argumento principal do gráfico de barras é a altura, que pode ser dada na forma de um vetor ou de uma matrix. A função table pode ser utilizada para criar o objeto que contenha as alturas das barras. Veja o exemplo para a variável regiao 0 2 4 6 8 10 12 t1<-table(dados$regiao) t1 barplot(t1,col=1:3) capital interior outro Vamos criar uma tabela com o percentual de solteiros e casados para cada nı́vel de escolaridade library(gmodels) tabela<-CrossTable(dados$civil,dados$instrucao) names(tabela) x<-tabela$prop.col barplot(x) 5 Gráficos no R 0.0 0.2 0.4 0.6 0.8 1.0 Valeska Andreozzi 1oGrau 2oGrau Superior barplot(x,beside=T) Para acrescentar uma legenda, usamos o argumento legend=T barplot(x,beside=T,legend=T,col=3:4) 0.0 0.1 0.2 0.3 0.4 0.5 0.6 solteiro casado 1oGrau 2oGrau Superior Podemos aumentar a escala do eixo dos y para a legenda não ficar por cima das barras 0.8 barplot(x,beside=T,legend=T,col=3:4,ylim=c(0,.8)) 0.0 0.2 0.4 0.6 solteiro casado 1oGrau 2oGrau Superior Outro exemplo barplot(table(dados$instrucao,dados$civil),beside=T,legend=T,col=3:5) 6 Gráficos no R 12 Valeska Andreozzi 0 2 4 6 8 10 1oGrau 2oGrau Superior solteiro casado Podemos mudar o texto da legenda com o argumento legend.text= 12 barplot(table(dados$instrucao,dados$civil),beside=T,col=3:5, legend.text=c("básico","secundário","superior")) 0 2 4 6 8 10 básico secundário superior solteiro casado Podemos mudar vários elementos da legenda fornecendo uma lista de valores para o argumento args.legend =. No exemplo a seguir foi alterada a posição da legenda (x = "topleft" ) e também foi retirada a caixa em volta da legenda com o argumento bty="n" básico secundário superior 0 2 4 6 8 10 12 barplot(table(dados$instrucao,dados$civil),beside=T,col=3:5, legend.text=c("básico","secundário","superior"), args.legend = list(x = "topleft",bty="n")) solteiro 7 casado Cores Uma ótima referência para trabalhar com as cores está em http://research.stowers-institute.org/efg/R/Color/Chart/ 7 Valeska Andreozzi Gráficos no R A função colours() lista o nome das cores que podemos utilizar no R colours() colours()[4:6] Para selecionar todas as cores que incluem a palavra red usamos a funçao grep grep("red",colours()) vermelhos<-colors()[grep("red",colors())] vermelhos barplot(t1,col=vermelhos[4:6]) 8 Incluindo um texto no gráfico Podemos incluir um texto no gráfico com a função () ou com a função locator, como veremos a seguir. 12 barplot(t1,col=colours()[4:6]) t1.prop<-prop.table(t1) t1.prop texto<-paste(round(t1.prop*100,2),"%",sep="") texto text(locator(n=3),texto) 36.11% 0 2 4 6 8 10 33.33% 30.56% capital interior outro Outra possibilidade é usar a funçao text(). Para isso é necessário fornecer os valores das abiscissa e das ordenadas onde serão incluı́dos oss textos. 8 Valeska Andreozzi Gráficos no R 2 4 6 8 10 12 x<-barplot(t1,col=colours()[406:408]) text(x,1,texto) 33.33% 36.11% capital interior outro 0 30.56% Outro exemplo com tabela de contingência t2<-with(dados,table(instrucao,civil)) t2 plot(t2) t2 2oGrau Superior casado civil solteiro 1oGrau instrucao Alterando o tı́tulo e os nome dos eixos plot(t2,main="Estado Civil vs Escolaridade",xlab="Escolaridade", ylab="Estado Civil",col="lightblue") Estado Civil vs Escolaridade 2oGrau Superior casado Estado Civil solteiro 1oGrau Escolaridade barplot(t2) 9 Gráficos no R 0 5 10 15 20 Valeska Andreozzi solteiro casado 12 barplot(t2,beside=T,legend=T,args.legend = list(x = "topleft",bty="n"), names.arg=c("Solteiros","Casados")) 0 2 4 6 8 10 1oGrau 2oGrau Superior Solteiros 9 Casados Vários gráficos numa janela 9.1 Áreas de tamanhos iguais par(mfrow=c(2,2)) hist(dados$idade) hist(dados$idade,main="Histograma da idade",xlab="idade", ylab="Frequ^ encia absoluta",col="yellow",border="red") boxplot(idade~regiao,data=dados,col=3:5,ylab="idade") title("Distribuiç~ ao da Idade por Regi~ ao") pie(table(dados$regiao),main="Gráfico de setores: Regi~ ao") 0 2 4 6 8 10 Histograma da idade Frequência absoluta 8 10 6 4 0 2 Frequency Histogram of dados$idade 20 25 30 35 40 45 50 20 25 30 35 40 45 50 idade Distribuição da Idade por Região Gráfico de setores: Região 50 dados$idade 30 outro 20 idade 40 capital interior capital interior outro 10 Valeska Andreozzi 9.2 Gráficos no R Exercı́cio Faça os seguintes gráficos numa mesma janela gráfica utilizando o objeto dados 1. gráfico de dispersão idade X salario 2. gráfico de dispersão idade X filhos 3. gráfico de dispersão salario X filhos 4. gráfico de barras de estado civil X região Use a imaginação e mude as cores default dos gráficos, inclua um tı́tulo, uma legenda. 9.3 Áreas de tamanhos diferentes Para subdividir a janela gráfica em gráficos de tamanhos diferentes, usamos a função layout(). No exemplo a seguir temos um janela gráfica dividida em 4 partes iguais. y<-matrix(1:4,2,2) y layout(y) hist(dados$idade) hist(dados$idade,main="Histograma da idade",xlab="idade", ylab="Frequ^ encia absoluta",col="yellow",border="red") boxplot(idade~regiao,data=dados,col=3:5,ylab="idade") title("Distribuiç~ ao da Idade por Regi~ ao") pie(table(dados$regiao),main="Gráfico de setores: Regi~ ao") Distribuição da Idade por Região idade 30 40 8 10 6 4 20 0 2 Frequency 50 Histogram of dados$idade 20 25 30 35 40 45 50 capital interior outro dados$idade 8 10 Gráfico de setores: Região capital 2 4 6 interior outro 0 Frequência absoluta Histograma da idade 20 25 30 35 40 45 50 idade Agora temos a primeira linha com o dobro de tamanho da segunda acrescentando o argumento height=. layout(y,height=c(2,1)) hist(dados$idade) hist(dados$idade,main="Histograma da idade",xlab="idade", ylab="Frequ^ encia absoluta",col="yellow",border="red") 11 Valeska Andreozzi Gráficos no R boxplot(idade~regiao,data=dados,col=3:5,ylab="idade") title("Distribuiç~ ao da Idade por Regi~ ao") pie(table(dados$regiao),main="Gráfico de setores: Regi~ ao") Distribuição da Idade por Região 40 30 35 idade 6 4 20 0 25 2 Frequency 8 45 10 50 Histogram of dados$idade 20 25 30 35 40 45 50 capital interior outro Gráfico de setores: Região Histograma da idade capital 6 interior outro 0 Frequência absoluta dados$idade 20 25 30 35 40 45 50 Com o argumento width= alteramos também a largura dos gráficos. idade 4 Frequency 15 1 3 0 5 2 10 dados$salario 6 20 8 layout(matrix(c(1,2,3,0),ncol=2),height=c(2,1),width=c(2,1)) layout.show(3) plot(dados$idade,dados$salario) hist(dados$idade,main="",xlab="idade", ylab="Frequ^ encia absoluta",col="yellow",border="red") hist(dados$salario, main="") 20 25 30 35 40 45 50 5 15 6 dados$salario 2 0 Frequência absoluta dados$idade 20 25 30 35 40 45 50 idade Outra possibilidade é utilizar a função split.screen() para subdividir uma janela gráfica. Consulte o help. 10 10.1 Alteração de parâmetros gráficos Tipo de pontos: pch O tipo de pontos pode ser alterado através do argumento pch. Verifique o help da funções points() para encontrar os possı́veis valores do deste argumento. plot(dados$idade,dados$salario,xlab="idade",ylab="salário") 12 Gráficos no R 15 5 10 salário 20 Valeska Andreozzi 20 25 30 35 40 45 50 idade 15 5 10 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",pch=19) 20 25 30 35 40 45 50 idade 5 10 1:25 15 20 25 plot(1:25,pch=1:25,col=grep("red",colours())[1:25]) 5 10 15 20 25 Index 10.2 Tipo de gráfico O tipo gráfico pode ser alterado através do argumento type= dados<-dados[order(dados$idade),] plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="l",pch=19) 13 Gráficos no R 15 5 10 salário 20 Valeska Andreozzi 20 25 30 35 40 45 50 idade 15 5 10 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="b",pch=19) 20 25 30 35 40 45 50 idade 15 5 10 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="h") 20 25 30 35 40 45 50 idade Para maiores detalhes veja o help da função plot(). 10.3 Largura da linha O argumento lwd= altera a largura da linha. plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="l",lwd=2) 14 Gráficos no R 15 5 10 salário 20 Valeska Andreozzi 20 25 30 35 40 45 50 idade 10.4 Tipo da linha O tipo da linha é alterado através do argumento lty= 15 5 10 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="l",lty=2) 20 25 30 35 40 45 50 idade 10.5 Eixos Para alterar o tamanho dos labels dos eixos utilize o argumento cex.axis=. 15 5 10 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="l",lty=2,cex.axis=2) 20 25 30 35 40 45 50 idade Para alterar o tamanho dos nomes dos eixos utilize o argumento cex.lab. plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="l",lty=2,cex.lab=2) 15 Gráficos no R 15 5 10 salário 20 Valeska Andreozzi 20 25 30 35 40 45 50 idade 11 Ajuda ?plot ?plot.default ?par 12 Exercı́cio Faça um gráfico com linhas (pontilhada em vermelho) e pontos (quadrado) da idade versus salário com labels dos eixos em azul e tı́tulo rosa. Utilize o help da função par para encontar os argumentos necessários para fazer tais alterações. 13 Gráficos condicionais 15 10 5 salário 20 plot(dados$idade,dados$salario,xlab="idade",ylab="salário",pch=19) cond<-which(dados$idade>35 & dados$idade>15) points(dados$idade[cond],dados$salario[cond],pch=19,col="red") 20 25 30 35 40 45 50 idade plot(dados$idade,dados$salario,xlab="idade",ylab="salário",type="n") cond<-which(dados$civil=="casado") 16 Valeska Andreozzi Gráficos no R 5 10 salário 15 20 points(dados$idade[cond],dados$salario[cond],pch=19,col="red") cond<-which(dados$civil=="solteiro") points(dados$idade[cond],dados$salario[cond],pch=19,col="blue") 20 25 30 35 40 45 50 idade Outro exemplo de gráfico condicional coplot(salario ~ idade | civil, data = dados,pch=21,bg="green") Given : civil casado solteiro 25 30 35 40 45 50 15 5 10 salario 20 20 20 25 30 35 40 45 50 idade Gráfico condicional usando a função pairs() ?iris head(iris) str(iris) pairs(iris[1:4]) 3.0 4.0 0.5 1.5 2.5 6.5 7.5 2.0 4.0 4.5 5.5 Sepal.Length 5 6 7 2.0 3.0 Sepal.Width 1.5 2.5 1 2 3 4 Petal.Length 0.5 Petal.Width 4.5 5.5 6.5 7.5 1 2 3 4 5 6 7 table(iris$Species) cores<-rep(c("red", "green3", "blue"),each=50) 17 Valeska Andreozzi Gráficos no R cores pairs(iris[1:4], main = "Anderson’s Iris Data -- 3 species", pch = 21, bg = cores) Anderson’s Iris Data −− 3 species 3.0 4.0 0.5 1.5 2.5 6.5 7.5 2.0 4.0 4.5 5.5 Sepal.Length 1 2 3 4 5 6 7 2.0 3.0 Sepal.Width 1.5 2.5 Petal.Length 0.5 Petal.Width 4.5 5.5 6.5 7.5 14 1 2 3 4 5 6 7 Mais um gráfico interessante library(car) scatterplot(salario~idade|instrucao,data=dados) instrucao 15 5 10 salario 20 1oGrau 2oGrau Superior 20 25 30 35 40 45 50 idade 14.1 Gráfico para série temporal Para criar um objeto do tipo série temporal, utilize a função ts() doutor<-read.table("pordata_doutoramentos.csv",header=T,sep=",") total<-ts(doutor$total, start = 1970, end = 2008, frequency = 1) Gráfico da série temporal plot.ts(total) 18 Gráficos no R 50 100 total 150 200 Valeska Andreozzi 1970 1980 1990 2000 Time Podemos criar uma série multivariada e automaticamente fazer o gráfico de todas as séries multi<-ts(doutor[,-1], start = 1970, end = 2008, frequency = 1) plot(multi,main="Doutoramentos por paı́s") franca 30 8 4 italia 8 0 4 holanda 6 4 2 6 4 uk outros 0 10 30 20 60 0 2 25 15 80 40 0 espanha 5 eua 35 0 brasil 80 belgica 8 0 10 150 50 total Doutoramentos por país 1970 1980 1990 Time 2000 1970 1980 1990 2000 Time plot(multi,main="Doutoramentos por paı́s",yax.flip = TRUE,xlab="Ano") 14.2 Exercı́cio Faça um gráfico para ilustrar os dados do Pordata sobre alunos matriculados: por nı́vel de ensino e sexo em Portugal. Os dados estão no ficheiro pordatanumeroalunos.csv 15 Gráficos multivariados Exemplos de dados longitudinais d2<-read.table("seizure.dat",header=T) names(d2) head(d2) linhas<- d2$id %in% 104 linhas plot(d2$visit[linhas],d2$counts[linhas],type="l",xlab="Visita", ylab="Episódios de Epilepsia") 19 Valeska Andreozzi Gráficos no R 8 6 4 Episódios de Epilepsia 10 linhas<- d2$id %in% 106 linhas lines(d2$visit[linhas],d2$counts[linhas]) #quantos indivı́duos tem length(unique(d2$id)) 0 1 2 3 4 Visita 100 50 0 Episódios de Epilepsia 150 linhas<- d2$id %in% 104 limitey<-range(d2$counts) plot(d2$visit[linhas],d2$counts[linhas],type="l",xlab="Visita", ylab="Episódios de Epilepsia",ylim=limitey) id<-unique(d2$id) for (i in 2:59){ linhas<- d2$id %in% id[i] lines(d2$visit[linhas],d2$counts[linhas]) } 0 1 2 3 4 Visita Mesmo gráfico agora usando a função matplot() x<-0:4 y<-matrix(d2$counts,nrow=5,byrow=F) x y matplot(x,y,type="l") 20 Gráficos no R 0 50 y 100 150 Valeska Andreozzi 0 1 2 3 4 x 15.1 Exercı́cio No gráfico anterior, 1. altere os labels dos eixos 2. insira um tı́tulo 3. insira o texto “outlier” onde houver um observação outlier. 4. grave o gráfico no formato wmf 16 Gravando um gráfico em arquivo Quando estiver na janela gráfica, pode-se usar o menu File>Save as para salvar um gráfico em diferentes formatos. Outra possibilidade é usar as funções especı́ficas para guardar gráficos, como por exemplo jpeg(), win.metafile() e postscript(). jpeg("meugrafico2.jpeg",quality=100) scatterplot(salario~idade|instrucao,data=dados,smooth=F) dev.off() win.metafile("meugrafico3.wmf") scatterplot(salario~idade|instrucao,data=dados,smooth=F) title("Salário vs Idade") dev.off() 17 Gráficos mais especializados A biblioteca lattice oferece uma gama de gráficos multivariados mais especializados, mas que fica fora do escopo deste curso. Para os interessados uma referência está em: http://lmdvr.r-forge.r-project.org/figures/figures.html 21