使用数学模式/latex 命令自动读取 pgfplots 表格列中的图例

使用数学模式/latex 命令自动读取 pgfplots 表格列中的图例

这是一个后续问题如何在图例中使用多个 pgfplotstable 列

我尝试了那里的最小工作示例,并将其中一个列名称替换为

{$R_0 = \SI{10}{\千欧姆}$}

像这样:

\documentclass[]{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepgfplotslibrary{groupplots}

\pgfplotsset{% global config
  compat=newest,
  every minor tick={very thin, gray},
  minor tick num=4,
  enlargelimits=0.02,
  group style={
    columns=2,
    xlabels at=edge bottom,
    ylabels at=edge left},
  every axis legend/.append style={
    legend cell align=left,
    legend columns=4
  }
}

\pgfplotstableread{
  Time      {Model A}   {Model G}   {$R_0 = \SI{10}{\kilo\ohm}$}
  0         1           1           1
  1         1           2           2
  2         2           3           3
  3         3           4           4
  4         5           5           8
  5         8           6           10
  6         13          7           16
}\modeltable

\pgfplotstableread{
  Time      {Data 1}  {Data 2}
  0         1.3       2.3
  1         2.6       3.6
  2         3.8       4.8
  3         7.9       5.9
  4         6.3       7.3
  5         7.5       6.5
  6         9.0       8.9
}\datatable

\begin{document}

  \begin{tikzpicture}

    \begin{groupplot}[
      xlabel={Time},
      ylabel={Amplitude},
      every axis title shift=0,
      legend to name=grouplegend,
      legend style={/tikz/every even column/.append style={column sep=0.5cm}}
     ]

      \pgfplotsinvokeforeach{1,2}{%
        \nextgroupplot[title=Data $#1$]

        % Models
        \foreach \y in {1, 2, 3} {
          \addplot [smooth, dashed, color=DarkRed]
            table[x index=0, y index=\y] {\modeltable};

          \pgfplotstablegetcolumnnamebyindex{\y}\of{\modeltable}\to{\colname}
          \addlegendentryexpanded{\colname}
        }

        % Data
        \addplot [only marks, mark=o]
          table[x index=0, y index=#1] {\datatable};
        \addlegendentry {Data}
      }

    \end{groupplot}

    \node (dummytitle) at ($(group c1r1.north)!0.5!(group c2r1.north)$)
      [above]{};
    \node (title) at (dummytitle.north)
      [above, yshift=\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {Experimental Data};

    \node (legend) at ($(group c1r1.south)!0.5!(group c2r1.south)$)
      [below, yshift=-2\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {\ref{grouplegend}};

  \end{tikzpicture}

\end{document}

但这不能编译。

日志中的第一个错误是:

))!未定义控制序列。 $R_0 = \SI {10}{\千欧姆}$ l.33 }\modeltable

有一些后续效果。只有当我将数学字符串放入 pgfplottable 中时它才不起作用。在文档的其他地方,它按预期工作。

所以我认为 pgfplots 解析器无法处理包含 latex 命令和/或数学模式的列名?

答案1

这将创建宏\namesub,并用预定义的替代项(如果存在)\createsub进行替换。\colname

\documentclass[]{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\usepgfplotslibrary{groupplots}

\pgfplotsset{% global config
  compat=newest,
  every minor tick={very thin, gray},
  minor tick num=4,
  enlargelimits=0.02,
  group style={
    columns=2,
    xlabels at=edge bottom,
    ylabels at=edge left},
  every axis legend/.append style={
    legend cell align=left,
    legend columns=4
  }
}

\pgfplotstableread{
  Time      {Model A}   {Model G}   R0
  0         1           1           1
  1         1           2           2
  2         2           3           3
  3         3           4           4
  4         5           5           8
  5         8           6           10
  6         13          7           16
}\modeltable

\pgfplotstableread{
  Time      {Data 1}  {Data 2}
  0         1.3       2.3
  1         2.6       3.6
  2         3.8       4.8
  3         7.9       5.9
  4         6.3       7.3
  5         7.5       6.5
  6         9.0       8.9
}\datatable

\makeatletter
\newcommand{\namesub}[1]% #1 = column name
  {\@ifundefined{name.#1}{#1}{\csname name.#1\endcsname}}

\newcommand{\createsub}[2]% #1 = column name, #2 = substituted name
  {\@ifundefined{name.#1}{\expandafter\def\csname name.#1\endcsname{#2}}%
    {\errmessage{Name #1 already in use}}}
\makeatother

\createsub{R0}{$R_0 = \SI{10}{\kilo\ohm}$}

\begin{document}

  \begin{tikzpicture}

    \begin{groupplot}[
      xlabel={Time},
      ylabel={Amplitude},
      every axis title shift=0,
      legend to name=grouplegend,
      legend style={/tikz/every even column/.append style={column sep=0.5cm}}
     ]

      \pgfplotsinvokeforeach{1,2}{%
        \nextgroupplot[title=Data $#1$]

        % Models
        \foreach \y in {1, 2, 3} {
          \addplot [smooth, dashed, color=DarkRed]
            table[x index=0, y index=\y] {\modeltable};

          \pgfplotstablegetcolumnnamebyindex{\y}\of{\modeltable}\to{\colname}
          \addlegendentryexpanded{\namesub\colname}
        }

        % Data
        \addplot [only marks, mark=o]
          table[x index=0, y index=#1] {\datatable};
        \addlegendentry {Data}
      }

    \end{groupplot}

    \node (dummytitle) at ($(group c1r1.north)!0.5!(group c2r1.north)$)
      [above]{};
    \node (title) at (dummytitle.north)
      [above, yshift=\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {Experimental Data};

    \node (legend) at ($(group c1r1.south)!0.5!(group c2r1.south)$)
      [below, yshift=-2\pgfkeysvalueof{/pgfplots/every axis title shift}]
      {\ref{grouplegend}};

  \end{tikzpicture}

\end{document}

相关内容