预期行为

预期行为
\documentclass[tikz]{standalone}

\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        xtick = {0,1,5},
        xticklabels = {{zero},$\alpha$,$\varphi$},
        extra x ticks = {-4,-2},
        extra x tick style = {
                            red,
                            font=\bfseries
                            },
    ]
    \addplot {x^2 - x +4};
    \end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

  • 我使用xtick自定义标签(xticklabels)。
  • 另外,我想要一些extra x ticks
  • 我希望它们extra x ticks能够自动打印,但是却xticklabels使用了它们。
  • 我没有定义extra x tick labels

答案1

忽略我的评论

pgfplots.code.tex6888-90行

  \expandafter\ifx\csname pgfplots@extra@#1ticklabel\endcsname\pgfutil@empty 
      \pgfutil@namelet{pgfplots@extra@#1ticklabel}{pgfplots@#1ticklabel}% 
  \fi

这表明这是故意设计用来xticklables作为的后备extra x tick labels

解决方法很简单,分配extra x tick labelextra x tick labels

预期行为

@Dr. Manuel Kuehner 建议预期行为只是打印 x 坐标。这比我想象的更有意义。在这种情况下,我们应该用以下代码替换这三行

\expandafter\ifx\csname pgfplots@extra@#1ticklabel\endcsname\pgfutil@empty
    \expandafter\def\csname pgfplots@extra@#1ticklabel\endcsname{\axisdefaultticklabel}%
\fi

经过代替,我的意思是编辑pgfplots.code.tex或者重新定义\pgfplots@init@ticks@for#1


顺便说一下,在同一个文件中,如果我们查看第 6881-90 行,我们会看到

\expandafter\ifx\csname pgfplots@#1ticklabel\endcsname\pgfutil@empty
  \pgfplots@if{pgfplots@#1islinear}{%
      \expandafter\def\csname pgfplots@#1ticklabel\endcsname{\axisdefaultticklabel}%
  }{%
      \expandafter\def\csname pgfplots@#1ticklabel\endcsname{\axisdefaultticklabellog}%
  }% 
\fi
\expandafter\ifx\csname pgfplots@extra@#1ticklabel\endcsname\pgfutil@empty
  \pgfutil@namelet{pgfplots@extra@#1ticklabel}{pgfplots@#1ticklabel}%
\fi

翻译成英文

  • 如果用户没有指定如何打印普通标签,则只需打印 x 坐标
  • 如果用户确实指定了如何打印普通标签,则服从用户。
  • 若用户没有指定如何打印额外的标签,则将额外的标签视为普通标签。

背后的逻辑是,有时用户更喜欢0厘米1厘米, 和5厘米而不是015。因此用户可以分配

xticklabel={$\pgfmathprintnumber{\tick}$cm}

在这种情况下,用户可能想要-4厘米-2厘米而不是-4-2,因此 PGFPlots 将继承格式并添加厘米到额外的标签。


那么问题来了,如何实现下面的逻辑呢?

  • 如果用户没有指定如何打印普通标签,则只需打印 x 坐标
  • 如果用户确实指定了如何打印普通标签,则服从用户。
  • 如果用户没有指定如何打印额外的标签:
    • 如果用户分配xticklabel,则将额外的标签视为普通标签。
    • 如果用户分配xticklabels,只需打印 x 坐标。

您可能想检查是否\pgfplots@xticklabel为空。(是吗?)

相关内容