我正在尝试制作一个图表,其中标签 y 是行的第一列,x 是其他列(在示例中是从 IPT1 到 IPT7,但范围远不止于此)。
我相信它会是一种直方图或类似于选举调查的图表(候选人的姓名和百分比按月出现)。
我编写了以下代码,但没有得到预期的结果。数据是由 C++ 代码生成的(该代码处理多个文件并提供索引随时间变化的历史记录)。
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}
\begin{filecontents}{data.dat}
Team;IPT1;IPT2;IPT3;IPT4;IPT5;IPT6;IPT7
Tiger;1;2;3;4;5;6;7
XPO ;3;5;7;9;11;13;15
ABC ;5;8;11;14;17;20;23
\end{filecontents}
\begin{document}
\pgfplotstableread[col sep=semicolon]{data.dat}\datatable
\begin{tikzpicture}
\begin{axis}[
yticklabels from table={\datatable}{Team},
ytick=data,
xticklabel = {IPT1,IPT2,IPT3,IPT4,IPT5,IPT6,IPT7}, xtick=data,
]
\addplot table[
x=IPT1,
y expr=\coordindex,
] {\datatable};
\addplot table[
x=IPT2,
y expr=\coordindex,
] {\datatable};
\addplot table[
x=IPT3,
y expr=\coordindex,
] {\datatable};
\addplot table[
x=IPT4,
y expr=\coordindex,
] {\datatable};
\end{axis}
\end{tikzpicture}
\end{document}
我尝试将团队名称放在 y 标签中,并将 IPT 标签放在 x 轴上......
我哪里错了?是否可以编写一个读取球队名称后几列的代码(IPT1,IPT2,..... IPTn)?
答案1
问题中的方法存在一些问题。
目标是绘制每行的数据,但pgfplots
希望数据按列组织。可以使用 来解决此问题\pgfplotstabletranspose
,使用第一列创建引用每行的键(请参阅使用 pgfplots 按行绘制数据)。
请注意,行键对空格敏感,因此XPO ;3;5
与不同XPO;3;5
。如果您想在团队名称中使用空格,则需要在\addplot
命令中使用带有确切空格数的花括号,例如y = {XPO }
。
数据中没有明确给出 x 坐标,因此应使用\coordindex
(即值在行中的位置)推断。在问题中,此命令用于 y 值,但 y 值应从数据本身读取,因为这是您想要绘制的内容。由于已为行分配了键,因此您可以使用y = Tiger
等来引用特定团队的行。要使行从 1 开始而不是从 0 开始,您可以使用\coordindex+1
。
如果要使用字符串列表作为 x 轴上的刻度标记,则需要执行两件独立的事情:首先使用 给出带有刻度位置的数字列表,xtick={...}
同时使用 提供字符串xticklabels={...}
。请注意,末尾xticklabels
有一个s
,否则每个单独的标签都会被分配完整的列表,从而导致问题中看到的重叠标签。为了使轴更具可读性,您可以使用 将标签缩小一点x tick label style
。
最后是球队名称的位置。在我看来,将这些名称作为刻度标签放在 y 轴上没有多大意义,因为它们描述的是图表中的一条线,而不是轴上的一个值。此外,实际值(示例数据中的 1 到 23)可能有意义,例如分数。因此,为球队名称使用图例并将实际 y 值作为标签放在 y 轴上可能是一个好主意。
在 MWE 中放在一起:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}
\begin{filecontents}{data.dat}
Team;IPT1;IPT2;IPT3;IPT4;IPT5;IPT6;IPT7
Tiger;1;2;3;4;5;6;7
XPO;3;5;7;9;11;13;15
ABC;5;8;11;14;17;20;23
\end{filecontents}
\begin{document}
\pgfplotstableread[col sep=semicolon]{data.dat}\datatable
\pgfplotstabletranspose[colnames from=Team]\transposeddata{\datatable}
\begin{tikzpicture}
\begin{axis}[
ylabel = Score,
xlabel = Task,
xmin=0,
xmax=8,
xtick={1,...,7},
xticklabels = {IPT1,IPT2,IPT3,IPT4,IPT5,IPT6,IPT7},
x tick label style={font=\small},
legend pos = {north west},
]
\addplot table[
x expr=\coordindex+1,
y = Tiger,
] {\transposeddata};
\addplot table[
x expr=\coordindex+1,
y = {XPO },
] {\transposeddata};
\addplot table[
x expr=\coordindex+1,
y = {ABC },
] {\transposeddata};
\addlegendentry{Tiger}
\addlegendentry{XPO}
\addlegendentry{ABC}
\end{axis}
\end{tikzpicture}
\end{document}
结果: