使用“x 刻度标签作为间隔”时仅显示每 n 个 xtick 标签

使用“x 刻度标签作为间隔”时仅显示每 n 个 xtick 标签

这个问题源于我问过的同一个问题这里

现在,我需要很多数据点来给每个数据点都加上一个刻度标签。对于一个轴(底部的轴),我可以实现我想要的效果。但是对于另一个轴,我遇到了问题,我认为这是由于我使用了x tick label as interval。以下是我所拥有的:

\documentclass{minimal}
\usepackage{pgfplotstable,pgfplots}
\pgfplotsset{compat=newest}

\pgfplotstableread{
1   1   440 440
2   2   407 424
3   3   395 426
4   4   382 427
5   5   375 427
6   6   366 427
1   7   391 423
2   8   378 395
3   9   376 396
4   10  366 396
5   11  357 396
1   12  339 389
2   13  333 372
3   14  317 372
4   15  298 372
5   16  279 372
1   17  253 368
2   18  248 352
3   19  236 351
4   20  167 351
5   21  166 351
1   22  158 347
2   23  120 319
3   24  115 319
4   25  109 319
5   26  108 319
1   27  105 314
2   28  115 293
3   29  108 293
4   30  108 292
5   31  103 293
1   32  102 289
2   33  108 268
3   34  100 268
4   35  98  270
5   36  99  269
1   37  94  266
2   38  102 250
3   39  92  250
4   40  95  251
5   41  93  251
1   42  91  249
2   43  96  236
3   44  93  237
4   45  89  238
5   46  85  241
1   47  85  237
2   48  93  233
3   49  85  232
4   50  87  232
5   51  84  232
1   52  85  232
}\data

\begin{document}
\begin{tikzpicture}
    \begin{axis}[xmin=1, xmax=52,
                 ymin=0, ymax=450,
                 xtick={1,7,12,17,22,...,52},
                 minor x tick num=2,
                 xticklabels={1,2,...,10},
                 x tick label as interval,
                 xmajorgrids,
                 axis x line*=top,
                 hide y axis,
                 xlabel={Timestep}
                 ]
    \end{axis}
    %
    \begin{axis}[xmin=1, xmax=52,
                 ymin=0, ymax=450,
                 axis x line*=bottom,
                 xtick={1,6,11,16,21,...,52},
                 minor x tick num=4,
                 xticklabels= {1,6,5,5,5,5,5,5,5,5,5},
                 xlabel={Newton-Iterations},
                 ylabel={GMRes-Iterations},
                 ]
                 \addplot[mark=none, red] table [x index=1,y index=2]
                    {\data};
                 \addplot[mark=none, blue] table [x index=1,y index=3]
                    {\data};
    \end{axis}
\end{tikzpicture}
\end{document}

其结果是: 在此处输入图片描述

对于图形顶部的 x 刻度,我想显示每个第二个标签(这只是一个例子,我的原始数据大约有 50 个时间步长)。我尝试了等等,minor x tick num但我无法得到我想要的结果。

请注意,第一个时间步比其他时间步多一次牛顿迭代。

答案1

您可以使用xticklabelxticklabels

xticklabel={\pgfmathparse{mod(\ticknum+1,2)==0?int(\ticknum+1):}\pgfmathresult}

在此处输入图片描述

代码:

\documentclass[margin=5pt]{standalone}
\usepackage{pgfplotstable,pgfplots}
\pgfplotsset{compat=newest}

\pgfplotstableread{
1   1   440 440
2   2   407 424
3   3   395 426
4   4   382 427
5   5   375 427
6   6   366 427
1   7   391 423
2   8   378 395
3   9   376 396
4   10  366 396
5   11  357 396
1   12  339 389
2   13  333 372
3   14  317 372
4   15  298 372
5   16  279 372
1   17  253 368
2   18  248 352
3   19  236 351
4   20  167 351
5   21  166 351
1   22  158 347
2   23  120 319
3   24  115 319
4   25  109 319
5   26  108 319
1   27  105 314
2   28  115 293
3   29  108 293
4   30  108 292
5   31  103 293
1   32  102 289
2   33  108 268
3   34  100 268
4   35  98  270
5   36  99  269
1   37  94  266
2   38  102 250
3   39  92  250
4   40  95  251
5   41  93  251
1   42  91  249
2   43  96  236
3   44  93  237
4   45  89  238
5   46  85  241
1   47  85  237
2   48  93  233
3   49  85  232
4   50  87  232
5   51  84  232
1   52  85  232
}\data

\begin{document}
\begin{tikzpicture}
    \begin{axis}[xmin=1, xmax=52,
                 ymin=0, ymax=450,
                 xtick={1,7,12,17,22,...,52},
                 minor x tick num=2,
                 xticklabel={\pgfmathparse{mod(\ticknum+1,2)==0?int(\ticknum+1):}\pgfmathresult},
                 x tick label as interval,
                 xmajorgrids,
                 axis x line*=top,
                 hide y axis,
                 xlabel={Timestep}
                 ]
    \end{axis}
    %
    \begin{axis}[xmin=1, xmax=52,
                 ymin=0, ymax=450,
                 axis x line*=bottom,
                 xtick={1,6,11,16,21,...,52},
                 minor x tick num=4,
                 xticklabels= {1,6,5,5,5,5,5,5,5,5,5},
                 xlabel={Newton-Iterations},
                 ylabel={GMRes-Iterations},
                 ]
                 \addplot[mark=none, red] table [x index=1,y index=2]
                    {\data};
                 \addplot[mark=none, blue] table [x index=1,y index=3]
                    {\data};
    \end{axis}
\end{tikzpicture}
\end{document}

相关内容