R – gráficos usando o ‘lattice’ (com exemplos!)

O pacote lattice do R é uma ferramenta bastante útil para preparar painéis com gráficos de forma automatizada. Essa ferramenta, combinada com a leitura automática de arquivos de dados, torna a repetitiva visualização de dados e preparação de gráficos muito eficiente. Ajustar a apresentação dos gráficos, no entanto, exigem certa familiaridade e pode ser frustrante.

Neste artigo exemplificamos como usar o lattice e mudar a apresentação dos gráficos, eixos e legendas. Usamos para os exemplos uma base de dados disponível no R, o que pode parecer um pouco artificial. O melhor é tentar usar o lattice com os seus próprios dados. Referências de alguns paper que usaram o R para a preparação de figuras são listadas no final do artigo.

No meu trabalho tenho usado o lattice quando a visualização de uma quantidade grande de dados é necessária. Posso, por exemplo, combinar vários arquivos lidos automaticamente em uma base de dados grande com valores de dose (de radiação) em uma coluna, e outras colunas especificando posição de irradiação, tipo de feixe de irradiação, etc.. O lattice me ajuda a plotar os gráficos de dose versus posição por tipo de feixe.

Os exemplos abaixo contém provavelmente 90% das opções que temos usado. Com o tempo continuaremos a atualizar esse artigo com novos exemplos que acharmos importante. Agradecemos contribuições para melhorar o artigo – use os comentários e incorporaremos as sugestões no artigo no futuro.

Acessando uma base de dados

O R contém várias bases de dados que podem ser usados como exemplo. Aqui usaremos a base “Cars93”. Para entender como usar o lattice é importante conhecer e explorar a base de dados. Para isso, aqui estão alguns comandos comumente usados:

# para ver as bases de dados disponíveis
data()

# para carregar a base de dados
library(MASS) # carrega o pacote "MASS" que contém a base de dados
data(Cars93)  # carrega a base de dados "Cars93"
dim(Cars93)   # mostra número de linhas e colunas
?Cars93       # para obter informações sobre a base de dados

names(Cars93) # lista o nome das colunas da base de dados
head(Cars93)  # mostra as primeiras linhas da base de dados
dim(Cars93)   # mostra tamanho da base de dados

# mostra os valores únicos contidos em colunas específicas
unique(Cars93$Origin) 
unique(Cars93$Make)

Carregando o pacote lattice

library(lattice)     # carrega o pacote lattice
?lattice             # mostra ajuda do lattice

Plotando um gráfico e fazendo ajustes

Comando básico

O comando básico do lattice está exemplificado abaixo. O gráfico em si é preparado com o comando xyplot (outros disponíveis são barchart, bwplot, densityplot, dotplot, histogram, etc.). No comando pedimos que os dados MPG.city sejam pilotados versus EngineSize através da expressão “MPG.city ~ EngineSize” para o conjunto de dados total Cars93.

# um dos tipos de gráficos do pacote lattice
xyplot(MPG.city ~ EngineSize, Cars93)

O resultado, mostrado abaixo, mostra a tendência geral, mas não fornece informações mais detalhadas. Para isso precisaremos aprender como trabalhar melhor com o lattice.

Fig1

Fig. 1. Gráfico simples usando o lattice que não explora as vantagens da ferramenta.

Selecionando dados a serem plotados usando critérios

Dados podem ser selecionados usando a função subset como nos exemplos abaixo:

data <- subset(Cars93, Manufacturer == 'Ford')
data <- subset(Cars93, Manufacturer == 'Ford' 
               & Manufacturer == 'Chevrolet' )
data <- subset(Cars93, Manufacturer %in% 
               c('Ford', 'Chevrolet', 'Toyota', 'Honda')

Separando gráficos em diferentes painéis

Os gráficos acima não precisam do lattice. A vantagem do lattice aparece quando precisamos de gráficos com maiores detalhes, separados de acordo com outros fatores.

Por exemplo, em vez de plotar tudo junto como no gráfico acima, podemos plotar a mesma informação separada por fabricante (Manufacturer), usando o símbolo “|”. Os comandos para selecionar os dados de apenas quatro fabricantes e plotar os dados usando o lattice são:

# seleciona dados de quatro fabricantes para trabalhar 
data <- subset(Cars93, Manufacturer %in% 
               c('Ford', 'Chevrolet', 'Toyota', 'Honda')) 

xyplot(MPG.city ~ EngineSize | Manufacturer, data)
Fig. 3

Fig. 2. Exemplo de como plotar os gráficos separados por um fator, no caso os fabricantes.

Podemos separar os dados ainda mais, por exemplo, por tipo de carro (“Type”), como no seguinte exemplo, usando a opção group. Note a adição da função auto.key, que adiciona a legenda.

xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       group = Type, auto.key = T)
Fig

Fig. 3. Exemplo do uso da legenda.

Usando três níveis de classificação

Como mais um exemplo da utilidade do lattice, o gráfico abaixo apresenta o rendimento do carro (MPG.city) versus tamanho do motor (EngineSize) de acordo com o tamanho do carro e dividido entre carros produzidos dentro e fora dos EUA, por número de passageiros. Note como isso é expresso na fórmula da função xyplot:

# seleciona apenas três tipos de carro
data <- subset(Cars93, Type %in% c('Compact', 'Small', 'Large'))

# plota de acordo com origem, tipo e por número de passageiros
xyplot(MPG.city ~ EngineSize | Origin + Type, data, 
       group = Passengers,
       auto.key = list(space = 'right'))

 

Fig

Fig. 4. Exemplo do uso do lattice para automaticamente plotar os gráficos de acordo com tipo de carro (“compact”, “large” e “small”), origem (“USA” e “non-USA”) e número de passageiros (4, 5 e 6).

Legenda

A legenda pode ser colocada em lugar mais apropriado. O exemplo abaixo coloca a legenda do lado direito.

xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       group = Type, auto.key = list(space = 'right'))
Fig. 5

Fig. 5. Exemplo da colocação da legenda do lado direito do gráfico.

Para outras posições, use as opções abaixo em lugar de “auto.key = T”:

# legenda do lado direito:
auto.key = list(space = 'right')

# legenda em cima, em 3 colunas
auto.key = list(space = 'top', columns = 3)

# legenda dentro do gráfico
auto.key = list(corner = c(0, 0.85))

Para mudar o típo de legenda de ponto para linhas, ou pontos e linhas, use a opção:

# legenda com linhas, sem pontos
auto.key = list(points = F, lines = T)

Título e nome dos eixos

Para colocar um título no gráfico e mudar o nome dos eixos, use main, xlab e ylab:

xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
     group = Type, 
     auto.key = list(space = 'right'),
     main = 'Relação entre rendimento e motor',
     xlab = 'tamanho do motor (litros)',
     ylab = 'rendimento (milhas por galão)')
fig

Fig. 6. Exemplo da colocação de título e da mudança do nome dos eixos no gráfico.

Para mostras o título dos eixos de forma apropriada (por exemplo, com o expoente 2 em cm2 de forma apropriada), use:

ylab = expression(paste('area (', cm^2, ')'))

Mudando o tipo de gráfico

# pontos
xyplot(MPG.city ~ EngineSize | Manufacturer, data, type = 'p')

# linhas
xyplot(MPG.city ~ EngineSize | Manufacturer, data, type = 'l')   

# linhas e pontos
xyplot(MPG.city ~ EngineSize | Manufacturer, data, type = 'o')

Eixos

Para evitar que as escalas fiquem trocando de lado como na Fig. 6, adicione a opção “alternative = F” na lista de especificações de scale.

xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       scale = list(alternating = F))
Fig

Fig. 7. Exemplo de gráfico em que as escalas não ficam alternando de lado.

Para mudar os limites dos eixos, use opções como:

# ajustando o limite dos eixos em todos os painéis
xlim = c(10, 100)
ylim = c(1, 2) 

Para mudar o limite de cada painel individualmente, use uma lista:

# ajustando o limite dos eixos x em 4 painéis diferentemente
xlim = list(c(5, 8), c(10, 13), c(15, 18), c(20, 23))

No exemplo acima, a escada dos eixos precisa ser independente (veja explicação mais abaixo): scales = list(x = “free”).

Colocando separação entre os gráficos

Para mudar a separação entre os gráficos, use a opção between.

# separação ao longo do eixo x
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       between = list(x = 1))

# separação ao longo do eixo y
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       between = list(y = 1))

# separação em x e y
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
       between = list(x = 1, y = 1))
Fig

Fig. 8. Exemplo de gráficos com separação adicional entre os painéis. Essa separação pode ser usada para tornar mais claro a distinção entre linhas ou colunas dos gráficos.

Tornando os eixos independentes

Normalmente o lattice coloca todos os painéis na mesma escala para melhor comparação entre os resultados. Nem sempre esse é o comportamento desejado. Para tornar os eixos independentes, use a opção “relation”.

# forma simplificada
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
 group = Type,
 scale = list(x = 'free', y = 'free'))

# forma mais completa, se mais opções tiverem que ser usadas (por 
# exemplo log scale)
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
 group = Type,
 scale = list(x = list(relation = 'free'), 
              y = list(relation = 'free')))

Gráficos monolog e dilog

# gráfico log em y (base 10)
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
 group = Type,
 scale = list(y = list(log = 10)))

# mesmo gráfico, mas com eixos independentes y nos painéis
xyplot(MPG.city ~ EngineSize | Manufacturer, data, 
 group = Type,
 scale = list(y = list(log = 10, relation = 'free')))

 

Mudando a posição dos painéis

Para mudar a posição dos painéis, use a opção index.cond. Para gráficos com apenas um parâmetro (no caso fabricante), veja o exemplo abaixo. Aumentamos o número de fabricantes, apenas para exemplificar.

# seleciona os dados de 6 fabricantes
data = subset(Cars93, Manufacturer %in% 
              c('Ford', 'Chevrolet', 'Toyota', 
                'Honda', 'Nissan', 'Subaru'))
# plota o gráfico trocando a ordem do primeiro e segundo painel
xyplot(MPG.city ~ EngineSize | Manufacturer, data,
 index.cond = list(c(2,1,3,4,5,6)))

Nota: o índice dos gráficos são esquerda para a direita, de baixo para cima.

Fig

Fig. 9. Exemplo de gráfico no qual os fabricantes “Chevrolet” e “Ford” aparecem em posição trocada.

Quando mais de um nível estão presentes, a função se torna:

# seleciona dados
 data = subset(Cars93, Type %in% c('Compact', 'Small', 'Large'))
# plot dados como na Fig. 9, mas com a ordem do segundo fator (Type) trocada
xyplot(MPG.city ~ EngineSize | Origin + Type, data,
       group = Passengers,
       auto.key = list(space = 'right'),
       index.cond = list(c(1, 2), c(1, 3, 2)))

O primeiro vetor na lista index.cond diz que a sequência do fator “Origin” deve permanecer igual, enquanto o do segundo fator (“Type”), os níveis devem ser na ordem especificada.

Fig

Fig. 10. Exemplo do qual a ordem dos gráficos aparece reorganizada. Compare essa figura com a Fig. 4.

Mudando o aspecto dos painéis

O aspecto dos painéis pode ser mudado usando a opção aspect:

# seleciona dados
data <- subset(Cars93, Manufacturer %in% 
               c('Ford', 'Chevrolet', 'Toyota', 
                 'Honda', 'Nissan', 'Subaru'))

# usa aspecto diferente para os painéis
xyplot(MPG.city ~ EngineSize | Manufacturer, data, aspect = 0.7)

Mudando os ticks

Os ticks podem ser controlados usando a opção at dentro da lista de especificações scale e dentro da lista de especificações do eixo específico:

# seleciona dados
data <- subset(Cars93, Manufacturer %in% c('Ford', 'Chevrolet', 'Toyota', 'Honda'))
# plota dados com escala y livre e ticks nas posições indicadas
xyplot(MPG.city ~ EngineSize | Manufacturer, data,
       scales = list(alternating = F, 
       y = list(relation = 'free', at = c(10, 20, 30, 40, 50))))

# Note que a opção at está dentro da lista scales.
Fig. 11. Exemplo de gráfico com ticks no eixo y apenas em 10, 20, 30 e 40.

Fig. 11. Exemplo de gráfico com ticks no eixo y apenas em 10, 20, 30 e 40.

 

Outras opções

Os gráficos no lattice funcionam como uma matriz e podem ser apresentados de forma transposta.

data <- subset(Cars93, Type %in% c('Compact', 'Small', 'Large'))

# define o objeto grafico
grafico <- xyplot(MPG.city ~ EngineSize | Origin + Type, data, 
                  group = Passengers,
                  auto.key = list(space = 'right'),
                  index.cond = list(c(1, 2), c(1, 3, 2)))

# plota o objeto gráfico com os painéis transpostos
update(t(grafico))
Fig15

Fig. 12. Gráficos com a ordem dos painéis transposta.

Salvando os gráficos automaticamente

Lembre-se que os gráficos podem ser salvos automaticamente usando:

dev.copy(device = pdf, file = "exemplo.pdf", 
         width = 600, paper = "USr")
dev.off()

Exemplos de publicações que usam o lattice

  • Edmund, J.M., Andersen, C.E., Greilich, S., Sawakuchi, G.O., Yukihara, E.G., Jain, M., Hajdas, W. and Mattsson, S., 2007. Optically stimulated luminescence from Al2O3:C irradiated with 10-60 MeV protons. Nucl. Instrum. Methods. Phys. Res. A 580, 210-213.
  • Andersen, C.E., Nielsen, S.K., Greilich, S., Helt-Hansen, J., Lindegaard, J.C. and Tanderup, K., 2009. Characterization of a fiber-coupled Al2O3:C luminescence dosimetry system for online in vivo dose verification during 192Ir brachytherapy. Med. Phys. 36, 708-718.
Anúncios

Sobre Eduardo Yukihara

Pesquisador | Professor | Autor
Galeria | Esse post foi publicado em Prática e ferramentas e marcado , , , , . Guardar link permanente.

4 respostas para R – gráficos usando o ‘lattice’ (com exemplos!)

  1. Josué Raizer disse:

    Muito boa e útil a postagem. Logo de cara encontrei um pequeno erro: faltou fechar um parenteses em
    data <- subset(Cars93, Manufacturer %in%
    c('Ford', 'Chevrolet', 'Toyota', 'Honda')

    O gráfico gerado também não corresponde ao comando
    xyplot(MPG.city ~ EngineSize, data)

    O gráfico mostrado no post é para os dados totais (Cars93):
    xyplot(MPG.city ~ EngineSize, Cars93)

    Abraço

    Curtir

  2. Ana disse:

    Olá,
    gostaria de saber se tem como arranjar os gráficos de forma diferente. Por exemplo, como eu consigo colocar os 6 gráficos da última figura em coluna (um embaixo do outro)?
    Obrigada.

    Curtir

    • Jean Karlos disse:

      use o comando layout=c(1,6) dentro do comando xyplot… normalmente seria o numero de linhas primeiro e depois o de coluna, mas não sei porque no lattice, é o numero de coluna primeiro!!!

      grafico <- xyplot(MPG.city ~ EngineSize | Origin + Type, data,
      group = Passengers, layout=c(1,6),
      auto.key = list(space = 'right'),
      index.cond = list(c(1, 2), c(1, 3, 2)))

      Curtir

Dê também a sua contribuição ou sugestão.

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s