Marcações dimensionadas manualmente na barra de cores

Marcações dimensionadas manualmente na barra de cores

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}

saída

Os ticks xe ysã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, #1refere-se ao primeiro argumento (ou nada, não há primeiro argumento), e a intenção é que #1se 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}

saída

informação relacionada