Составление документа с помощью PGFplots, обрабатывающего только каждую x-ую точку данных?

Составление документа с помощью PGFplots, обрабатывающего только каждую x-ую точку данных?

Возможный дубликат:
Как выбрать конечное количество выборок из файла при построении графика с помощью pgfplot

Компиляция моего документа с множеством графиков PGF, каждый из которых содержит тысячи точек данных из файла CSV, занимает слишком много времени (минуты). Я понимаю, что нет смысла иметь так много точек данных — если бы их было, скажем, десятая часть, этого было бы достаточно, чтобы воссоздать тот же график на бумаге.

Один из моих файлов, например, состоит из 216000 строк такого формата:
0.000000000000000000e+00 0.000000000000000000e+00 1.388888888888888888e-04 -2.182787284255027771e-11
Конечно, это слишком много. Затем я читаю файл как:

\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}

Возможно ли, чтобы пакет брал только каждую x-ю строку, чтобы ускорить процесс компиляции? Или есть другие способы сделать его (значительно) быстрее?

Я работаю в Ubuntu, и мой друг порекомендовал мне написать скрипт awk, который будет проходить по .csvфайлу и сохранять только каждую x-ую строку. Однако я понятия не имею, как это сделать, поскольку никогда раньше не пользовался awk. Если это окажется вариантом выбора, может ли кто-нибудь помочь мне настроить такой скрипт?

решение1

pgfplots предлагает фильтр each nth point=100.

Поскольку фильтрация координат имеет различные варианты использования, вы можете задать

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

эта комбинация не будет генерировать предупреждения для каждой отброшенной точки. Более того, она молча отбросит 99 точек - как если бы вы вообще не записывали их во входной поток. Обратите внимание, что альтернативный выбор unbounded coords=jumpявно прервет ваш сюжет (что не то, что вам здесь нужно).

Сообщается, что этот подход работает довольно хорошо: на самом деле время не было намного больше, чем если бы для фильтрации файла данных использовался какой-то внешний инструмент (недавно об этом сообщил один опытный пользователь по электронной почте).

решение2

Хотя pgfplotsфильтр each nth pointможет быть решением в какой-то степени, он определенно не является тем, что можно использовать в целом. Например, выбор each nth point=100может исказить некоторые области графика, которым действительно нужны дополнительные точки для корректной иллюстрации. С другой стороны, установка each nth pointменьшего числа может быть не "экономичной" с точки зрения количества используемых точек.

Суммируя,необходим более умный метод понижения частоты дискретизацииЭтот метод должен иметь возможность динамически корректировать количество сохраняемых точек в зависимости от сложности графика в каждой области, чтобы мы могли получить наилучший визуальный результат, используя только минимально необходимое количество точек (что-то вроде того, как латекс может автоматически корректировать each nth point=?несколько раз за «проход» диаграммы).

Взгляни наэтот ответ.

Если у вас есть Matlab или Octave, вы можете использовать модифицированную версию, matlab2tikzпредставленную там, которая реализует эффективный алгоритм понижения частоты дискретизации.

С другой стороны, если вы не используете ни Matlab, ни Octave, вы все равно можете перевести этот алгоритм понижения разрешения (он находится в функции pointReduction) на нужный вам язык и использовать его для понижения разрешения ваших рисунков, а затем экспортировать их в CSV.

Связанный контент