Acho que R pode levar muito tempo para gerar gráficos quando milhões de pontos estão presentes - o que não é surpreendente, uma vez que os pontos são plotados individualmente. Além disso, essas parcelas costumam ser muito confusas e densas para serem úteis. Muitos dos pontos se sobrepõem e formam uma massa negra e é gasto muito tempo plotando mais pontos nessa massa.
Existem alternativas estatísticas para representar grandes dados em um gráfico de dispersão padrão? Eu considerei um gráfico de densidade, mas que outras alternativas existem?
r
data-visualization
Alex Stoddard
fonte
fonte
Respostas:
Essa é uma tarefa difícil, sem soluções prontas (é claro, porque o gráfico de densidade é um substituto tentador do que ninguém realmente se importa). Então o que você pode fazer?
Se eles realmente se sobrepuserem (ou seja, tiverem exatamente as mesmas coordenadas X e Y) e você não estiver usando alfa, a melhor idéia seria apenas reduzir a sobreposição usando
unique
(com alfa, pode ser somado a esses grupos).Caso contrário, você pode arredondar manualmente as coordenadas para os pixels mais próximos e usar o método anterior (ainda assim, essa é uma solução suja).
Finalmente, você pode fazer um gráfico de densidade apenas para usá-lo para subamostrar os pontos nas áreas mais densas. Por outro lado, isso não fará exatamente o mesmo gráfico e poderá introduzir artefatos se não for ajustado com precisão.
fonte
unique
ou arredondando pode resultar em gráficos tendenciosos (enganosos). É importante indicar de alguma forma a quantidade de sobreposição através de alguns meios gráficos, como leveza ou com parcelas de girassol.Veja o pacote hexbin que implementa o papel / método de Dan Carr. A vinheta em pdf tem mais detalhes que cito abaixo:
fonte
smoothScatter {RColorBrewer}
anddensCols {grDevices}
. I can confirm it works pretty well with thousand to million of points from genetic data.Devo admitir que não compreendo completamente seu último parágrafo:
Também não está claro que tipo de gráfico (função) você está procurando.
Dado que você tem variáveis métricas, poderá encontrar gráficos em hexágono ou em girassol úteis. Para mais referências, consulte
fonte
Another direct answer to the question is the rgl package, which can plot millions of points using OpenGL. Also, specify a point size (e.g. 3) and zoom out to see these centers of masses as monolithic blocks, or zoom in and see the structure of what used to be monolithic - the point sizes are constant but the distances among them on the screen depend on the zooming. Alpha levels can also be used.
fonte
Here's a file I call
bigplotfix.R
. If you source it, it will define a wrapper forplot.xy
which "compresses" the plot data when it is very large. The wrapper does nothing if the input is small, but if the input is large then it breaks it into chunks and just plots the maximum and minimum x and y value for each chunk. Sourcingbigplotfix.R
also rebindsgraphics::plot.xy
to point to the wrapper (sourcing multiple times is OK).Note that
plot.xy
is the "workhorse" function for the standard plotting methods likeplot()
,lines()
, andpoints()
. Thus you can continue to use these functions in your code with no modification, and your large plots will be automatically compressed.This is some example output. It's essentially
plot(runif(1e5))
, with points and lines, and with and without the "compression" implemented here. The "compressed points" plot misses the middle region due to the nature of the compression, but the "compressed lines" plot looks much closer to the uncompressed original. The times are for thepng()
device; for some reason points are much faster in thepng
device than in theX11
device, but the speed-ups inX11
are comparable (X11(type="cairo")
was slower thanX11(type="Xlib")
in my experiments).A razão pela qual escrevi isso é porque estava cansado de correr
plot()
acidentalmente em um grande conjunto de dados (por exemplo, um arquivo WAV). Nesses casos, eu teria que escolher entre aguardar vários minutos para a plotagem terminar e encerrar minha sessão R com um sinal (perdendo, assim, meu histórico de comandos e variáveis recentes). Agora, se me lembro de carregar esse arquivo antes de cada sessão, posso obter uma plotagem útil nesses casos. Uma pequena mensagem de aviso indica quando os dados da plotagem foram "compactados".fonte
Talvez eu seja evitado pelo meu método, as lembranças ruins de um dos meus profissionais de pesquisa gritando com as pessoas por jogar fora bons dados, traduzindo-os em categorias (é claro, eu concordo hoje em dia lol), não sei. Enfim, se você está falando de um gráfico de dispersão, tive os mesmos problemas. Agora, quando tenho dados numéricos, não faz muito sentido categorizá-los para análise. Mas visualizar é uma história diferente. O que eu achei que funciona melhor para mim é primeiro (1) dividir sua variável independente em grupos usando a função cut. Você pode brincar com o número de grupos e, em seguida, (2) simplesmente plotar o DV contra a versão cortada do IV. R gerará gráficos de caixa em vez daquele gráfico de dispersão nojento. Eu recomendo remover os outliers do plot (use a opção outline = FALSE no comando plot). Novamente, NUNCA desperdiçaria dados numéricos perfeitamente bons categorizando e analisando. Muitos problemas fazendo isso. Embora eu saiba que é um assunto delicado de debate. Mas fazer isso especificamente com o objetivo de, pelo menos, extrair algum sentido visual dos dados, não muito mal que já vi deles. Plotamos dados de até 10 milhões e ainda assim consegui extraí-los com esse método. Espero que ajude! Cumprimentos! Eu vi isso. Plotamos dados de até 10 milhões e ainda assim consegui extraí-los com esse método. Espero que ajude! Cumprimentos! Eu vi isso. Plotamos dados de até 10 milhões e ainda assim consegui extraí-los com esse método. Espero que ajude! Cumprimentos!
fonte
For large time series, I have grown to love smoothScatter (part of base R no less). I often have to include some additional data, and preserving the basic plot API is really helpful, for instance:
Which gives you (if you pardon the design):
It's always available and works well with enormous datasets, so it's nice to at least take a look at what you have.
fonte