Marcas escaladas manualmente en la barra de colores

Marcas escaladas manualmente en la barra de colores

Recientemente, encontré un error extraño que no me permitía cambiar la escala de las marcas en la barra de colores usando un código especificado manualmente.

Considere el siguiente ejemplo:

\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}

producción

Las marcas xy yse reducen en un factor de 1000 (por ejemplo, para cambiar el prefijo SI), pero no muestran la escala ya que esa información está codificada con la unidad. La apariencia de 'NaN' para la barra de colores obviamente no es deseada y debe corregirse, sin embargo, el mismo código que funciona para los ejes no funciona para la barra de colores.

Respuesta1

La razón por la que la escala no funciona en la barra de colores es que hay dos expansiones de los argumentos. En TeX, #1se refiere al primer argumento (o nada si no hay un primer argumento), y la intención es que #1se expanda al número de marca.

El problema aquí es que cuando TeX descubre cuál colorbar stylees el argumento, está haciendo una primera expansión y, como no hay ningún argumento, \pgfmathparse{#1/1000}la expansión \pgfmathparse{/1000}no es válida, de ahí el NaN.

Para solucionar este problema, la escala debe especificarse como \pgfmathparse{##1/1000}. Durante la expansión problemática descrita anteriormente, esto se expande a\pgfmathparse{#1/1000} como se desee y luego se puede usar para escalar correctamente los ticks de la barra de colores:

\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}

producción

información relacionada