我想用 \pgfplotsset 为轴指定 xmode 和 ymode(或任何其他方式,以便可以通过 if 语句更改模式)我收到的错误消息是:
! Package pgfplots Error: Sorry, you can't change `/pgfplots/xmode' in this con
text. Maybe you need to provide it as \begin{axis}[/pgfplots/xmode=...] ?.
这是一个最小的工作示例:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5}
\def\someoption{1} % change this to zero to see the error
\ifcase\someoption % this is the reason why I want to define xmode with styles
\pgfplotsset{/pgfplots/mystyle/.style={
/pgfplots/xmode=log, % this is not working
/pgfplots/ymode=log % this too
}}
\else
\pgfplotsset{/pgfplots/mystyle/.style={}}
\fi
\begin{document}
\section*{with style: (not working)}
\begin{tikzpicture}
\begin{axis}[/pgfplots/mystyle]
\addplot coordinates {(10, 100) (100, 15) (2000, 200)};
\end{axis}
\end{tikzpicture}
% how it should look like
\section*{with hard-coded axis properties:}
\begin{tikzpicture}
\begin{axis}[xmode=log,ymode=log]
\addplot coordinates {(10, 100) (100, 15) (2000, 200)};
\end{axis}
\end{tikzpicture}
\end{document}
这与用户定义样式的轴限值,但在这种情况下这没有帮助。
答案1
您遇到了 pgfplots 的内部限制 - 这就是它声称您无法在上下文中更改密钥的原因(这不是错误,而是功能)。
原因是键过滤:pgfplots首先从输入参数列表中提取xmode
和键,以决定应激活哪个默认配置集(等)。为此,它仅设置属于键系列的选项。如果没有此限制,键可能会在错误的上下文中设置。ymode
every loglog axis
/pgfplots/scale
如果你能确保你的风格mystyle
只包含xmode
and/or ymode
,那么你可以使用以下方法解决问题
\ifcase\someoption % this is the reason why I want to define xmode with styles
\pgfplotsset{/pgfplots/mystyle/.style={
/pgfplots/xmode=log, % this is not working
/pgfplots/ymode=log % this too
},
mystyle/.belongs to family=/pgfplots/scale,% <----
}
\else
\pgfplotsset{/pgfplots/mystyle/.style={}}
\fi
如果您的样式设置的不止这些,那么您至少应该确保它只包含对其他样式的更改(如ticklabel style={...}
)。
手册中没有记录这一点。我不确定是否应该记录。
答案2
您可以将其提供给 TikZ 图片而不是轴。但看到这不起作用确实很奇怪。可能是由于处理问题,\pgfkeys
但我找不到问题所在。
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{mystyle/.style={/pgfplots/xmode=log,/pgfplots/ymode=log}}
\begin{document}
\begin{tikzpicture}[every axis/.style={/pgfplots/mystyle}]
\begin{axis}
\addplot coordinates {(10, 100) (100, 15) (2000, 200)};
\end{axis}
\end{tikzpicture}
\end{document}