Creating this plot we need the function that maps from and to these new axes. Just like we have with logarithmic axes we need the function Log and its opposite Exp in the ScalingFunction option.
So let's define these two functions:
ClearAll[ConvertPoint, UnConvertPoint]
ConvertPoint[n_?NumericQ, {down_, up_}] := Module[{},
If[n < 0,
-ConvertPoint[-n, {-up, -down}]
,
If[n < up,
n
,
Log[n/up] + up
]
]
]
UnConvertPoint[n_?NumericQ, {down_, up_}] := Module[{},
If[n < 0,
-UnConvertPoint[-n, {-up, -down}]
,
If[n < up,
n
,
Exp[n - up] up
]
]
]
Given an input these will convert these back and from these new coordinates.
Now we modify the built-in ListPlot function:
ClearAll[ListSymmetricLogPlot];
ListSymmetricLogPlot[data_List, threshold_?NumericQ, opts : OptionsPattern[]] :=
ListSymmetricLogPlot[data, {-threshold, threshold}, opts]
ListSymmetricLogPlot[data_List, thresholds : {downthres_, upthres_}, opts : OptionsPattern[]] :=
Module[{xmin, xmax, ymin, ymax, vticks1, vticks2, vticks3, vticks, vticksright, tmp},
{{xmin, xmax}, {ymin, ymax}} = CoordinateBounds[data];
vticks1 = If[ymin < downthres,
tmp = Charting`ScaledTicks[{Log, Exp}][Log[-downthres], Log[-ymin]];
tmp[[All, 1]] = Minus@*Exp /@ tmp[[All, 1]];
tmp[[All, 2]] = Replace[tmp[[All, 2]], {x_?NumericQ :> -x, _Superscript[a_, b_] :> Superscript[-a, b]}, {1}];
tmp
,
{}
];
vticks2 = Charting`ScaledTicks["Linear"][downthres, upthres, 4];
vticks3 = If[ymax > upthres,
tmp = Charting`ScaledTicks[{Log, Exp}][Log@upthres, Log@ymax];
tmp[[All, 1]] = Exp /@ tmp[[All, 1]];
tmp
,
{}
];
vticks = vticksright = DeleteDuplicatesBy[SortBy[Join[vticks1, vticks2, vticks3], First],
First];
vticksright[[All, 2]] = "";
ListPlot[data, opts,
ScalingFunctions -> {None, {ConvertPoint[#, thresholds] &, UnConvertPoint[#, thresholds] &}},
PlotRange -> All,
FrameTicks -> {{vticks, vticksright}, Automatic},
Ticks -> {Automatic, vticks}
]
]
We can now test it out:
ListSymmetricLogPlot[{#,#}&/@Range[-10,10,0.2],0.5,ImageSize->600]
ListSymmetricLogPlot[{#,Tan[#]}&/@Range[-0.4995Pi,0.4995Pi,0.001Pi],{-1,1},Joined->True,Frame->True,ImageSize->600]
Giving:

Another test:
ListSymmetricLogPlot[Join[Table[{-x,-Exp[x-5]},{x,0,10,0.01}],Table[{x,Exp[x-5]},{x,0,10,0.01}]],{-3,3}]
Giving:

One limitation is now that you need to input {x,y} pairs as data just the y values {y1,y2,y3,…} does not work.
LogisticSigmoid
to your function. $\endgroup$ScalingFunctions -> "SignedLog"
. See the ScalingFunctions help for details. $\endgroup$