pgf-tikz / pgfplots

pgfplots - A TeX package to draw normal and/or logarithmic plots directly in TeX in two and three dimensions with a user-friendly interface and pgfplotstable - a TeX package to round and format numerical tables. Examples in manuals and/or on web site.
http://pgfplots.sourceforge.net/
198 stars 33 forks source link

Idea: `each nth point={<n>}` with non-zero shift #442

Open muzimuzhi opened 2 years ago

muzimuzhi commented 2 years ago

The downsampling option each nth point={<n>} always keeps points 0, n, 2n, ..., but users may want to keep points k, n-k, 2n-k, ... (0 <= k < n). Hence a more general option is required and will be helpful.

In https://tex.stackexchange.com/q/649944 I gave an attempt that provides each nth point starting from={<n>}{<k>} which makes each nth point={<n>} equivalent to each nth point starting from={<n>}{0}.

Another approach, letting skip coords between index={<begin>}{<end>} alter \coordindex, seems dangerous and will cause backwards compatibility problems.

Example copied from my tex-sx answer. Sorry it's a bit lengthy. ```tex \begin{filecontents}{pts.dat} x y 1 0 0.5 0.866 -0.5 0.866 -1 0 -0.5 -0.866 0.5 -0.866 1 0 \end{filecontents} \documentclass[border=5pt]{standalone} \usepackage{pgfplots} \pgfplotsset{compat=1.18} \makeatletter \pgfplotsset{ /pgfplots/each nth point starting from/.style 2 args={ /pgfplots/each nth point starting from*={x}{#1}{#2} }, % #1: the filter name: x, y, z, or something exotic like hist/data % #2: the N of 'each nth' % #3: the starting coordindex % Example: % {x}{3}{0} will leave indices 0, 3, 6, ... % {x}{3}{1} will leave indices 1, 4, 7, ... /pgfplots/each nth point starting from*/.style n args={3}{ /pgfplots/#1 filter/.append code={% \ifnum\coordindex=0 \begingroup % do not pollute \pgfmathresult \pgfkeys{/pgf/fpu=false}% \pgfmathsetmacro\c@pgfplots@eachnthpoint@xfilter{int(Mod(-(#3),#2))}% \pgfmath@smuggleone\c@pgfplots@eachnthpoint@xfilter \endgroup \edef\c@pgfplots@eachnthpoint@xfilter@cmp{#2}% \else \pgfplotsutil@advancestringcounter\c@pgfplots@eachnthpoint@xfilter \fi \ifx\c@pgfplots@eachnthpoint@xfilter@cmp\c@pgfplots@eachnthpoint@xfilter \def\c@pgfplots@eachnthpoint@xfilter{0}% \else \let\pgfmathresult\pgfutil@empty \fi } }, } \makeatother \begin{document} \begin{tikzpicture} \begin{axis}[no marks] \addplot[ultra thick, dashed, lightgray] table {pts.dat}; \foreach \m in {1,...,3} { \edef\x{ \noexpand\addplot[ each nth point starting from={3}{\m}, filter discard warning=false, unbounded coords=discard ] table {pts.dat}; } \x } \foreach \m in {1,2} { \edef\x{ \noexpand\addplot[blue, each nth point starting from={2}{\m}, filter discard warning=false, unbounded coords=discard ] table {pts.dat} -- cycle; } \x } \end{axis} \end{tikzpicture} \end{document} ``` ![image](https://user-images.githubusercontent.com/6376638/177429654-cf44e9ac-a44b-45bf-8934-fb75416cda46.png)