Как воспроизвести шкалу Python Matplotlib Asinh с помощью pgfplots?

Как воспроизвести шкалу Python Matplotlib Asinh с помощью pgfplots?

У Python matplotlibесть шкала осей, известная как"Асинх". Вблизи нуля он ведет себя как линейная шкала, но вдали от нуля он ведет себя как логарифмическая шкала. Это интересно для графиков логарифмической шкалы, которые варьируются от отрицательных до положительных чисел. Возможно ли реализовать такую ​​шкалу в pgfplots? В идеале я хотел бы знать, есть ли способ реализовать ее таким образом, чтобы к ней можно было получить доступ через ymode=asinh, например, что кажется немного иным, чем то, что достигается вэтот похожий вопрос.

решение1

Добавьте в преамбулу следующие строки:

\usepackage{pgfplots}
\usetikzlibrary{math}
\tikzmath{
  function asinhinv(\x,\a){
    \xa = \x / \a ;
    return \a * ln(\xa + sqrt(\xa*\xa + 1)) ;
  };
  function asinh(\y,\a){
    return \a * sinh(\y/\a) ;
  };
}
\pgfplotsset{
  ymode asinh/.style = {
    y coord trafo/.code={\pgfmathparse{asinhinv(##1,#1)}},
    y coord inv trafo/.code={\pgfmathparse{asinh(##1,#1)}},
  },
  ymode asinh/.default = 1
}

Для активации режима asinhдобавьте ключ ymode asinh(без =inbetween) к параметрам среды axis. Ключ принимает в качестве необязательного аргумента коэффициент масштабирования, по умолчанию 1. Если заменить ymode asinh, скажем, на ymode asinh=2, то значения вокруг y=0будут ближе друг к другу.

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{math}
\tikzmath{
  function asinhinv(\x,\a){
    \xa = \x / \a ;
    return \a * ln(\xa + sqrt(\xa*\xa + 1)) ;
  };
  function asinh(\y,\a){
    return \a * sinh(\y/\a) ;
  };
}
\pgfplotsset{
  ymode asinh/.style = {
    y coord trafo/.code={\pgfmathparse{asinhinv(##1,#1)}},
    y coord inv trafo/.code={\pgfmathparse{asinh(##1,#1)}},
  },
  ymode asinh/.default = 1
}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      ymode asinh,
      height=12cm,
      legend pos=north west,
      scaled ticks = base 10:0,
      domain = -5:5.5,
      ytick = {-100,-10, -1,0,1,10,100},
      minor ytick = {-90,-80,...,-20,-9,-8,...,-2,-.9,-.8,...,.9,2,3,...,9,20,30,...,90},
      yticklabel style={/pgf/number format/.cd,int detect,precision=0},
      tick label style = {fill=white, fill opacity=.7},
      yminorgrids = true,
      ymajorgrids = true,
      xmajorgrids = true,
      samples=200,
      axis lines=center,
    ]
    \addplot+ [mark=none] {x} ;
    \addplot+ [mark=none] {exp(x)} ;
    \addplot+ [mark=none] {-exp(-x)} ;
    \legend {$x$,$e^x$,$-e^{-x}$}
  \end{axis}
\end{tikzpicture}
\end{document}

введите описание изображения здесь Источники: Я начал с ответа наСимволический логарифм как масштабирование осей в PGFPlots.

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