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 awk
script que passasse por um .csv
arquivo e retivesse apenas cada x-ésima linha. No entanto, não tenho ideia de como faria isso, pois nunca usei awk
antes. 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=jump
interromperia 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 pgfplots
filtro each nth point
possa ser uma solução até certo ponto, certamente não é algo que possa ser usado em geral. Por exemplo, a escolha each nth point=100
pode distorcer algumas áreas do gráfico que realmente precisam de pontos extras para serem ilustradas corretamente. Por outro lado, definir each nth point
um 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 matlab2tikz
fornecida 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.