我想绘制一个大表中的值。由于它有太多数字,我想画一条线和一些标记(因为图中还有其他线,因此,为了避免混淆)。我知道我可以使用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}