使用字符串作为 x 刻度标签绘制没有 x 坐标的行中的数据

使用字符串作为 x 刻度标签绘制没有 x 坐标的行中的数据

我正在尝试制作一个图表,其中标签 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}

结果:

在此处输入图片描述

相关内容