如何在单个 pgfplots 图中包含两个 x 平行 xtick 标签?

如何在单个 pgfplots 图中包含两个 x 平行 xtick 标签?

我想要达到这样的效果:

  1. 第一组xtick标签正好是这个表的第一列(有这样的命令吗?);
  2. 那么,在这第一组标签下,应该还有另外一组xtick标签,它们恰好是这个表中的第n列;

如下面代码示例所示,我想绘制 x1 vs y1。但我还想使用 x2 作为标签。有人知道怎么做吗?谢谢

\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}[
height=8cm,
width=12cm,
grid=major,
legend pos=north west]
\addplot table[x=x1,y=y1] {
x1 y1 x2
16  4.27    3.24
32  1.84    1.96
64  1.82    1.57
80  2.06    1.51
128 1.29    2.51
160 2   2.98
256 2.45    5.41
320 2.71    20.78
}; 
\end{axis}
\end{tikzpicture}
\end{figure}

编辑:

我不希望第二组标签看起来是聚集的,它们应该只是标签。我不想绘制 x2 vs y1,x2 只是一组额外的标签。每个数字都应该在第一列的数字下方。参见下图, 在此处输入图片描述

答案1

这是另一种使用方法extra x tick labels。您需要通过自制\flattencolumn命令将表中所需的列展平为数组,然后可以将列表用作额外的 x 刻度。

我使用了对数轴,因为您想要刻度的数据彼此太接近。因此从美学角度来说我不会这样做。

\documentclass[]{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\def\flattencolumn#1#2{
  \let\mycollist=\relax
  \pgfplotstableforeachcolumnelement{#2}\of#1\as\myentry{%
      \csname @ifundefined\endcsname{mycollist}{
        \edef\mycollist{\myentry}
      }{
        \edef\mycollist{\mycollist,\myentry}
      }
  }
}

\begin{document}

\pgfplotstableread{
x1 y1 x2
16  4.27    3.24
32  1.84    1.96
64  1.82    1.57
80  2.06    1.51
128 1.29    2.51
160 2       2.98
256 2.45    5.41
320 2.71    20.78
}\mytable

\begin{tikzpicture}
\flattencolumn{\mytable}{x2}
\begin{semilogxaxis}[
height=8cm,
width=15cm,
grid=major,
xtick=data,
xmin=1,
extra x ticks/.expanded={\mycollist},
extra x tick style={grid=major,
                    tick label style={
                      yshift=-5mm}
                    },
log ticks with fixed point,
legend pos=north west]
\addplot table[x=x1,y=y1] \mytable; 
\end{semilogxaxis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

我使用了一个相当肮脏的技巧,但它对我来说非常完美。我用不同的设置对同一张图进行分层,但同时保留了图布局的关键值(xminxmax等等)。缺点是我要多次重复加载相同的数据,但优点是我可以完全控制输出。

%! *latex mal-ticks.tex
\documentclass[border=5]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}
\def\myset{xmin=0, xmax=350, ymin=1, ymax=4.5, 
height=10cm, width=18cm, legend pos=north west}
\def\nochange{only marks, no markers}

\begin{tikzpicture}
% Graf number 1: Labels with x=x1...
\begin{axis}[\myset, %extra x ticks=data,
  \nochange, xtick=data, grid=major, blue, x tick label style={yshift=-6mm}, hide y axis,
  ]
\addplot table[x=x1, y=y1] {
x1 y1 x2
16  4.27    3.24
32  1.84    1.96
64  1.82    1.57
80  2.06    1.51
128 1.29    2.51
160 2   2.98
256 2.45    5.41
320 2.71    20.78
};
\end{axis}

% Graph number 2: Labels with x=x2...
\begin{axis}[\myset, %extra x ticks=data,
  xtick=data, xticklabels={3.24, 1.96, 1.57, 1.51, 2.51, 2.98, 5.41, 20.78}, ytick=data, only marks, mark=x, mark options={magenta}, grid=both, x tick label style={yshift=-11mm}, x tick label style={magenta}, %hide y axis,
yticklabel style={/pgf/number format/zerofill},
  ]
\addplot table[x=x1, y=y1] {
x1 y1 x2
16  4.27    3.24
32  1.84    1.96
64  1.82    1.57
80  2.06    1.51
128 1.29    2.51
160 2   2.98
256 2.45    5.41
320 2.71    20.78
};
\end{axis}

% Graph number 3: The actual plotting...
\begin{axis}[\myset, %extra x ticks=data,
  minor xtick=data, x tick label style={yshift=-1mm}, hide y axis, %ymajorgrids,
  ]
\addplot table[x=x1, y=y1] {
x1 y1 x2
16  4.27    3.24
32  1.84    1.96
64  1.82    1.57
80  2.06    1.51
128 1.29    2.51
160 2   2.98
256 2.45    5.41
320 2.71    20.78
};
\end{axis}
\end{tikzpicture}

\end{document}

分层同一张图的 mwe

相关内容