Возможный дубликат:
Как выбрать конечное количество выборок из файла при построении графика с помощью 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.