Visualização de dados menos usada [fechada]

178

Histogramas e gráficos de dispersão são ótimos métodos para visualizar dados e o relacionamento entre variáveis, mas recentemente estive pensando sobre quais técnicas de visualização estão faltando. O que você acha que é o tipo de enredo mais subutilizado?

As respostas devem:

  1. Não deve ser muito usado na prática.
  2. Seja compreensível sem muita discussão em segundo plano.
  3. Seja aplicável em muitas situações comuns.
  4. Inclua código reproduzível para criar um exemplo (de preferência em R). Uma imagem vinculada seria legal.
Ian Fellows
fonte
13
Eu acho que essa discussão é muito útil e, infelizmente, está fechada.
Alex Brown
2
@AlexBrown: então por que não votar para reabrir? Entendo por que o texto desta pergunta pode parecer "não construtivo", mas essa pergunta resultou em algumas das respostas mais criteriosas e esclarecedoras sobre esse tópico em qualquer lugar da Web. Gostaria muito de ver essas respostas atualizadas e estendidas.
Max
2
Provavelmente, isso deve ser movido para stats.stackoverflow.com. É muito mais adequado para esse site.
naught101
4
Pena que ninguém mencionou gráficos de QQ aqui antes que este fosse fechado. Eles são tão úteis!
naught101
Isso deve ser reaberto.
Peter Flom

Respostas:

89

Eu realmente concordo com os outros pôsteres: os livros de Tufte são fantásticos e vale a pena ler.

Primeiro, eu apontaria para você um ótimo tutorial sobre ggplot2 e ggobi em "Looking at Data" no início deste ano. Além disso, eu destacaria apenas uma visualização do R e dois pacotes gráficos (que não são tão amplamente usados ​​quanto os gráficos base, treliça ou ggplot):

Mapas de calor

Eu realmente gosto de visualizações que podem lidar com dados multivariados, especialmente dados de séries temporais. Mapas de calor podem ser úteis para isso. Um realmente interessante foi apresentado por David Smith no blog Revolutions . Aqui está o código ggplot, cortesia de Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

O que acaba parecendo algo assim:

texto alternativo

RGL: Gráficos 3D interativos

Outro pacote que vale a pena ser aprendido é o RGL , que fornece facilmente a capacidade de criar gráficos 3D interativos. Existem muitos exemplos online para isso (inclusive na documentação do rgl).

O R-Wiki tem um bom exemplo de como plotar gráficos de dispersão 3D usando rgl.

GGobi

Outro pacote que vale a pena conhecer é o rggobi . Há um livro da Springer sobre o assunto e muita documentação / exemplos on-line, inclusive no curso "Looking at Data" .

Shane
fonte
legais. Obrigado por incluir o código / imagem.
Ian Fellows
o que é indicado pela posição vertical do 'Z' ou dobra em cada linha vertical preta sólida?
doug
Esses são os limites do mês (os meses não terminam no mesmo dia).
Shane
3
Isso é bonito. Como você conseguiu que os limites do mês acontecessem?
Alex Brown
58

Eu realmente gosto de pontos e, quando os recomendo a outros, quando os recomendo, para problemas de dados apropriados, eles sempre ficam surpresos e encantados. Eles não parecem ter muita utilidade, e eu não consigo entender o porquê.

Aqui está um exemplo do Quick-R: dotplot em dados do carro

Acredito que Cleveland é o principal responsável pelo desenvolvimento e promulgação deles, e o exemplo em seu livro (em que dados defeituosos eram facilmente detectados com um gráfico de pontos) é um argumento poderoso para seu uso. Observe que o exemplo acima coloca apenas um ponto por linha, enquanto que a potência real deles vem com vários pontos em cada linha, com uma legenda explicando qual é qual. Por exemplo, você pode usar símbolos ou cores diferentes para três pontos no tempo diferentes e, portanto, obter facilmente uma sensação de padrões de tempo em diferentes categorias.

No exemplo a seguir (feito no Excel de todas as coisas!), Você pode ver claramente qual categoria pode ter sofrido uma troca de rótulo.

Dotplot com 2 grupos

Ari B. Friedman
fonte
1
Qual é a diferença entre um gráfico de pontos e um gráfico de dispersão com eixo comutado, um dos quais é categórico?
DrSAR 10/11/11
4
@DrSAR Como um histograma é diferente de um gráfico de barras ou um gráfico de densidade diferente de um gráfico de linhas? Você pode descrever muitos tipos de gráficos padrão em termos de geometrias mais fundamentais (cf Semiologie Graphique de Bertin ), mas isso não torna a visão de plotar algo de uma maneira particular menos única. Nesse caso, você está plotando duas partes de informações categóricas (uma verticalmente, uma pela forma do caractere de plotagem) em uma parte de dados contínuos. Enquanto na maioria dos pacotes de software você invadiria um gráfico de dispersão para criá-lo, o mais enfaticamente não é um gráfico de dispersão.
Ari B. Friedman
2
@ gsk3 Não quis parecer irreverente. De fato, agora (depois de ler mais sobre gramática de gráficos e trabalhos semelhantes) percebo que essa distinção de nível superior pode ser bastante importante para a apresentação. Obrigado por mostrar isso.
DrSAR 11/11/11
@DrSAR E eu não quis parecer defensivo. Natureza do SO comenta acho ;-)
Ari B. Friedman
56

Parcelas usando coordenadas polares certamente são subutilizadas - alguns diriam por um bom motivo. Eu acho que as situações que justificam seu uso não são comuns; Eu também acho que quando essas situações surgem, gráficos polares podem revelar padrões em dados que gráficos lineares não podem.

Eu acho que é porque às vezes seus dados são inerentemente polares, e não lineares - por exemplo, são cíclicos (coordenadas x que representam horários durante 24 horas por dia, durante vários dias), ou os dados foram mapeados anteriormente em um espaço de recurso polar.

Aqui está um exemplo. Esse gráfico mostra o volume médio de tráfego de um site por hora. Observe os dois picos às 22:00 e à 01:00. Para os engenheiros de rede do Site, esses são significativos; Também é significativo que eles ocorram próximos um do outro (apenas duas horas de intervalo). Mas se você plotar os mesmos dados em um sistema de coordenadas tradicional, esse padrão seria completamente oculto - plotado linearmente, esses dois picos seriam separados por 20 horas, o que são, embora também sejam separados por apenas duas horas em dias consecutivos. O gráfico polar acima mostra isso de maneira parcimoniosa e intuitiva (uma lenda não é necessária).

Gráfico polar mostrando o tráfego do site, com picos nas horas 1 e 22

Existem duas maneiras (que eu conheço) de criar plotagens como essa usando R (criei a plotagem acima w / R). Uma é codificar sua própria função nos sistemas gráficos de base ou de grade. A outra maneira, mais fácil, é usar o pacote circular . A função que você usaria é ' rose.diag ':

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)
doug
fonte
4
Copiando seu código, recebo um gráfico muito diferente (que é bastante feio); Alguma idéia do porquê? Recebo este aviso: 1: Em as.circular (xx [, 1]): um objeto é coagido à classe 'circular' usando o valor padrão para os seguintes componentes: tipo: 'angles' units: 'radians' template: ' none' modulo: 'Asis' zero: 0 rotação: 'contador' rose.diagdata24Daily tráfego do site por Hourthree_palettes
datayoda
Eu tenho o mesmo problema.
precisa
Você também pode fazer isso com um gráfico de linhas. Pode ser um pouco mais difícil de ler, mas também pode ser realmente impressionante para dados mais granulares ou dados que passam por mais de um ciclo (por exemplo, trace dez ciclos e, em seguida, trace sua média).
naught101
1
Eu também tive problemas para replicar o enredo. Acabei decidindo que era mais fácil usar o ggplot2. Eu deixei uma pequena demonstração sobre Rpubs com código e resultados: rpubs.com/mattbagg/circular
MattBagg
1
ggplot2 equivalente:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101 11/11/14
54

Se o seu gráfico de dispersão possui tantos pontos que se torna uma bagunça completa, tente um gráfico de dispersão suavizado. Aqui está um exemplo:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

O hexbinpacote (sugerido por @Dirk Eddelbuettel) é usado para a mesma finalidade, mas smoothScatter()tem a vantagem de pertencer ao graphicspacote e, portanto, faz parte da instalação padrão do R.

Smiley como um gráfico de dispersão regular ou suavizado

nullglob
fonte
6
Para completar, você também pode obter esse efeito no ggplot usando transparência (alfa).), Em combinação com o ponto geom.
Paul Hiemstra
1
é o mesmo que estimativa de densidade do kernel ou apenas semelhante?
Endolith 28/05
30

Em relação ao sparkline e outras idéias do Tufte, o pacote YaleToolkit no CRAN fornece funções sparklinee sparklines.

Outro pacote que é útil para conjuntos de dados maiores é o hexbin , que habilmente agrupa os dados em buckets para lidar com conjuntos de dados que podem ser muito grandes para gráficos de dispersão ingênuos.

Dirk Eddelbuettel
fonte
4
+1 aos sparklines. Atualmente, estou trabalhando em um pacote focado na criação de sparkline em R - eles fazem grandes acréscimos às tabelas nos relatórios Sweave.
Sharpie
1
Legal! Não estou muito feliz com o que Jay tem no YaleToolkit e gostaria de ter brilhos nas tabelas!
Dirk Eddelbuettel
Acabei de documentar uma maneira de produzir sparklines usando apenas plotuma atualização para a minha pergunta , com alguma ajuda deste post do fórum Tufte
Ben
1
A Hmisc::latex()versão da saída de Hmisc::describeinclui um mini-histograma que é incluído na tabela.
IRTFM 07/07
28

As parcelas de violino (que combinam parcelas de caixa com densidade de kernel) são relativamente exóticas e bem legais. O vioplot pacote no R permite que você os faça com bastante facilidade.

Aqui está um exemplo (o link da Wikipedia também mostra um exemplo):

insira a descrição da imagem aqui

Jason Sundram
fonte
3
Gráficos de violino também estão disponíveis no pacote de treliça:bwplot(... panel = panel.violin)
David J.
3
A versão ggplot2 das parcelas de violino em breve. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik
Eu não finas parcelas de violino são tão úteis, eu gosto de mostrar todos os pontos com um tremor.
Nakx 27/02/19
25

Outra boa visualização de séries temporais que eu estava revisando é o "gráfico de resposta" (como destaque nesta postagem no blog "Learning R" ). Isso é muito útil para visualizar alterações de posição ao longo do tempo.

Você pode ler sobre como criá-lo em http://learnr.wordpress.com/ , mas é assim que termina:

texto alternativo

Shane
fonte
Eu gosto do gráfico de respostas para esses dados em particular, mas não consigo pensar em situações mais gerais em que seriam úteis. Dito isto, acho que todos podemos concordar que o blog Learning R arrasa nas meias.
precisa saber é o seguinte
7
Um gráfico de resposta é um gráfico de coordenadas paralelo de dados classificados.
Hadley
1
isso me lembra slopegraph que é bom para representar a mudança de classificação ao longo do tempo ou as relações entre rankings: charliepark.org/slopegraphs
topchef
21

Também gosto das modificações de boxplots da Tufte, que permitem fazer pequenas comparações de múltiplos com muito mais facilidade, porque são muito "finas" na horizontal e não confundem o plot com tinta redundante. No entanto, funciona melhor com um número bastante grande de categorias; se você tiver apenas alguns em um gráfico, os boxplots regulares (Tukey) ficam melhores, pois têm um pouco mais de peso.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

compareplot

Outras maneiras de fazer isso (incluindo o outro tipo de boxplot Tufte) são discutidas nesta pergunta .

Ari B. Friedman
fonte
@daroczig Obrigado. Um dia desses eu vou reescrevê-lo para ter diferentes configurações de agrupamentos. Eu aprendi muito desde que escrevi essa função!
Ari B. Friedman
1
Gosto muito mais das suas tramas do que das de tufos, que são ridiculamente difíceis de ler. Ainda acho que os boxplots no estilo Tukey são melhores, embora um bom compromisso possa ser algo como o que você tem aqui, mas com linhas de 3px de largura para a caixa, em vez do deslocamento de 1px. E acho que uma linha horisontal de 1px de largura para a mediana provavelmente é mais limpa e mais exata.
Naught101
19

Não devemos esquecer o enredo bonito e (historicamente) importante do caule e das folhas (que o Tufte também ama!). Você obtém uma visão geral diretamente numérica de sua densidade e forma de dados (é claro que se seu conjunto de dados não for maior que cerca de 200 pontos). Em R, a função stemproduz seu layout de caule e folha (na área de trabalho). Prefiro usar a gstemfunção do pacote fmsb para desenhá-la diretamente em um dispositivo gráfico. Abaixo está uma variação da temperatura corporal do castor (os dados devem estar no seu conjunto de dados padrão) em uma exibição tronco a folha:

  require(fmsb)
  gstem(beaver1$temp)

insira a descrição da imagem aqui

Geek On Acid
fonte
15

Além do excelente trabalho de Tufte, recomendo os livros de William S. Cleveland: Visualizing Data e The Elements of Graphing Data . Eles não são apenas excelentes, mas foram todos feitos em R, e acredito que o código esteja disponível publicamente.

Peter Flom
fonte
14

Boxplots! Exemplo da ajuda do R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

Na minha opinião, é a maneira mais útil de analisar rapidamente os dados ou comparar distribuições. Para distribuições mais complexas, há uma extensão chamada vioplot.

mbq
fonte
2
O beanplot também pode ser mencionado aqui jstatsoft.org/v28/c01/paper e cran.r-project.org/web/packages/beanplot/index.html
radek
Boxplots não são tão subutilizados, são? Quero dizer, claro, em muitos papéis os gráficos de barras são usados ​​para dados que devem ser plotados em caixas, mas ainda são bastante comuns.
naught101
11

Parcelas em mosaico me parecem atender aos quatro critérios mencionados. Existem exemplos em r, em mosaicplot.

Peter Flom
fonte
3
Uma melhor implementação de plotagens de mosaico está na biblioteca vcd (nome da função 'mosaic'). Ele possui uma assinatura de método muito mais flexível e é implementado em grade (em vez do sistema gráfico 'base').
doug
10

Confira o trabalho de Edward Tufte e especialmente este livro

Você também pode tentar e pegar sua apresentação de viagem . É muito bom e inclui um pacote de quatro de seus livros. (juro que não possuo as ações de sua editora!)

A propósito, eu gosto da sua técnica de visualização de dados sparkline. Surpresa! O Google já escreveu e publicou no Google Code

Paul Sasik
fonte