¿Cómo reproducir la escala matplotlib Asinh de Python usando pgfplots?

¿Cómo reproducir la escala matplotlib Asinh de Python usando pgfplots?

Python matplotlibtiene una escala de eje conocida como"Asinh". Cerca de cero se comporta como una escala lineal, pero lejos de cero se comporta como una escala logarítmica. Es interesante para gráficos de escala logarítmica que abarcan números negativos y positivos. ¿Es posible implementar tal escala en pgfplots? Idealmente, me gustaría saber si existe alguna manera de implementarlo de tal manera que se pueda acceder a través de ymode=asinh, por ejemplo, lo que parece un poco diferente de lo que se logra enesta pregunta similar.

Respuesta1

Agregue las siguientes líneas a su preámbulo:

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

Para activar el modo asinh, agregue la clave ymode asinh(sin =en el medio) a las opciones del axisentorno. La clave toma como argumento opcional el factor de escala, siendo el predeterminado 1. Si reemplaza ymode asinhpor, digamos ymode asinh=2, los valores alrededor y=0estarán más juntos.

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

ingrese la descripción de la imagen aquí Fuentes: comencé desde la respuesta aSymlog como escala de eje en PGFPlots.

información relacionada