PGFplots 标记第一点和最后一点为必填项

PGFplots 标记第一点和最后一点为必填项

我想绘制一个大表中的值。由于它有太多数字,我想画一条线和一些标记(因为图中还有其他线,因此,为了避免混淆)。我知道我可以使用mark repeat={<integer>}(或根据情况使用each nth point={<integer>})。但是,有了它,我知道图形中的第一个点将有一个标记,但不一定总是最后一个点,因为它取决于<integer>

我怎样才能自动在第一个点和最后一个点以及两者中间画一个标记?

\documentclass[10pt,border=0pt]{standalone}

\usepackage{tikz}
\usepackage{tikzscale}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\usetikzlibrary{plotmarks}

\pgfplotstableread{%
x1 y1
1 2
2 4
3 1
4 5
5 9
6 11
7 15
8 12
9 10
10 1
}\mytable

\pgfplotsset{mytick x interval/.style args={#1:#2:#3}{%
        xmin=#1,xmax=#3,xincrement={#1}{#2},
        xtick={#1,\xval,...,#3}
    },
    xincrement/.code 2 args={\pgfmathparse{#1+#2}\xdef\xval{\pgfmathresult}}
}

\pgfplotsset{mytick y interval/.style args={#1:#2:#3}{%
        ymin=#1,ymax=#3,yincrement={#1}{#2},
        ytick={#1,\yval,...,#3}
    },
    yincrement/.code 2 args={\pgfmathparse{#1+#2}\xdef\yval{\pgfmathresult}}
}

\pgfplotsset{every tick/.style={black,}}

\pgfplotsset{%
    compat=1.8,
    compat/show suggested version=false,
    mytick x interval=0:1:10,
    mytick y interval=0:1:15,
    xlabel={x-axis},
    ylabel={y-axis},
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[mark options={fill=white,solid}]
    \addplot[thick,mark=pentagon*,mark repeat={2}] table[x=x1, y=y1] {\mytable};
  \legend{val}
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

您可以使用此scatter功能,它允许您在每个标记之前执行代码。然后,在该代码中,您可以检查\coordindex(当前标记的索引,从 0 开始)是否与\numcoords-1(坐标总数)相同。

这是一种样式mark repeat*=<n>,它绘制每个n标记和最后一个标记:

\pgfplotsset{
    mark repeat*/.style={
        scatter,
        scatter src=x,
        scatter/@pre marker code/.code={
            \pgfmathtruncatemacro\usemark{
                or(mod(\coordindex,#1)==0, (\coordindex==(\numcoords-1))
            }
            \ifnum\usemark=0
                \pgfplotsset{mark=none}
            \fi
        },
        scatter/@post marker code/.code={}
    }
}

完整代码:

\documentclass[10pt,border=0pt]{standalone}

\usepackage{tikz}
\usepackage{tikzscale}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\usetikzlibrary{plotmarks}

\pgfplotstableread{%
x1 y1
1 2
2 4
3 1
4 5
5 9
6 11
7 15
8 12
9 10
10 1
}\mytable

\pgfplotsset{
    mark repeat*/.style={
        scatter,
        scatter src=x,
        scatter/@pre marker code/.code={
            \pgfmathtruncatemacro\usemark{
                or(mod(\coordindex,#1)==0, (\coordindex==(\numcoords-1))
            }
            \ifnum\usemark=0
                \pgfplotsset{mark=none}
            \fi
        },
        scatter/@post marker code/.code={}
    }
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[mark options={fill=white,solid}]
    \addplot[
            mark=pentagon*, thick,
            mark repeat*=2
    ] table[x=x1, y=y1] {\mytable};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容