摘要:在使用 pgfplots 和 tikz 时,我无法理解哪些选项会互相覆盖以及哪些选项具有最高优先级。
在以下代码中,参数mark size=6pt
和参数mark repeat=1
内的\addplot[...]
参数将被忽略,因为它们已通过使用[...]/.append style[...]
命令进行了更改。我只是不明白为什么 append 会锁定这些命令 - 即使稍后尝试更改这些命令...
代码如下:
\documentclass[12pt,a4paper,tikz]{standalone}
\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{tikz,pgfplots,grffile,amsmath}
\pgfplotsset{compat=newest}
\pgfplotscreateplotcyclelist{markerlist4}{%
mark=square\\%
mark=o\\%
mark=diamond\\%
mark=halfsquare*\\%
}
\pgfplotsset{every axis plot/.append style={
every mark/.append style={mark color=none, solid, line join=miter, line width=0.5pt, mark size=2pt, mark repeat=100000}
},}
\pgfplotsset{/pgfplots/width=7.5cm}
\pgfplotsset{/pgfplots/height=5.6cm}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
xmin=0,
xmax=1,
ymin=0,
ymax=1,
cycle list name=markerlist4,
]
\addplot+[color=black, line width=1.0pt, mark phase=4, mark size=6pt, mark repeat=1]
coordinates{(0,0)(0.1,0.1)(0.2,0.2)(0.3,0.3)(0.4,0.4)(0.5,0.5)(0.6,0.6)};
\addlegendentry{mark options={}}
\end{axis}
\end{tikzpicture}
\end{document}
结果如下:
如果我在参数mark options={}
中添加一个\addplot[...]
,则所有/.append style
参数都会被删除,并且mark size=6pt
和也mark repeat=1
不会被忽略。例如:
\addplot+[color=black, line width=1.0pt, mark phase=4, mark size=6pt, mark repeat=1, mark options={}]
现在结果如下:
因此,似乎命令every axis plot... append
会锁定参数(mark size
在本例中具体为),直到参数列表mark options={}
中的释放addplot
。这是为什么?这是故意的吗?
问题是我正在使用许多自定义命令,例如\pgfplotsset{every axis plot/.append style= ... ...}
因为我喜欢使用适合的默认样式设置,我只需要为非常具体的图自定义这些设置(不幸的是,比我希望的要频繁得多),但我不理解 pgfplots 和 tikz 中参数/命令的优先级概念。我花了很长时间才找到我刚刚发布的内容 - 我没有用谷歌搜索它 - 而且我经常偶然发现类似的问题。它总是同样的问题:为什么忽略或(秘密)覆盖特定选项......例如,我不明白某些命令的相等性:例如\pgfplotsset{every axis plot/.append style={every mark/.append style={mark size=2pt}}}
似乎与大致相同mark options={mark size=2pt}
,但都可以独立于环境使用,例如在 tikzpicture 内部和外部,并且两者真的相等还是有区别?
所以我的具体问题是为什么\addplot+[...]
参数中的参数似乎没有效果,因为它们显然被一些pgfplotsset APPEND
命令覆盖(这些命令是事先设置的!),我认为这些只是附加恢复默认设置,如果指定不同,应该很容易覆盖......
但一般的问题是是否有人可以进一步向我解释其背后的概念 - 希望我下次能更快地意识到自己所犯的“错误”,因为每一秒在谷歌上搜索 tikzspicture 都花 5 个小时真是太烦人了......
附言:我还有一个与命令优先级问题相关的后续问题:如果我想在命令参数中指定一个选项,比如标记线宽\addplot[...]
:如果不使用,我该如何实现这一点mark options={...}
,因为不幸的是,如果这些选项没有再次复制到参数中,它将删除/重置之前附加的所有其他标记选项(问题是像这样的命令line width
已经为图表/图形线保留,并且人们不一定总是希望标记线和图表/图形线具有相同的线宽)?marker line width=2pt
会导致错误,因为它不是一个已知参数。
答案1
如果你有 PGF/Ti钾Z 手册中有一节称为密钥管理包含您应该了解的有关这些风格的一切。
例如,您马上就会发现,除了 之外,.append style={}
还有prefix style={}
和.add style={}{}
。正如名称所暗示的那样,前两个键只是第三个键的别名。
假设你对密钥处理程序非常熟悉。还有一件事:every foobar
。
它们有许多键,以某些设计元素命名every foobar
,foobar
例如picture
/ node
/ axis plot
/ mark
/ 等。这些键的应用时间和地点取决于包作者。大多数时候,我们只能通过查看源代码来获得很少的提示。
回到你的代码。你的代码不太可能工作,因为你有一个every
内部另一个every
。通常你只需要一个,every
因为......嗯......那是每一个!! 因此,通过去除外层every
,即
\pgfplotsset{
\tikzset{
every mark/.prefix style={
mark color=none, solid, line join=miter, line width=0.5pt, mark size=2pt, mark repeat=100000
}
}
那么一切都正常。
编辑
抱歉,我没有正确测试。看来这every mark
是个tikz
关键,所以把它放在 下是没有意义的\pgfplotsset
。
顺便说一句,源代码建议可以放在every mark
下\pgfplotscreateplotcyclelist
。请参阅pgfplots.code.tex
242-308 行。