1

I'm trying to draw lines with log y mode using PGFPlots.

I have a table looking like the following:

0.00097656 -56126
0.0019531 -53585
0.0039062 -33705
0.0078125 -25956
0.015625 -18886
0.03125 -10538
0.0625 -12273
0.125 -8532.3
0.25 -7443.9
0.5 -7443.9
1 -7407.8
2 -5200.3
4 -21963
8 -21963
16 -21963
32 -21963
64 -21963

which has negative y values. When I try to use log y axis, it gives me nothing as the range of y axis is from 10^0 to 10^1. How can I scale the y axis and get the image?

I can use matlab to get the wanted image like the following:

enter image description here

  • log function is not defined for negative numbers – percusse Oct 5 '15 at 5:44
  • yeah, for a number like -56126, we can process it as -5.6126*10^4, which did the trick. Matlab actually handles it this way, but I don't know if pgfplot supports such feature. – wangjingyi Oct 5 '15 at 5:46
  • how does it handle? 5.6e-4 is a different thing that log axis. I don't think matlab does anything like that. You can cook up something like that but it is not clear which one you want. – percusse Oct 5 '15 at 5:59
  • Thanks for your editing. :) I attached the matlab plot here. It puts negative before the power. – wangjingyi Oct 5 '15 at 6:14
  • Or you can use log(|y|) with no hack on the log function – Romain Picot Oct 5 '15 at 6:16
2

You can do this by first negating the y values to get positive numbers, and then again negate the labels of the y values.

Please have a look at the comments in the code.

% used PGFPlots v1.14
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
    \begin{tikzpicture}
        \begin{loglogaxis}[
            log basis x=2,
            ymin=1e3,
            ymax=1e5,
            % show the `yticklabels' as negative values
            log base 10 number format code/.code={
                $-10^{\pgfmathprintnumber{#1}}$
            },
        ]
            \addplot table [
                x index=0,
                % because negative log values are not defined,
                % make them positive
                y expr=-\thisrowno{1},
            ] {
                0.00097656 -56126
                0.0019531 -53585
                0.0039062 -33705
                0.0078125 -25956
                0.015625 -18886
                0.03125 -10538
                0.0625 -12273
                0.125 -8532.3
                0.25 -7443.9
                0.5 -7443.9
                1 -7407.8
                2 -5200.3
                4 -21963
                8 -21963
                16 -21963
                32 -21963
                64 -21963
            };
        \end{loglogaxis}
    \end{tikzpicture}
\end{document}

image showing the result of above code

  • Would it be possible to apply this trick if both axes have the same logarithmic base? – aaragon Nov 7 '17 at 13:24
  • @aaragon, without testing it I cannot image why this shouldn't work for loglogaxis as well. Just give it a try. If you cannot make it work, don't hesitate to ask a new question ... Good luck! – Stefan Pinnow Nov 7 '17 at 13:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.