Вручную масштабированные деления на цветовой шкале

Вручную масштабированные деления на цветовой шкале

Недавно я столкнулся со странной ошибкой, из-за которой мне не удалось изменить масштаб делений на цветовой шкале с помощью вручную указанного кода.

Рассмотрим следующий пример:

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

выход

xИ отметки yмасштабируются в 1000 раз (например, чтобы изменить префикс СИ), но не отображают масштаб, поскольку эта информация кодируется с единицей. Появление 'NaN' для цветовой шкалы, очевидно, нежелательно и должно быть исправлено, однако тот же код, который работает для осей, не работает для цветовой шкалы.

решение1

Причина, по которой масштабирование не работает в цветовой шкале, заключается в том, что есть два расширения аргументов. В TeX #1ссылается на первый аргумент (или ничего, если нет первого аргумента), и намерение состоит в том, что #1расширяется до номера тика.

Проблема здесь в том, что когда TeX определяет, что colorbar styleтакое аргумент to, он выполняет первое расширение, и поскольку аргументов нет, \pgfmathparse{#1/1000}расширяется до to \pgfmathparse{/1000}, что является недопустимым, отсюда и NaN.

Чтобы исправить это, масштабирование должно быть указано как \pgfmathparse{##1/1000}. Во время проблемного расширения, описанного выше, оно расширяется до \pgfmathparse{#1/1000}желаемого значения, и это затем можно использовать для правильного масштабирования делений цветовой шкалы:

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

выход

Связанный контент