我想要达到这样的效果:
- 第一组xtick标签正好是这个表的第一列(有这样的命令吗?);
- 那么,在这第一组标签下,应该还有另外一组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
我使用了一个相当肮脏的技巧,但它对我来说非常完美。我用不同的设置对同一张图进行分层,但同时保留了图布局的关键值(xmin
,xmax
等等)。缺点是我要多次重复加载相同的数据,但优点是我可以完全控制输出。
%! *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}