新的(聪明的?)答案

新的(聪明的?)答案

我有一个方阵图,具有相同的 x 和 y 刻度和刻度标签,我希望使用预定义命令来避免重复使用相同值“{A,B,C}”的 xticklabels 和 yticklabels(我的实际情况有更长的列表;我只是在这里使用一个简化的例子)。

\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}

\def\ticklabels{A, B, C}

\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xticklabels=\ticklabels,
yticklabels=\ticklabels]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}

\end{document}

我希望使用一个简单的命令来执行下面这样的操作,但是 xticklabels 和 yticklabels 值显然没有正确传递,因此只有“A,B,C”作为一个整体被分配给第一个刻度,而其他刻度都变为空。

上述示例代码的结果

我猜是因为命令在解释之前没有被扩展。我读到这个帖子并尝试使用那里提供的解决方案,但找不到如何使其工作。有人可以帮忙吗?

答案1

新的(聪明的?)答案

下面的旧答案实现了一些已经实现的东西pgfkeys(我只是忘记了它)。

在 中pgfkeys有处理程序可以扩展给定的值,它们是.expand once.expand twice.expanded(最后一个在 中完全扩展\edef)。您可以使用它们来扩展您的宏:

\documentclass{standalone}

\usepackage{pgfplots}

\begin{document}

\def\ticklabels{A, B, C}

\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xticklabels/.expand once=\ticklabels,
yticklabels/.expand once=\ticklabels]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}

\end{document}

输出与旧答案类似。


旧的(愚蠢的)答案

下面定义了键xticklabels-exp和,yticklabels-exp它们将扩展这些键的参数一次,并将结果转发给xticklabelsyticklabels。这样你就可以使用宏了:

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset
  {%
     xticklabels-exp/.code=%
      {%
        \expanded
          {\noexpand\pgfkeysalso{xticklabels={\unexpanded\expandafter{#1}}}}%
      }
    ,yticklabels-exp/.code=%
      {%
        \expanded
          {\noexpand\pgfkeysalso{yticklabels={\unexpanded\expandafter{#1}}}}%
      }
  }

\begin{document}

\def\ticklabels{A, B, C}

\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xticklabels-exp=\ticklabels,
yticklabels-exp=\ticklabels]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

本答案解释:

\pgfkeysalso{<key=val-list>}与您在外部调用中使用该列表相同,\pgfkeys但您可以在键的代码中使用它。

\expanded完全扩展它的参数(类似但不完全相同\edef,即宏参数不需要与中不同进行特殊处理\edef)。

\noexpand保护以下标记免于在扩展上下文中扩展(因此在\expanded或中\edef)。

\unexpanded类似于,\noexpand但采用一个参数并保护整个参数(删除一组括号)。

\expandafter跳过以下标记并首先扩展下一个标记。由于\unexpanded会扩展所有内容,直到找到左括号(考虑到其名称,这很奇怪……),因此会扩展\expandafter,这会跳过左括号并扩展 once 参数中的第一个标记\unexpanded

答案2

我可能会定义一种新样式,同时设置xticklabelsyticklabels。在下面的示例中,它们设置为相同的内容,并且标签列表设置为键的默认值。如果您想要不同的列表,请将两者替换#1为您的列表,然后删除带有的行.default

在此处输入图片描述

\documentclass[border=5mm]{standalone}

\usepackage{pgfplots}
\pgfplotsset{
  xyticklabels/.style={
    xticklabels={#1},
    yticklabels={#1}
  },
  xyticklabels/.default={A,B,C} % set the default value for #1
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xyticklabels  % <--  no value passed to the key, so the default A,B,C is used
]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}

\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xyticklabels={D,E,F}  % <-- a value passed to the key, so D,E,F is used instead
]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}
\end{document}

答案3

可以将上述答案结合起来,得到一个更简单的解决方案,只需一种新风格。

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{
     xyticklabels/.code={
        \expanded{
              \noexpand\pgfkeysalso{
                xticklabels={\unexpanded\expandafter{#1}},
                yticklabels={\unexpanded\expandafter{#1}}
              }
        }
    }
}

\begin{document}

\def\ticklabels{A, B, C}

\begin{tikzpicture}
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xyticklabels={\ticklabels}]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}

\end{document}

答案4

您可以xticklabels from table使用表格或文件。

\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread{
ticks
A
B
C
}\loadedtable
\begin{axis}[
enlargelimits=false,
xtick=data,
ytick=data,
xticklabels from table={\loadedtable}{ticks},
yticklabels from table={\loadedtable}{ticks},
]
\addplot [
matrix plot,
mesh/cols=3,
point meta=explicit]
table [meta=C] {
x y C
0 0 0
1 0 1
2 0 2
0 1 3
1 1 4
2 1 5
0 2 6
1 2 7
2 2 8
};
\end{axis}
\end{tikzpicture}
\end{document}

带刻度标签的彩色方块

相关内容