如何在 pgfplots 中使 x 轴的一部分变为正常尺度,其他部分变为对数尺度?

如何在 pgfplots 中使 x 轴的一部分变为正常尺度,其他部分变为对数尺度?

我正在尝试使用 PGFplots 制作这样的图表(在 Origin 中制作):

在此处输入图片描述

但我不知道如何正确制作 x 轴。

这是我的 MWE:

    \documentclass[tikz,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{mathptmx}
\usetikzlibrary{pgfplots.groupplots}
\usepackage{pgfplots}
\pgfplotsset{width=12cm,compat=1.9}
\usepackage{filecontents}
\begin{filecontents}{1.csv}
    -.5 0
    1   0.02
    2   0.03
    3 0.035
    4   0.04
    5   0.05
    10 0.06
    100 0.15
    200 0.17
    500 0.18
    1000    0.2
    15000   0.22
\end{filecontents}
\begin{filecontents}{2.csv}
    -2  -.5
    0   2
    1   5
    2 1
    3   7
    4   8
    5 9
    50  10
    250 15
    1000    20
    5000    14
    20000   12
\end{filecontents}
\begin{document}
\pgfplotsset{every axis/.append style={
%font=\footnotesize,
line width=1 pt,
tick style={line width=.6pt}}}
\begin{tikzpicture} 
\begin{axis}[
clip mode=individual,
xmode=log,
height=8cm,
width=12cm,
ymax=.2,
ylabel={$\Delta$O.\,D.},
xlabel={Time delay, ps},
minor x tick num=4,
minor y tick num=4,
]
\addplot[green,mark=*] table [x index=0,y index=1] {1.csv};
\end{axis}
\begin{axis}[
clip mode=individual,
xmode=log,
height=8cm,
width=12cm,
hide x axis,
axis y line*=right,
]
\addplot[red,mark=square*] table [x index=0,y index=1] {2.csv};
\end{axis}
\end{tikzpicture}
\end{document}

通过这个例子,我当然看不到我的数据的负值。

答案1

您可以使用x coord trafo来转换 x 输入坐标:

\documentclass[tikz,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{mathptmx}
\usetikzlibrary{pgfplots.groupplots}
\usepackage{pgfplots}
\pgfplotsset{width=12cm,compat=1.9}
\usepackage{filecontents}
\begin{filecontents}{1.csv}
    -.5 0
    1   0.02
    2   0.03
    3 0.035
    4   0.04
    5   0.05
    10 0.06
    100 0.15
    200 0.17
    500 0.18
    1000    0.2
    15000   0.22
\end{filecontents}
\begin{filecontents}{2.csv}
    -2  -.5
    0   2
    1   5
    2 1
    3   7
    4   8
    5 9
    50  10
    250 15
    1000    20
    5000    14
    20000   12
\end{filecontents}
\begin{document}
\pgfplotsset{every axis/.append style={
%font=\footnotesize,
line width=1 pt,
tick style={line width=.6pt}}}
\begin{tikzpicture} 
\def\xBarrier{10}
\begin{axis}[
ylabel={$\Delta$O.\,D.},
xlabel={Time delay, ps},
minor x tick num=4,
minor y tick num=4,
x coord trafo/.code={%
    \pgfkeys{/pgf/fpu}%
    \pgfmathparse{#1 < \xBarrier ? #1 : (\xBarrier - ln(\xBarrier) +ln(#1))}%
},%
xtick={-6,-4,...,8,1e1,1e2,1e3,1e4,1e5},
xticklabel={%
    \pgfkeys{/pgf/fpu}%
    \pgfmathparse{\tick < \xBarrier ? \tick : 
        % the inverse of 'x coord trafo' is
        % X=exp(\tick + ln(10)-10)
        %
        % in order to show log10, we have to compute log(X)/log10
        % which is this:
        (\tick + ln(10)-10)/ln(10)
    }%
    \ifpgfmathfloatcomparison
        \pgfmathprintnumber\tick
    \else
        $10^{\pgfmathprintnumber\pgfmathresult}$%
    \fi
    \pgfkeys{/pgf/fpu=false}%
},
]
\addplot[green,mark=*] table [x index=0,y index=1] {1.csv};
\addplot[red,mark=square*] table [x index=0,y index=1] {2.csv};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

通常情况下,人们会使用

x coord inv trafo/.code={%
    \pgfkeys{/pgf/fpu}%
    \pgfmathparse{#1 < \xBarrier ? #1 : exp(#1 + ln(10)-10)}%
    \pgfkeys{/pgf/fpu=false}%
},%

撤消转换。但在这种情况下,采用xticklabel(生成 x 刻度标签的代码)更简单。我的采用实现了该逆转换并对其应用了 log10。然后它排版10^log10(inverse)

我认为这种方法无法生成微小的刻度线。

相关内容