
Recentemente, encontrei um erro estranho que não me permitiu redimensionar as marcações na barra de cores usando um código especificado manualmente.
Considere o seguinte exemplo:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{
colormap/viridis,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=1e3:10e3,
scaled x ticks=manual:{}{\pgfmathparse{#1/1000}},
scaled y ticks=manual:{}{\pgfmathparse{#1/1000}},
colorbar,
colorbar style={
scaled y ticks=manual:{}{\pgfmathparse{#1/1000}},
},
]
\addplot [mesh,ultra thick] {x};
\end{axis}
\end{tikzpicture}
\end{document}
Os ticks x
e y
são reduzidos por um fator de 1000 (por exemplo, para alterar o prefixo SI), mas não exibem a escala, pois essa informação é codificada com a unidade. A aparência de 'NaN' para a barra de cores obviamente não é desejada e deve ser corrigida, mas o mesmo código que funciona para os eixos não funciona para a barra de cores.
Responder1
A razão pela qual o dimensionamento não funciona na barra de cores é que existem duas expansões dos argumentos. No TeX, #1
refere-se ao primeiro argumento (ou nada, não há primeiro argumento), e a intenção é que #1
se expanda para o número do tick.
O problema aqui é que quando o TeX está descobrindo qual colorbar style
é o argumento, ele está fazendo uma primeira expansão e, como não há argumento, \pgfmathparse{#1/1000}
expande para \pgfmathparse{/1000}
qual é inválido, daí o NaN.
Para corrigir isso, a escala deve ser especificada como \pgfmathparse{##1/1000}
. Durante a expansão problemática descrita acima, isso se expande conforme \pgfmathparse{#1/1000}
desejado e pode então ser usado para dimensionar corretamente as marcações da barra de cores:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{
colormap/viridis,
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=1e3:10e3,
scaled x ticks=manual:{}{\pgfmathparse{#1/1000}},
scaled y ticks=manual:{}{\pgfmathparse{#1/1000}},
colorbar,
colorbar style={
scaled y ticks=manual:{}{\pgfmathparse{##1/1000}},
},
]
\addplot [mesh,ultra thick] {x};
\end{axis}
\end{tikzpicture}
\end{document}