Maneiras de reduzir dados de alta dimensão para visualização


19

Estou trabalhando em uma simulação física 2D e coletando dados no tempo em vários pontos. Esses pontos discretos são ao longo de linhas verticais, com várias linhas na direção axial. Isso torna o conjunto de dados efetivamente 4D.

Por exemplo, suponha que eu tenha pontos de coleta nas coordenadas (X, Y) de:

  • (0,0), (1,0), (2,0)
  • (0,1), (1,1), (2,1)
  • (0,2), (1,2), (2,2)

e em cada ponto estou coletando onde é pressão, é temperatura, são os componentes X e Y da velocidade. A cada iteração da simulação, essas variáveis ​​são armazenadas para todos os 9 pontos de coleta. Portanto, todos os meus dados são contínuos no tempo, em cada ponto discreto do espaço.{P,T,você,V}PTvocê,V

Por exemplo, os dados para um único ponto se pareceriam com:

Pressão vs tempo para um único ponto U-Velocity vs Time para um único ponto

Estou interessado em mostrar, digamos, pressão em todos os momentos, para mostrar ondas verticais e axiais. Se eu fizesse isso em uma única linha (vertical ou axial), poderia usar um gráfico em cascata com eixos (Y, tempo, Pressão). Mas se eu tiver 3 linhas verticais e 3 linhas axiais, seriam 6 parcelas em cascata para obter uma imagem completa do movimento das ondas nas duas direções. As coordenadas espaciais são variáveis ​​discretas enquanto o campo (neste caso Pressão) e o tempo são contínuos.

Nas figuras acima, por exemplo, o grande pico de pressão em pode estar viajando na direção X ou Y.t0.000125

Existe um método para mostrá-los todos de uma vez? Geralmente, é possível adicionar cor para tornar visível a "quarta dimensão", mas existe outra abordagem possível? Pretendo traçar o maior número possível de maneiras para ver se alguma coisa revela informações que outras pessoas não revelam;

E se a simulação fosse 3D e eu tivesse um conjunto de dados resultante em 5D? Isso muda os possíveis métodos de visualização?


Todas as dimensões são discretas ou são contínuas? Se sim, quais são quais?
naught101

Os (X, Y) são discretos enquanto (P, tempo) são contínuos.
tpg2114

Eu recomendo considerando faceting como uma alternativa (ou complemento) a 3-d
Michael Bishop

Precisa ser um gráfico estático que possa ser impresso? Caso contrário, você poderá mostrar seus dados como uma série de gráficos com intervalo de tempo. Se bem me lembro, o software JMP faz esse tipo de coisa.
Emil Friedman

1
@ naught101 Atualizado de acordo.
precisa saber é o seguinte

Respostas:


14

Eu mesmo tinha alguns dados tridimensionais. Embora eu finalmente tenha decidido por uma pequena seleção de cortes tridimensionais, uma opção é o Gráfico de coordenadas paralelas . Isso funciona para um número arbitrário de dimensões! Da Wikipedia:

Coordenadas paralelas são uma maneira comum de visualizar geometria de alta dimensão e analisar dados multivariados.

Para mostrar um conjunto de pontos em um espaço n-dimensional, é desenhado um pano de fundo composto por n linhas paralelas, normalmente verticais e igualmente espaçadas. Um ponto no espaço n-dimensional é representado como uma polilinha com vértices nos eixos paralelos; a posição do vértice no i-ésimo eixo corresponde à i-ésima coordenada do ponto.

insira a descrição da imagem aqui


Essa é uma ótima trama. Excelente uso da cor. A lenda seria melhor do lado e reordenada para combinar com as cores do último eixo, mas não é vital.
naught101

3
@ naught101 É da Wikipedia, fique à vontade para enviar uma mensagem de uma melhoria há ;-)
gerrit

Esta é uma ótima técnica !!
Sohaib I

4

Gráficos de pares : Este não é um método de redução de dimensionalidade, mas é uma maneira realmente boa de obter uma visão geral rápida de onde podem estar alguns relacionamentos significativos. Em R, o pacote base contém a pairs()função, que é boa para dados contínuos (converte tudo em contínuo). Uma função melhor é ggpairs(), do GGallypacote:

library(GGally)
ggpairs(iris, colour='Species')

Gráfico de pares de íris


3

A Análise de Componentes Principais geralmente é uma boa opção para redução de dimensão na maioria dos casos. Não tenho certeza de que será adequada ao seu problema específico, mas encontrará as dimensões ortogonais nas quais a maioria das variações de amostras de dados é capturada. Se você desenvolver em R, poderá usar prcomp()para simplesmente converter sua matriz original de pontos de dados no formulário PCA.


2

Aqui estão algumas maneiras de retratar dados 3D com o ggplot2. Você pode combinar abordagens (facetas, cores, formas, etc.) para aumentar a dimensionalidade do seu gráfico.

doInstall <- TRUE  # Change to FALSE if you don't want packages installed.
toInstall <- c("ggplot2")
if(doInstall){install.packages(toInstall, repos = "http://cran.r-project.org")}
lapply(toInstall, library, character.only = TRUE)

# Air passenger data. ts converted to long matrix:
myData <- data.frame(Year = c(floor(time(AirPassengers) + .01)),
                     Month = c(cycle(AirPassengers)), 
                     Value = c(AirPassengers))
# Easy conversion code from: http://stackoverflow.com/a/4973859/479554

# Convert month numbers to names, using a built-in constant:
myData$Month <- factor(myData$Month)
levels(myData$Month) <- month.abb

# One possibility:
zp1 <- ggplot(myData,
              aes(x = Year, y = Value, colour = Month))
zp1 <- zp1 + geom_line()
print(zp1)  # This is fine, if you can differentiate between the colors

# Another possibility:
zp2 <- ggplot(myData,
              aes(x = Year, y = Value))
zp2 <- zp2 + geom_line()
zp2 <- zp2 + facet_wrap(~ Month)
print(zp2)  # This is fine, but it's hard to compare across facets

# A third possibility; plotting reference lines across each facet:
referenceLines <- myData  # \/ Rename
colnames(referenceLines)[2] <- "groupVar"
zp3 <- ggplot(myData,
              aes(x = Year, y = Value))
zp3 <- zp3 + geom_line(data = referenceLines,  # Plotting the "underlayer"
                       aes(x = Year, y = Value, group = groupVar),
                       colour = "GRAY", alpha = 1/2, size = 1/2)
zp3 <- zp3 + geom_line(size = 1)  # Drawing the "overlayer"
zp3 <- zp3 + facet_wrap(~ Month)
zp3 <- zp3 + theme_bw()
print(zp3)

insira a descrição da imagem aqui


É o mesmo enredo, repetido 12 vezes, mas com linhas diferentes destacadas, certo? Definitivamente, uma maneira interessante de ver esses dados! Outra maneira seria plotar apenas as séries temporais mensais originais, e depois faceta por mês, e plotar os pontos do mês em cima dela. A mesma idéia, mas com as séries temporais "reais" lá.
precisa saber é o seguinte

Como esta: APdf <- data.frame(Time=c(time(AirPassengers)), Year=c(floor(time(AirPassengers))), Month=c(cycle(AirPassengers)), Value=c(AirPassengers)) ; APdf$Month <- month.abb[APdf$Month] ; ggplot(APdf, aes(x=Time, y=Value)) + facet_wrap(facets='Month') + geom_line(data=APdf[,c(1,4)], colour='gray') + geom_point(). Caramba, eu amo ggplot2.
precisa saber é o seguinte

1

p=pmeumaninsira a descrição da imagem aqui

Este gráfico mostra os perfis de velocidade em diferentes locais axiais, fornecendo um mapa 2D do campo de fluxo. As linhas verticais representam 0 velocidade. As regiões sem pontos não fazem parte do domínio computacional. Claro que isso não é facilmente extensível a dados 3D ...


Para que serve o quadrado branco?
precisa saber é o seguinte

Esta é uma representação de campo de fluxo. É um fluxo em torno de um canto, os perfis representam a velocidade em locais diferentes axiais ...
FrenchKheldar

Está bem. Faria sentido adicionar alguma descrição à resposta. O enredo é bastante opaca, por si só ...
naught101
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.