编辑

编辑

摘要:在使用 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/TiZ 手册中有一节称为密钥管理包含您应该了解的有关这些风格的一切。

例如,您马上就会发现,除了 之外,.append style={}还有prefix style={}.add style={}{}。正如名称所暗示的那样,前两个键只是第三个键的别名。

假设你对密钥处理程序非常熟悉。还有一件事:every foobar

它们有许多键,以某些设计元素命名every foobarfoobar例如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.tex242-308 行。

相关内容