Symmetrical log plot

Is there anyway to do a symmetrical log plot (i.e., in both positive and negative directions), through Plots.jl? I know matplotlib has this functionality.

1 Like

I didn’t find a way to do it directly with Plots.jl, but I implemented something for my research that could be useful for you:

 using Plots, LaTeXStrings
pgfplots()

n = 20
x = [i for i = 0:n]
y = [(-1)^i * 10^(-i/2+4) for i = 0:n]

function symlog(y, C)
  return sign.(y) .* (log10.(1 .+ abs.(y) / (10^C)))
end

function invsymlog(y, C)
  return sign.(y) .* 10^C .* (-1 .+ 10 .^ (abs.(y)))
end

C = ceil(minimum(log10.(abs.(y))))
z = symlog(y, C)

plot(x, z, lw=1, xlabel=L"k", ylabel=L"\mathcal{E}(x,y)", label="", legend=:best)
savefig("metric.tex")

open("figure.tex", "w") do io
  println(io, "\\documentclass[tikz]{standalone}")
  println(io, "\\usepackage{pgfplots}")
  println(io, "\\usepackage{tikz}")
  println(io, "\\pgfplotsset{compat=1.15}")
  println(io, "\\begin{document}")
end
run(`bash -c 'cat metric.tex >> figure.tex'`)
open("figure.tex", "a") do io
  println(io, "\\end{document}")
end

run(`pdflatex figure.tex`)

After that you only need to change ytick and yticklabels in the latex file.
yticklabels = {$-10$,$-5$,$0$,$5$,$10$} becomes {$-10^4$,$-10^(-1)$,$-10^(-6)$,$10^(-6)$,$10^(-1)$,$10^4$}.
With C=-6 in that case, -10 is replaced by -10^(10+C) and 5 is replaced by 10^(5+C).

Now ytick needs to be changed to take the value of symlog applied to {-10^4,-10^{-1},-10^{-6},10^{-6},10^{-1},10^4}
which means that ytick = {-10.0,-5.0,0.0,5.0,10.0} becomes ytick ={ -10.00000000004343,-5.000004342923105,-0.3010299956639813,0.3010299956639813,5.000004342923105,10.00000000004343}.

With sed commands it should be possible to automate this last part of the process.
Final figure:

1 Like