\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.tex
6888-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 label
或extra 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厘米而不是0
、1
和5
。因此用户可以分配
xticklabel={$\pgfmathprintnumber{\tick}$cm}
在这种情况下,用户可能想要-4厘米和-2厘米而不是-4
和-2
,因此 PGFPlots 将继承格式并添加厘米到额外的标签。
那么问题来了,如何实现下面的逻辑呢?
- 如果用户没有指定如何打印普通标签,则只需打印 x 坐标
- 如果用户确实指定了如何打印普通标签,则服从用户。
- 如果用户没有指定如何打印额外的标签:
- 如果用户分配
xticklabel
,则将额外的标签视为普通标签。 - 如果用户分配
xticklabels
,只需打印 x 坐标。
- 如果用户分配
您可能想检查是否\pgfplots@xticklabel
为空。(是吗?)