Compilando um documento com PGFplots processando apenas cada x-ésimo ponto de dados?

Compilando um documento com PGFplots processando apenas cada x-ésimo ponto de dados?

Possível duplicata:
Como selecionar um número finito de amostras do arquivo ao plotar usando pgfplot

Compilar meu documento com muitos gráficos PGF, cada um contendo milhares de pontos de dados de um arquivo CSV leva muito tempo (minutos). Percebo que não faz sentido ter tantos pontos de dados – se houvesse, digamos, um décimo, seria suficiente recriar o mesmo gráfico no papel.

Um dos meus arquivos, por exemplo, consiste em 216.000 linhas nesse formato:
0.000000000000000000e+00 0.000000000000000000e+00 1.388888888888888888e-04 -2.182787284255027771e-11
Claro, isso é demais. Eu então li o arquivo como:

\documentclass{scrartcl}

\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}

\begin{document}

\begin{tikzpicture}
    \begin{loglogaxis}[
        \addplot[mark=*, color=red] file {Data/plotXYZ.dat};
    \end{loglogaxis}
\end{tikzpicture}

\end{document}

É possível que o pacote ocupe apenas cada x-ésima linha para acelerar o processo de compilação? Ou existem outras maneiras de torná-lo (significativamente) mais rápido?

Estou executando o Ubuntu e um amigo meu me recomendou que escrevesse um awkscript que passasse por um .csvarquivo e retivesse apenas cada x-ésima linha. No entanto, não tenho ideia de como faria isso, pois nunca usei awkantes. Se essa for a opção de escolha, alguém poderia me ajudar a configurar esse script?

Responder1

pgfplots oferece o filtro each nth point=100.

Como a filtragem de coordenadas tem casos de uso diferentes, você pode querer definir

each nth point=100, filter discard warning=false, unbounded coords=discard 

esta combinação não gerará avisos para cada ponto descartado. Além disso, os 99 pontos serão eliminados silenciosamente - como se você não os tivesse gravado no fluxo de entrada. Observe que a escolha alternativa unbounded coords=jumpinterromperia explicitamente seu enredo (o que não é o que você deseja aqui).

Esta abordagem tem funcionado bastante bem: na verdade, o tempo não foi muito maior, como se alguma ferramenta externa tivesse sido usada para filtrar o arquivo de dados (foi relatado recentemente por algum usuário avançado por e-mail).

Responder2

Embora o pgfplotsfiltro each nth pointpossa ser uma solução até certo ponto, certamente não é algo que possa ser usado em geral. Por exemplo, a escolha each nth point=100pode distorcer algumas áreas do gráfico que realmente precisam de pontos extras para serem ilustradas corretamente. Por outro lado, definir each nth pointum número inferior pode não ser "económico" em termos do número de pontos utilizados.

Resumidamente,é necessário um método de redução da resolução mais inteligente. Esse método deve ser capaz de ajustar dinamicamente o número de pontos mantidos, dependendo da complexidade da parcela em cada área, para que tenhamos o melhor resultado visual utilizando apenas o número mínimo de pontos necessários (algo como o látex sendo capaz de ajustar automaticamente each nth point=?várias vezes durante a "passagem" de um diagrama).

Dê uma olhadaesta resposta.

Caso você tenha matlab ou oitava você pode usar a versão modificada matlab2tikzfornecida lá, que implementa um algoritmo de redução de resolução eficiente.

Por outro lado, se você não usar matlab nem oitava, ainda poderá traduzir esse algoritmo de redução da resolução (está na função pointReduction) para o idioma desejado e usá-lo para reduzir a resolução de suas figuras e depois exportá-las para CSV.

informação relacionada