我有一个方阵图,具有相同的 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
它们将扩展这些键的参数一次,并将结果转发给xticklabels
和yticklabels
。这样你就可以使用宏了:
\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
我可能会定义一种新样式,同时设置xticklabels
和yticklabels
。在下面的示例中,它们设置为相同的内容,并且标签列表设置为键的默认值。如果您想要不同的列表,请将两者替换#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}