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.
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)
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)
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. 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'))
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)')
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))
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. 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.
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. 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.
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))
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.
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
CurtirCurtir
Josué: muito obrigado! Já fiz as correções no texto. Abraços!
CurtirCurtir
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.
CurtirCurtir
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)))
CurtirCurtir